LeetCode 15. 三数之和

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

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

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

示例 1:

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

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

解释:

nums0 + nums1 + nums2 = (-1) + 0 + 1 = 0 。

nums1 + nums2 + nums4 = 0 + 1 + (-1) = 0 。

nums0 + nums3 + nums4 = (-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 的用户

相关推荐
apcipot_rain8 分钟前
C++转Java日记(10)
java·开发语言
简 洁 冬冬1 小时前
泛型方法写法全面辨析:从「能编译」到「能跑」到「能用」
java·泛型
YLCHUP1 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
LGL6030A1 小时前
Java学习历程31——初识Spring Boot
java·spring boot·学习
思麟呀1 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落3 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Lansonli3 小时前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark
budingxiaomoli3 小时前
Spring AOP
java·spring·java-ee
特立独行的猫A3 小时前
Ionic + 仓颉语言的 cj-tauri 开发框架实战:开发精美移动端 APP
java·后端·python
Pniubi3 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表