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;
}

nums[i] > 0

→ 后面所有数都 ≥ nums[i] > 0

→ 三个正数不可能等于 0

所以可以直接结束循环

相关推荐
计算机安禾18 分钟前
【c++面向对象编程】第26篇:对象的内存模型:成员变量与成员函数的存储分离
开发语言·c++·算法
贩卖黄昏的熊26 分钟前
陕西省ICPC省赛总结
算法
jieyucx31 分钟前
Go 语言进阶:构造函数、父子结构体与组合复用详解
服务器·算法·golang·继承·结构体·构造函数
澈20731 分钟前
滑动窗口算法:双指针高效解题秘籍
数据结构·c++·算法
渣渣苏1 小时前
硬核拆解 HNSW:亿级向量如何实现毫秒级召回?(上篇)
人工智能·算法·支持向量机·ai·向量数据库·hnsw·智能体
如竟没有火炬1 小时前
字符串相乘——int数组转字符串
开发语言·数据结构·python·算法·leetcode·深度优先
吃好睡好便好1 小时前
在Matlab中绘制三维等高线图
开发语言·python·学习·算法·matlab·信息可视化
项目申报小狂人1 小时前
一种使用双向长短时记忆网络结合鲸鱼优化算法的类火星矿物元素精确定量分析模型
人工智能·算法·lstm
wangjialelele1 小时前
【SystemV】基于建造者模式的信号量
linux·c语言·c++·算法·建造者模式
Aaron15882 小时前
RFSOC+VU13P/VU9P+GPU多通道同步一体化解决方案
人工智能·嵌入式硬件·算法·matlab·fpga开发·硬件架构·基带工程