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

题号15

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 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之前添加了去重功能

相关推荐
地平线开发者14 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮14 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者15 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考15 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx18 小时前
CART决策树基本原理
算法·机器学习
Wect18 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱19 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway1 天前
解析残差网络 (ResNet)
算法
拖拉斯旋风1 天前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect1 天前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript