LeetCode 15三数の和3 Sum Python
1802 ワード
ハッシュ表のLeetCodeについて問題のノートを作って、Pythonは実現します
15.三数の和3 Sum
LeetCodeCN第15題リンク
第一の方法:三重遍歴、時間複雑度
第3の方法:まず昇順に並べ替えて、何度も繰り返して、それから後ろの新しい配列の中で2つのポインタで3つの数の和が0であるかどうかを検査して、0より大きいと右のポインタは左へ行って、0より小さいと左のポインタは右へ行きます.
下一題:1.2つの数の和Two Sum
15.三数の和3 Sum
LeetCodeCN第15題リンク
第一の方法:三重遍歴、時間複雑度
O(n^3)
第2の方法:2重の遍歴で最初の2つの数を取得し、3番目の数-(a+b)
が存在するかどうかを問い合わせる.ハッシュ表set()
でclass Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums) < 3:
return []
nums.sort()
res = set()
for i, v in enumerate(nums[:-2]) :
if i >= 1 and v == nums[i-1]:
continue
d = {}
for x in nums[i+1:]:
if x not in d:
d[-(v+x)] = 1
else:
res.add((v, -(v+x), x))
return map(list, res)
第3の方法:まず昇順に並べ替えて、何度も繰り返して、それから後ろの新しい配列の中で2つのポインタで3つの数の和が0であるかどうかを検査して、0より大きいと右のポインタは左へ行って、0より小さいと左のポインタは右へ行きます.
class Solution(object):
def threeSum(self, nums):
if len(nums) < 3:
return []
nums.sort()
res = []
for i, x in enumerate(nums[:-2]):
if i >= 1 and x == nums[i-1]:
continue
l, r = i+1, len(nums)-1
while l < r:
s = nums[i] + nums[l] + nums[r]
if s < 0:
l += 1
elif s > 0:
r -= 1
else:
res.append((nums[i], nums[l], nums[r]))
while l < r and nums[l] == nums[l+1]:
l += 1
while l < r and nums[r] == nums[r-1]:
r -= 1
l += 1
r -= 1
return res
下一題:1.2つの数の和Two Sum