LeetCode Hot100 15.三数之和

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

15. 三数之和 - 力扣(LeetCode)

思路

首先对nums排序,每次先固定一个numsi,然后在i后面的部分使用双指针l和r进行搜索,如果numsi+numsl+numsr<0,那么l右移,否则r左移

需要保证i,l,r都被去重过,所以在每次迭代一个新的i时,跟之前处理过的numsi-1对比,如果相等那么跳过此次迭代;每次找到一个满足条件的i,l,r时,对l和r去重,跟还未处理过的numsl+1,numsr-1对比,相同则跳过。

代码

html 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0; i < nums.length-2; i++){
            if(i>0&&nums[i]==nums[i-1]) continue;
            int l=i+1,r=nums.length-1;
            while(l<r){
                if(nums[l]+nums[r]==-nums[i]){
                    ans.add(List.of(nums[l],nums[r],nums[i]));
                    while(l<r&&nums[l]==nums[l+1]) l++;
                    while(l<r&&nums[r]==nums[r-1]) r--;
                    l++;
                    r--;
                }
                else if(nums[l]+nums[r]<-nums[i]){
                    l++;
                }
                else{
                    r--;
                }
            }
        }
        return ans;
    }
}
相关推荐
mCell8 小时前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
wuyk55510 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无10 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
不会代码的小猴10 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
碳基猿11 小时前
案例|普通内容创作者如何利用 CreBee 打造个人内容创业系统:从一个账号到多平台内容资产矩阵
职场和发展·新媒体运营·创业创新·程序员创富·新媒体矩阵
203号居民12 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真14 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
evans在进步15 小时前
LeetCode 322:零钱兑换——Java 动态规划详解
java·leetcode·动态规划
地平线开发者16 小时前
量化为什么会有损失:从量化误差到精度下降
算法