力扣十五;三数之和
题目:三数之和
题目描述:
难度中等
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路:
先排序,再用for从0到length-2中选一个k值,选定k值之后把k后面的数用对撞指针从k+1到length-1用对撞指针求一个值等于-num[k],记得判断left右边和right左边的值是否和自己相同
一直出现这个错误,检查之后发现最后少个大括号
Line 40: Char 6: syntax error: unexpected __helper__, expecting ( (solution.go)
func threeSum(nums []int) [][]int {
if len(nums)<3{
return nil
}
//先排序
sort.Ints(nums)
length:=len(nums)
var res [][]int
//确认好一个数之后用对撞指针
for k:=0;k<length-2;k++{
if nums[k]>0 {
break
}
if k>0&&nums[k]==nums[k-1]{
continue
}
left:=k+1
right:=length-1
for left<right{
sum := nums[left]+nums[right]+nums[k]
//要判断left和它右边的值一不一样,right的值和它左边的一不一样
if sum>0{
for right=right-1;right>left &&nums[right]==nums[right+1];right-- {}
}else if sum<0 {
for left=left+1;right>left &&nums[left]==nums[left-1];left++ {}
}else{
res = append(res,[]int{nums[k],nums[left],nums[right]})
for right=right-1;right>left &&nums[right]==nums[right+1];right-- {}
for left=left+1;right>left &&nums[left]==nums[left-1];left++ {}
}
}
}
return res
}
代码效率:
执行用时:40 ms, 在所有 Go 提交中击败了52.12%的用户
内存消耗:7.3 MB, 在所有 Go 提交中击败了42.04%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!