力扣十五;三数之和

题目:三数之和

题目描述:

难度中等

给你一个包含 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 协议 ,转载请注明出处!