题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
方法分析
1.暴力法:a.b.c->3层循环 O(n^3)
2.c=-(a+b) =>set() O(1)<c查询>, O(n^2)
3.数组排序(快排)->O(nlogn)
3.1 loop(a),b从起点开始,c从末尾开始,再用a+b+c大于小于0来判断b和c右移还是左移
Python实现
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums)<=2:return []
res = []
num_len = len(nums)
nums.sort()
# 保留两位留作判断
for i,v in enumerate(nums[:-2]):
if i>0 and v == nums[i-1]:
continue
l,r = i+1,num_len-1
while l<r :
target_n = nums[l]+nums[r]+v
if target_n >0:r-=1
elif target_n<0:l+=1
else:
res.append([v,nums[l],nums[r]])
while l<r and nums[l]==nums[l+1]:
l+=1
while l<r and nums[r]==nums[r-1]:
r-=1
r-=1
l+=1
return res
Golang实现
func threeSum(nums []int) [][]int {
var res [][]int
if len(nums) <= 2 {
return res
}
num_len := len(nums)
sort.Ints(nums)
for i, v := range nums[:num_len-2] {
if i > 0 && v==nums[i-1] {
continue
}
l := i + 1
r := num_len - 1
for l < r {
target_n := nums[l] + nums[r]+v
switch {
case target_n > 0:
r -= 1
case target_n < 0:
l += 1
case target_n == 0:
res = append(res, []int{v, nums[l], nums[r]})
for l < r && nums[l] == nums[l+1] {
l += 1
}
for l < r && nums[r] == nums[r-1] {
r -= 1
}
r -= 1
l += 1
}
}
}
return res
}