给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
我一拿到这题,就想着暴力破解,三重循环,i<j<k,这样也不用担心遍历重复了,但是这题还要考虑,给定的数组 nums 里元素重复。
答案思路:双指针法,用双重循环,其中一层循环双指针,一个循环两个变量,时间复杂度就减少了。
第一层固定元素k,第二层循环指针 i,j
k<i<j
收获:
1.本题学到了双指针法,一个指向头,一个指向尾,A情况头指针++,B情况尾指针--,C情况 头指针++ 尾指针--;
2.学会了遍历List时候 去重的程序写法,看起来很舒服。
i += 1
while i < j and nums[i] == nums[i-1]: i += 1
注: 是 i == i-1 不是 i == i+1 : 因为是判断现在与过去,不是现在与将来。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3:
return None
nums.sort()
res = []
k = 0
while k < len(nums):
if nums[k] > 0 :
break
i,j = k+1,len(nums) - 1
while i < j:
curVal = nums[k] + nums[i] + nums[j]
if curVal == 0:
res.append([nums[k],nums[i],nums[j]])
i = i + 1
j -= 1
while i<j and nums[i] == nums[i-1]: i += 1
while i<j and nums[j] == nums[j+1] : j -= 1
elif curVal < 0:
i += 1
while i<j and nums[i] == nums[i-1]:i+=1
elif curVal > 0:
j -= 1
while i <j and nums[j] == nums[j+1]: j-=1
k+=1
while k<len(nums) and nums[k] == nums[k-1]: k+=1
return res