【刷穿 LeetCode】15. 三数之和(中等)

简介: 【刷穿 LeetCode】15. 三数之和(中等)

点击 这里 可以查看更多算法面试相关内容~


题目描述


给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。


注意:答案中不可以包含重复的三元组。


示例 1:


输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
复制代码


示例 2:


输入:nums = []
输出:[]
复制代码


示例 3:


输入:nums = [0]
输出:[]
复制代码


提示:


  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105


排序+双指针解法


对数组进行排序,使用三个指针 ijk 分别代表要找的三个数。


  1. 通过枚举 i 确定第一个数,另外两个指针 jk 分别从左边 i + 1 和右边 n - 1 往中间移动,找到满足 nums[i] + nums[j] + nums[k] == 0 的所有组合。
  2. jk 指针的移动逻辑,分情况讨论 sum = nums[i] + nums[j] + nums[k]
  • sum > 0:k 左移,使 sum 变小
  • sum < 0:j 右移,使 sum 变大
  • sum = 0:找到符合要求的答案,存起来


由于题目要求答案不能包含重复的三元组,所以在确定第一个数和第二个数的时候,要跳过数值一样的下标(在三数之和确定的情况下,确保第一个数和第二个数不会重复,即可保证三元组不重复)。


class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        List<List<Integer>> ans = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1, k = n - 1; j < k; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                while (k - 1 > j && nums[i] + nums[j] + nums[k - 1] >= 0) k--;
                if (nums[i] + nums[j] + nums[k] == 0) {
                    List<Integer> tmp = new ArrayList<>();
                    tmp.add(nums[i]);
                    tmp.add(nums[j]);
                    tmp.add(nums[k]);
                    ans.add(tmp);
                }
            }
        }
        return ans;
    }
}
复制代码


  • 时间复杂度:排序的复杂度为 O(log⁡n)O(\log{n})O(logn),对于每个 i 而言,最坏的情况 jk 都要扫描一遍数组的剩余部分,复杂度为 O(n2)O(n ^ 2)O(n2)。整体复杂度为 O(n2)O(n ^ 2)O(n2)
  • 空间复杂度:O(n2)O(n ^ 2)O(n2)


最后


这是我们「刷穿 LeetCode」系列文章的第 No.15 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


由于 LeetCode 的题目随着周赛 & 双周赛不断增加,为了方便我们统计进度,我们将按照系列起始时的总题数作为分母,完成的题目作为分子,进行进度计算。当前进度为 15/1916


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:Github 地址 & Gitee 地址


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和一些其他的优选题解。


#算法与数据结构


#LeetCode题解


#算法面试


相关文章
|
监控 关系型数据库 MySQL
MySQL 5.7在高并发下性能劣化问题的详细剖析
TL;DR MySQL 5.7高并发读写混合场景下rt飙升,业务系统大量超时报错。本文总结了阿里业务场景下遇到的坑,剖析问题背后的原因,帮助读者更好的理解MySQL内核原理,降低升级MySQL 5.7的风险。
10046 0
|
12月前
|
数据可视化 搜索推荐 项目管理
有没有好用的待办事项清单软件? —— 一文带你了解
在快节奏的现代生活中,待办事项清单成为提高效率、管理时间的重要工具。它不仅帮助记录任务,还能清晰规划时间和精力,确保重要事项优先处理。本文介绍了待办事项清单的应用场景及四款推荐软件:板栗看板、Todoist、Wunderlist 和 Trello,并分析了它们的优缺点,帮助用户选择合适的工具。
有没有好用的待办事项清单软件? —— 一文带你了解
|
12月前
|
关系型数据库 MySQL 数据库
mysql 里创建表并插入数据
【10月更文挑战第5天】
649 1
|
C语言
C语言中的条件运算符和条件表达式详解
C语言中的条件运算符和条件表达式详解
1264 0
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【9月更文挑战第31天】本文旨在通过浅显易懂的语言和直观的比喻,为初学者揭开深度学习中卷积神经网络(CNN)的神秘面纱。我们将从CNN的基本原理出发,逐步深入到其在图像识别领域的实际应用,并通过一个简单的代码示例,展示如何利用CNN进行图像分类。无论你是编程新手还是深度学习的初学者,这篇文章都将为你打开一扇通往人工智能世界的大门。
|
12月前
|
缓存 Java 数据库
JAVA分布式CAP原则
JAVA分布式CAP原则
191 0
|
运维 微服务
业务系统架构实践问题之什么是配置态和运行态的解耦
业务系统架构实践问题之什么是配置态和运行态的解耦
254 0
|
XML SQL Java
springboot 项目启动报Has been loaded by XML or SqlProvider, ignoring the injection of the SQL的错误的解决方案
springboot 项目启动报Has been loaded by XML or SqlProvider, ignoring the injection of the SQL的错误的解决方案
1310 0
|
JavaScript Java 测试技术
基于微信小程序的汽车维修管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的汽车维修管理系统的设计与实现(源码+lw+部署文档+讲解等)
224 0
|
Kubernetes Unix 容器
关机了 cron job 怎么办,开机后还会再执行吗?(上)
关机了 cron job 怎么办,开机后还会再执行吗?
354 1