Leetcode 15. 三数之和

题目描述

解法思路

  1. 要求3元组不重复 ,因此考虑先排序,采用sort.Ints(nums)对slice进行排序。排序之后对于满足要求的三元组{a, b, c},有a <= b <= c,可以考虑从前向后进行三重遍历找到满足要求的所有不重复三元组,时间复杂度为o(N3)o(N^3)o(N3)。
  2. 为了降低时间复杂度,考虑优化三重遍历。可以发现,对于固定的a,在进行第二轮遍历时对于每个b,有c=−a−bc = -a - bc=−a−b,即只需要从后向前(从大到小)找目标c即可,并且对于固定的a,在进入第二轮遍历之前将c的位置初始化为n - 1,如果存在满足要求的{a, b, c},那么对于b之后的元素b',b' > b,那么如果存在满足要求的{a, b', c'},一定有c' < c,那么只需要继续从上一个c往前找就可以,即二、三轮遍历可以合并为一轮。

代码实现

go 复制代码
func threeSum(nums []int) [][]int {
    n := len(nums)
    sort.Ints(nums)
    res := make([][]int, 0)

    for i := 0; i < n; i++ {
        if i > 0 && nums[i] == nums[i - 1] {
            continue
        }
        k := n - 1
        for j := i + 1; j < n; j++ {
            if j > i + 1 && nums[j] == nums[j - 1] {
                continue
            }
            for {
                if nums[i] + nums[j] + nums[k] < 0 || k <= j{
                    break
                }
                if nums[i] + nums[j] + nums[k] == 0 {
                    res = append(res, []int{nums[i], nums[j], nums[k]})
                    break
                }
                k--
            }
        }
    }

    return res
}
相关推荐
变量未定义~18 分钟前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗21 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH29 分钟前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜31 分钟前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu39 分钟前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月1 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
To_OC9 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode