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

相关推荐
suuijbd21 分钟前
个人总结八股文之-基础篇(持续更新)
算法
2401_8812444023 分钟前
斐波那契数列------矩阵幂法
线性代数·算法·矩阵
机器学习与统计学1 小时前
阿里牛逼,又开源两个遥遥领先的模型(向量化、重排),知识库要翻天地覆了
算法
小河豚oO1 小时前
LeetCode刷题---贪心算法---944
算法·leetcode·贪心算法
【杨(_> <_)】1 小时前
信号处理分析工具——时频分析(一)
算法·matlab·信号处理
还不起来学习?1 小时前
常见算法题目5 -常见的排序算法
java·算法·排序算法
Once_day1 小时前
代码训练LeetCode(23)随机访问元素
算法·leetcode
小河豚oO1 小时前
LeetCode 热题 100 - 哈希 - 128
算法·leetcode·哈希算法
客卿1231 小时前
力扣100题之128. 最长连续序列
算法·leetcode·哈希算法
T1an-11 小时前
【力扣链表篇】206.反转链表
算法·leetcode·链表