15. 三数之和[中等]✅

15. 三数之和

题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

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

思路: 采用 排序 + 双指针。

核心思想:

先排序,固定一个数,再用左右指针寻找另外两个数,使三数之和为 0。

具体过程:

  1. 先对数组排序,并跳过重复的 nums[i]。

  2. 固定 nums[i],设置 j=i+1、k=n-1。

  3. 如果三数之和大于 0,k--;小于 0,j++。

  4. 等于 0 时加入答案,并跳过重复元素。

时间复杂度:O(n²)

空间复杂度:O( log n)(排序所需)

复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        int n = nums.length;
        for (int i = 0; i < n - 2; i++) {
            int x = nums[i];
            if (i > 0 && x == nums[i - 1]) continue; // 跳过重复数字
            if (x + nums[i + 1] + nums[i + 2] > 0) break; // 优化一
            if (x + nums[n - 2] + nums[n - 1] < 0) continue; // 优化二
            int j = i + 1;
            int k = n - 1;
            while (j < k) {
                int s = x + nums[j] + nums[k];
                if (s > 0) {
                    k--;
                } else if (s < 0) {
                    j++;
                } else { // 三数之和为 0
                    ans.add(List.of(x, nums[j], nums[k]));
                    for (j++; j < k && nums[j] == nums[j - 1]; j++); // 跳过重复数字
                    for (k--; k > j && nums[k] == nums[k + 1]; k--); // 跳过重复数字
                }
            }
        }
        return ans;
    }
}

可参考思路讲解 【leetcode hot100】 15、三数之和 | 双指针(动画讲解)_哔哩哔哩_bilibili

相关推荐
nice_lcj52010 小时前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
罗西的思考10 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
学长毕设11 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
聪明的笨猪猪12 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设12 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
好悬给我拽开线14 小时前
ZILOT 论文解析
算法
SL_staff15 小时前
私有化低代码:面向强监管行业的可控数字化实践
java·低代码
饮水桶_T15 小时前
JAVA IO流笔记
开发语言·数据结构·算法
三翼鸟数字化技术团队15 小时前
高性能存储引擎RocksDB:原理与Java生态实践
java
SL_staff16 小时前
JVS-APS有限产能建模的七个刚性支点:面向产线真实约束的技术实现解析
java·开源·全栈