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

所以可以直接结束循环

相关推荐
稚南城才子,乌衣巷风流29 分钟前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法
hold?fish:palm35 分钟前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle1 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木1 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b1 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨2 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
啦啦啦啦啦zzzz2 小时前
算法:回溯算法
c++·算法·leetcode
IT探索2 小时前
Linux 查找文件指令总结
linux·算法
Lumos1863 小时前
51单片机从零到实战(完结)——后续学习路线建议
算法