15. 三数之和
https://leetcode-cn.com/problems/3sum/
解法一:
常规思路是用三个游标i,j,k遍历整个数组,找出所有的三三组合,看是否满足。然而这样会有重复。
改进:先排序,对每个找到的组合(i,j,k)各自往后搜寻,跳过相同的元素即可 有点借鉴two sum的做法,反向求之。i遍历整个数组,先设一个target=nums[i],令设两个游标front = i+1,back = len(nums)-1用这两个数的和与target比较,然后进行调整,直到找到为止。找到后跳过相等的数,防止重复。 此外还需注意,py的for循环与c++的for循环略有不同,主要是i不能在循环体中改变,(见https://blog.csdn.net/u012033124/article/details/80224024,第11条)因此对i的循环改成while语句
为何i的范围是0~n-1?不担心front=i+1越界?
因为有front < back限制。且其实i遍历到n-2就可以停止了。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
nums.sort()
i = 0
while i < len(nums):
target = -nums[i]
front, back = i+1, len(nums)-1
while front < back:
tmp_sum = nums[front] + nums[back]
if tmp_sum < target:
front += 1
elif tmp_sum > target:
back -= 1
else: #找到
triple = [nums[i], nums[front], nums[back]] #创建三元组
res.append(triple)
while front < back and nums[front] == triple[1]: #跳过与triple[1]重复的
front += 1
while front < back and nums[back] == triple[2]: #跳过与triple[2]重复的
back -= 1
while i+1 < len(nums) and nums[i+1] == nums[i]: #跳过与triplet[0]重复的
i += 1
i += 1 #while循环
return res
最后更新于