前言
偷懒的一天。
两数之和(LeetCode1)
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hash_map = dict()
for i,num in enumerate(nums):
if target - num in hash_map:
return [hash_map[target-num],i]
hash_map[nums[i]] = i
return[]
三数之和(LeetCode15)
代码:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
ans = []
n = len(nums)
for i in range(n - 2):
x = nums[i]
if i > 0 and x == nums[i - 1]: # 跳过重复数字
continue
if x + nums[i + 1] + nums[i + 2] > 0: # 优化一
break
if x + nums[-2] + nums[-1] < 0: # 优化二
continue
j = i + 1
k = n - 1
while j < k:
s = x + nums[j] + nums[k]
if s > 0:
k -= 1
elif s < 0:
j += 1
else:
ans.append([x, nums[j], nums[k]])
j += 1
while j < k and nums[j] == nums[j - 1]: # 跳过重复数字
j += 1
k -= 1
while k > j and nums[k] == nums[k + 1]: # 跳过重复数字
k -= 1
return ans
四数之和(LeetCode18)
代码:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
ans = []
n = len(nums)
for a in range(n - 3): # 枚举第一个数
x = nums[a]
if a and x == nums[a - 1]: # 跳过重复数字
continue
if x + nums[a + 1] + nums[a + 2] + nums[a + 3] > target: # 优化一
break
if x + nums[-3] + nums[-2] + nums[-1] < target: # 优化二
continue
for b in range(a + 1, n - 2): # 枚举第二个数
y = nums[b]
if b > a + 1 and y == nums[b - 1]: # 跳过重复数字
continue
if x + y + nums[b + 1] + nums[b + 2] > target: # 优化一
break
if x + y + nums[-2] + nums[-1] < target: # 优化二
continue
# 双指针枚举第三个数和第四个数
c = b + 1
d = n - 1
while c < d:
s = x + y + nums[c] + nums[d] # 四数之和
if s > target:
d -= 1
elif s < target:
c += 1
else: # s == target
ans.append([x, y, nums[c], nums[d]])
c += 1
while c < d and nums[c] == nums[c - 1]: # 跳过重复数字
c += 1
d -= 1
while d > c and nums[d] == nums[d + 1]: # 跳过重复数字
d -= 1
return ans