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 的用户

相关推荐
IT 行者16 分钟前
Spring Security 6.x 迁移到 7.0 的完整步骤
java·spring·oauth2
JIngJaneIL19 分钟前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
东东的脑洞23 分钟前
【面试突击二】JAVA基础知识-volatile、synchronized与ReentrantLock深度对比
java·面试
LYFlied27 分钟前
【每日算法】LeetCode 153. 寻找旋转排序数组中的最小值
数据结构·算法·leetcode·面试·职场和发展
唐装鼠28 分钟前
rust自动调用Deref(deepseek)
开发语言·算法·rust
川贝枇杷膏cbppg1 小时前
Redis 的 AOF
java·数据库·redis
吃喝不愁霸王餐APP开发者1 小时前
Java后端系统对接第三方外卖API时的幂等性设计与重试策略实践
java·开发语言
TG:@yunlaoda360 云老大1 小时前
华为云国际站代理商的CBR主要有什么作用呢?
java·网络·华为云
ytttr8731 小时前
MATLAB基于LDA的人脸识别算法实现(ORL数据库)
数据库·算法·matlab
速易达网络2 小时前
基于Java TCP 聊天室
java·开发语言·tcp/ip