LeetCode 15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]

输出:[[-1,-1,2],[-1,0,1]]

解释:

nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。

nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。

nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。

不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。

注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]

输出:[]

解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]

输出:[[0,0,0]]

解释:唯一可能的三元组和为 0 。

提示:

复制代码
3 <= nums.length <= 3000
-105 <= nums[i] <= 105

解题思路

  1. 先排序
  2. 双指针
  3. 比较等于0,去重
java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int len = nums.length;
        //1.先排序
        Arrays.sort(nums);

        List<List<Integer>> ans = new ArrayList<>();

        for(int i = 0; i < len-2; i++) {
            //当i位置大于0,i后面都大于0
            if(nums[i] > 0){
                return ans;
            }
            // 除了第一次,有重复的就说明重复了,直接跳过
            if(i > 0 && nums[i] == nums[i-1]) {
                continue;
            }

            int left = i + 1;
            int right = len - 1;
            
            while(left < right) {
                int num = nums[i] + nums[left] + nums[right];
                if(num == 0) {
                    //找重复的
                    while(left < right && nums[right] == nums[right-1]) {
                        right--;
                    }
                    while(left < right && nums[left] == nums[left+1]) {
                        left++;
                    }
                    ans.add(Arrays.asList(nums[i], nums[left], nums[right]));

                    left++;
                    right--;
                } else if(num > 0) {
                    right--;
                }else{
                    left++;
                }
            }
        }

        return ans;

    }
}

执行用时分布

29ms

击败86.66%使用 Java 的用户

消耗内存分布

50.20MB

击败42.15%使用 Java 的用户

相关推荐
XWalnut7 小时前
LeetCode刷题 day4
算法·leetcode·职场和发展
蒸汽求职7 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
摇滚侠7 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
楚国的小隐士8 小时前
为什么说Rust是对自闭症谱系人士友好的编程语言?
java·rust·编程·对比·自闭症·自闭症谱系障碍·神经多样性
AI成长日志8 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
旖-旎8 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法
青稞社区.8 小时前
ICLR‘26 Oral | 当 LLM Agent 在多轮推理中迷失时:T3 如何让强化学习重新学会主动推理
人工智能·算法·agi
春花秋月夏海冬雪8 小时前
代码随想录刷题 - 贪心Part1
java·算法·贪心·代码随想录
野生技术架构师8 小时前
2026年牛客网最新Java面试题总结
java·开发语言
环黄金线HHJX.8 小时前
Tuan符号系统重塑智能开发
开发语言·人工智能·算法·编辑器