https://leetcode.com/problems/3sum/
题解
此题解法我参考了https://leetcode.com/problems/3sum/discuss/7402/Share-my-AC-C%2B%2B-solution-around-50ms-O(N*N)-with-explanation-and-comments,感觉比较容易理解。
即遍历每个数,寻找另外两个数满足条件,使用类似快速排序那样的方法。
需要注意的是对同一基准数,找到一组解后,跳过重复元素:
front += 1
back -= 1
while(front < back and nums[front] == nums[front-1]):
front += 1
while(front < back and nums[back] == nums[back+1]):
back -= 1
对两个基准数相等,也要跳过:
if i > 0 and nums[i] == nums[i-1]:
continue
AC代码
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
nums.sort()
for i in range(len(nums)):
if i > 0 and nums[i] == nums[i-1]:
continue
target = -1 * nums[i]
front = i + 1
back = len(nums) - 1
while(front < back):
if nums[front] + nums[back] < target:
front += 1
elif nums[front] + nums[back] > target:
back -= 1
else:
# res.append([i, front, back])
res.append([nums[i], nums[front], nums[back]])
front += 1
back -= 1
while(front < back and nums[front] == nums[front-1]):
front += 1
while(front < back and nums[back] == nums[back+1]):
back -= 1
return res