2.三数之和-双指针法

2022.03.03

if temp==0{}里面的两个去重for循环,容易把n2==nums[ l]写成 num[l]==num[l-1]

if n1>0 去除大于零的数据集,容易把n1>0写成n1>=0

算法流程:

避免出现重复解

令左指针 L=i+1

右指针 R=n-1,当 L<RL<R 时,执行循环:

当 nums[i]+nums[L]+nums[R]==0

执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R 移到下一位置,寻找新的解 若和大于 0,说明 nums[R] 太大,R左移 若和小于 0,说明 nums[L] 太小,L 右移

func threeSum(nums []int) [][]int {
    result:=make([][]int,0)
    sort.Ints(nums)
    numsLength:=len(nums)

    for i:=0;i<numsLength-2;i++{
        n1:=nums[i]
        //如果n1大于0,不需要往下执行,因为不可能有三数之和等于零
        if n1>0{
            break
        }
        //如果i大于0,但是和之前的数相同,i继续累加
        if i>0{
            if n1==nums[i-1]{
                continue
            }
        }
        l,r:=i+1,numsLength-1

        for l<r{
            n2,n3:=nums[l],nums[r]
            temp:=n1+n2+n3
            if temp==0{
                result=append(result,[]int{n1,n2,n3})
                for l<r&&n2==nums[l]{
                    l++
                }
                for l<r&&n3==nums[r]{
                    r--
                }
            }else{
                if temp>0{
                    r--
                }else{
                    l++
                }
                
            }
        }
        
    }
    return result

}

Last updated