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

所以可以直接结束循环

相关推荐
2601_970703832 分钟前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02142 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi1 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang1 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!2 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
维克兜率天3 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法
罗西的思考3 小时前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝4 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
揽星河..4 小时前
【C语言】分支和循环
c语言·c++·算法