1. 两数之和
遍历数组的同时,使用字典(哈希表)记录数对应的索引,对于每一个数nums[i],判断 target-nums[i]是否在字典中,找到一个即返回。若列表中的与元素有重复也可这样处理,因为遍历的过程中,不包含当前元素。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
if n < 2:
return []
res_dict = {}
for i in range(n):
val = target - nums[i]
if val in res_dict:
idx = res_dict[val]
return [i,idx]
else:
res_dict[nums[i]] = i
# 存在相同元素,会覆盖。这个不影响结果
return []
15. 三数之和
class Solution:
def threeSum(self, nums):
n = len(nums)
if n < 3:
return []
nums.sort()
res = []
for i in range(n):
if i > 0 and nums[i] == nums[i - 1]:
continue
target = - nums[i]
k = n - 1
for j in range(i + 1, n):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
while k > j and nums[k] + nums[j] > target:
k -= 1
if k == j:
break
if nums[k] + nums[j] == target:
tmp = [nums[i], nums[j], nums[k]]
res.append(tmp)
return res
18. 四数之和
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
n = len(nums)
if n < 4: return []
nums.sort()
res = []
for i in range(n):
if i > 0 and nums[i] == nums[i - 1]:
continue
for j in range(i + 1, n):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
val = target - nums[i] - nums[j]
l = n - 1
for k in range(j + 1, n):
if k > j + 1 and nums[k] == nums[k - 1]:
continue
while l > k and nums[l] + nums[k] > val:
l -= 1
if l == k:
break
if nums[l] + nums[k] == val:
tmp = [nums[i], nums[j], nums[k], nums[l]]
res.append(tmp)
return res
三数之和宇四数之和的问题解决方法相似,需要返回所有不重复的结果:
- 先排序
- 相邻的相同元素只考虑一个,避免重复
- 将最里面的两层循环替换为双指针法