two sum
思路:
一次哈希,边哈希边检测另一个数字是否已经在dict中(二次哈希也可)
时间复杂度O(n) 空间复杂度O(n)
PS: 其实还可以先排序再双指针(沿用3sum的思路),这样操作时间复杂度O(nlogn)空间复杂度O(1)
import copy
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
d = {}
for i in range(len(nums)):
complement = target - nums[i]
# hash的时候检测另一个数字是否已存在,即使是重复数字还未覆盖也不影响
if complement in d.keys():
return [d[complement], i]
d[nums[i]] = i
return -1
three sum
思路:
- 先排序
- 第一个数字从头到尾扫描,
- 剩下两个数双指针得到。
时间复杂度 O(n^2) 空间复杂度O(1)
注意:题目中要求结果不重复,所以需要加上重复数字判断
(做的时候也有考虑过双指针+二分查找最后一个数,但是这样哪个指针移动无法判断)
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
res = []
if len(nums) < 3 or nums[0]>0:
return []
for i in range(len(nums)-2):
# 防止重复重复数字出现
if i != 0 and nums[i] == nums[i-1]:
continue
a = nums[i]
l = i + 1
r = len(nums) - 1
while l < r:
if nums[l] + nums[r] == 0 - a: