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

相关推荐
武帝为此21 分钟前
【数据清洗缺失值处理】
python·算法·数学建模
Halo_tjn1 小时前
Java 基于字符串相关知识点
java·开发语言·算法
梦想的颜色1 小时前
java 利用redis来限制用户频繁点击
java·开发语言
念越1 小时前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
黎阳之光2 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先
PH = 72 小时前
OverlayFS联合文件系统使用示例
java·linux·服务器
CappuccinoRose3 小时前
回溯法 - 软考备战(四十三)
算法·排列组合·路径·n皇后·子集·解数独·岛屿
AC赳赳老秦3 小时前
OpenClaw进阶技巧:批量修改文件内容、替换关键词,解放双手
java·linux·人工智能·python·算法·测试用例·openclaw
Java小白笔记3 小时前
OpenClaw 实战方法论
java·开发语言·人工智能·ai·全文检索·ai编程·ai写作