力扣答题(3)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
示例:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
思路:
暴力破解肯定会超时,用多指针方法比较有效。
1、对数组从小到大进行排序。
2、分别用三个指针指向三个数,称为第一、二、三指针。移动的规则是:第一指针从数组的第一个数,移动到倒数第三个数;第二指针初始状态紧随第一指针之后,第三指针初始状态指向数组最后一个数(最大数)。
3、第二指针和第三指针对向移动,不重叠不交叉。
4、判断三数之和大于0,移动第三指针,小于0移动第二指针,等于0同时移动第二、三指针。
5、按3、4步骤移动第二、第三指针不满足条件后,再移动第一指针,重新确定第二、第三指针的初始位置。
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
result = []
for i in range(len(nums) - 2):
if nums[i] > 0:
break
if i != 0 and nums[i] == nums[i - 1]:
continue
k = 0
for j in range(i + 1, len(nums)-1):
if j != i+1 and nums[j] == nums[j-1]:
continue
while len(nums) - 1 - k > j:
if len(nums)-1-k != len(nums)-1 and nums[len(nums)-1-k] == nums[len(nums)-k]:
k += 1
continue
p = nums[i] + nums[j] + nums[len(nums) - 1 - k]
if p == 0:
# if [nums[i], nums[j], nums[len(nums) - 1 - k]] not in result:
result.append([nums[i], nums[j], nums[len(nums) - 1 - k]])
k += 1
break
elif p > 0:
k += 1
else:
break
return result