15. 三数之和
在做两数之和时候,用到了哈希表,当遍历数组的时候,判读target-num的值是否存在在哈希表中,若不存在,则添加到哈希表中,若存在,则表示该数组中存在两数之和等于target的两个数。
三数之和考虑的是先排序在双指针的方法。该题特别要注意细节。它的时间复杂度为排序的nlogn,加上遍历数组的N,还有双指针遍历的N,所以时间复杂度为nlogn+n^2
要注意几个点:
①:注意查重,遍历数组的时候,如果两个相邻的数值相等,则需要跳过该数,但是有特殊情况。例如[0,0,0],所以要当i>0 and nums[i - 1] == nums[i]:才continue。
②:如果数组中没有三个元素,或者在排序后遍历一个元素大于0了,则可以return 结果了。
选定一个数后,令l=i+1,r=len(nums)-1,则判断nums[i]+nums[l]+nums[r]==0?
代码如下:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
length = len(nums)
if not nums or length < 3:
return []
nums.sort()
for i in range(length):
if nums[i] > 0:
return res
if i>0 and nums[i-1] == nums[i]:
continue
l = i+1
r = length-1
while(l<r):
if(nums[i]+nums[l]+nums[r]==0):
res.append([nums[i],nums[l],nums[r]])
while(l<r and nums[l+1]==nums[l]):
l+=1
while(l<r and nums[r-1]==nums[r]):
r-=1
l+=1
r-=1
elif(nums[i]+nums[l]+nums[r]>0):
r-=1
else:
l+=1
return res
浙公网安备 33010602011771号