15.三数之和

题目:三数之和 点击跳转

文章目录


题目描述

复制代码
三数之和:固定一个数 → 剩下变成"两数之和"

排序 + 固定一个数 + 双指针 + 去重

题目解答

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
        		//优化
            if (nums[i] > 0) {
                break;
            }
            //nums.length-2
            //去重1
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int left = i+1;
            int right = nums.length-1;
            while(left<right){
                int sum = nums[i] + nums[left] + nums[right];
                if(sum == 0){
                    res.add(Arrays.asList(nums[i],nums[left],nums[right]));
                    //去重2
                    while(left<right && nums[left] == nums[left+1]){
                        left++;
                    }
                    //去重3
                    while(left<right && nums[right] == nums[right-1]){
                        right--;
                    }
                    //注意移动
                    left++;
                    right--;
                }else if(sum<0){
                    left++;
                }else{
                    right--;
                }
            }
        }
        return res;
    }
}

1 排序

java 复制代码
Arrays.sort(nums);

为双指针提供条件

数组有序 → 可以通过 left++ / right-- 控制大小

为去重提供条件

重复元素会挨在一起

2 固定第一个数i

java 复制代码
for(int i=0;i<nums.length-2;i++)

枚举第一个数

java 复制代码
nums[left] + nums[right] = -nums[i]

3 双指针

java 复制代码
int left = i+1;
int right = nums.length-1;

if(sum == 0) → 找到答案

if(sum < 0) → left++

if(sum > 0) → right--

4 去重

去重1:i去重

java 复制代码
if(i>0&&nums[i]==nums[i-1]){
    continue;
}

去重2:left去重

java 复制代码
while(left<right && nums[left] == nums[left+1]){
    left++;
}

去重3:right去重

java 复制代码
while(left<right && nums[right] == nums[right-1]){
    right--;
}

5 剪枝优化

java 复制代码
if (nums[i] > 0) {
    break;
}

numsi > 0

→ 后面所有数都 ≥ numsi > 0

→ 三个正数不可能等于 0

所以可以直接结束循环

相关推荐
Java_2017_csdn15 小时前
ComplexKeysShardingAlgorithm 小结
java·大数据·算法
海梨花15 小时前
快手面试高频算法题
java·算法·面试
lqqjuly15 小时前
超分辨率算法深度解析(Super-Resolution Algorithms)
算法
嵌入式老牛17 小时前
液晶段码(米/日字格)识别—倾斜校正
opencv·算法·仿射变换
luj_176817 小时前
残熵算法:风险缓冲与效率优化的融合
c语言·开发语言·网络·经验分享·算法
oddsand118 小时前
pgvector 三大相似度算法
人工智能·算法·机器学习
运筹vivo@18 小时前
LeetCode 2574. 左右元素和的差值
算法·leetcode·职场和发展·每日一题
计算机安禾18 小时前
【数据库系统原理】第4篇:关系数据结构的形式化定义:域、笛卡尔积与关系模式
数据结构·数据库·算法
手写码匠18 小时前
手写 DeepSeek 推理引擎优化:从 FP16 到 INT4 的量化加速实战
人工智能·深度学习·算法·aigc
GuWenyue18 小时前
LeetCode 76 最小覆盖子串|JS 滑动窗口标准解法
前端·算法·面试