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

所以可以直接结束循环

相关推荐
贾斯汀玛尔斯2 小时前
每天学一个算法--一致性哈希(Consistent Hashing)
算法·哈希算法
无限进步_3 小时前
C++ 继承机制完全解析:从基础原理到菱形继承问题
java·开发语言·数据结构·c++·vscode·后端·算法
superior tigre3 小时前
45 跳跃游戏2
算法·leetcode·游戏
不知名的忻3 小时前
并查集(QuickUnion)
java·数据结构·算法·并查集
leo__5203 小时前
基于时延的麦克风声源定位 - C实现
c语言·开发语言·算法
攻防_SRC3 小时前
面向分组密码差分故障分析的属性推导与验证平台
人工智能·算法·机器学习
likerhood3 小时前
Java实现选择题选项乱序算法
java·开发语言·算法
小鱼~~3 小时前
最小二乘&均方误差MSE&平均绝对误差MAE
python·算法·机器学习
田梓燊3 小时前
力扣:138.随机链表的复制
算法·leetcode·链表