力扣 || 15.三数之和--Golang

知识点:数组
难度:中等

题目:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

**方法:**三指针法(在实现中解释)
Golang实现

func threeSum(nums []int) [][]int {
    //1、先排序
    sort.Ints(nums)
    //构造输出三元组的集合
    result := [][]int{}

    //2、三指针法:三个指针指向三个数a,b,c
    //将a+b+c=0转化为b+c=-a
    //从排好序的最左边的数开始,
    //令其等于a,然后依次循环,令a等于其他数
    //在每一轮循环中,把a看成定值,寻找b,c,使得b+c=-a
    //这时在每一轮之内,相当于求解两数之和问题
    for i := 0; i < len(nums)-1; i++ {
        
        //如果最小的数a都大于0,则不存在这样的三元组
        //退出循环
        if i > 0 && nums[i] == nums[i-1] {
            continue
        }
        
        //在每一轮中
        //使b等于大于a的最小的数,c等于大于a的最大的数
        j := i + 1
        z := len(nums) - 1
        for z > j {
            b := nums[j]
            c := nums[z]
            //判断a+b+c的值,若大于0.则大数c往左移动
            if nums[i]+b+c > 0 {
                z--
            //判断a+b+c的值,若小于0.则小数b往右移动
            } else if nums[i]+b+c < 0 {
                j++
            } else {
                //如果a+b+c既不大于0,也不小于0,即为等于0
                //这里即找到了满足条件的三元组
                item := []int{nums[i], b, c}
                result = append(result, item)
                //跳过重复数据
                for j < z && nums[j] == nums[j+1] {
                    j++
                }
                for j < z && nums[z] == nums[z-1] {
                    z--
                }

                j++
                z--
            }
        }
    }
    return result
}

执行:
在这里插入图片描述
复杂度分析:
时间复杂度:O(n*n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值