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之前添加了去重功能

相关推荐
Bonnie_12151 小时前
07-算法打卡-链表-移除链表-leetcode(203)-第七天
算法·leetcode·链表
槐月杰3 小时前
入门到精通,C语言十大经典程序
c语言·数据结构·算法
a东方青4 小时前
[16届蓝桥杯 2025 c++省 B] 移动距离
c++·算法·蓝桥杯
烁3474 小时前
每日一题(小白)暴力娱乐篇25
java·数据结构·算法·娱乐
烁3475 小时前
每日一题(小白)暴力娱乐篇26
java·开发语言·算法·娱乐
学c++的一天5 小时前
蓝桥杯备战
算法·职场和发展·蓝桥杯
梭七y5 小时前
【力扣hot100题】(096)多数元素
算法·leetcode·职场和发展
zero.cyx6 小时前
蓝桥杯 DFS
算法·蓝桥杯·深度优先
码媛6 小时前
A002-随机森林模型实现糖尿病预测
算法·随机森林·机器学习
ricky_fan8 小时前
Leetcode39:组合总和——回溯算法
开发语言·c++·leetcode