DAY 38 leetcode 15--哈希表.三数之和

题号15

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

未去重版本

整体思路:先排序再双指针遍历

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //先排序
        int size=nums.length;
        for (int i = 0; i < size - 1; i++) {
            for (int j = i + 1; j < size; j++) {
                if (nums[j] < nums[i]) {
                    int tmp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = tmp;
                }
            }
        }
        //创建一个列表(其中元素为Integer类型)的列表的变量
        List<List<Integer>> result=new ArrayList<>();
        //双指针
        int fast=size-1;
        for(int cur=0;cur<size-2;cur++){
            int  slow=cur+1;
            while(slow<fast){
                if(nums[cur]+nums[slow]+nums[fast]==0)
                {
                    //加入操作
                    //Array.asList是Java标准库中的方法
                    //它用来接收一系列的对象,并把它们转化为固定大小的列表
                    //在这个例子中,它创建了一个包含这三个整数的列表
                    result.add(Arrays.asList(nums[cur],nums[slow],nums[fast]));
                   slow++;
                   fast--;
                }
                else if(slow==size&&nums[cur]+nums[slow]+nums[fast]>0)
                fast--;
                else
                slow++;
            }
            fast=size-1;
        }
        return result;
    }
}

优化后:

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //先排序
        int size=nums.length;
        Arrays.sort(nums);
        //创建一个列表(其中元素为Integer类型)的列表的变量
        List<List<Integer>> result=new ArrayList<>();
        //双指针
        int fast=size-1;
        for(int cur=0;cur<size-2;cur++){
            //去重:若下一个cur与上一个相同则跳过
            if(cur>0&&nums[cur]==nums[cur-1])
            continue;
            int  slow=cur+1;
            while(slow<fast){
                if(nums[cur]+nums[slow]+nums[fast]==0)
                {
                    //加入操作
                    //Array.asList是Java标准库中的方法
                    //它用来接收一系列的对象,并把它们转化为固定大小的列表
                    //在这个例子中,它创建了一个包含这三个整数的列表
                    result.add(Arrays.asList(nums[cur],nums[slow],nums[fast]));
                    //去重
                    while(slow<fast&&nums[slow]==nums[slow+1])
                    slow++;
                    while(slow<fast&&nums[fast]==nums[fast-1])
                    fast--;
                   slow++;
                   fast--;
                }
                else if(nums[cur]+nums[slow]+nums[fast]>0)
                fast--;
                else
                slow++;
            }
            fast=size-1;
        }
        return result;
    }
}

使用了自带的Arrays.sort功能,比冒泡排序简洁高效

在add之前添加了去重功能

相关推荐
To_OC1 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495641 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒6 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽8 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米8 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠9 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA11 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel11 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客11 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化