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

相关推荐
Sheep Shaun7 分钟前
C++ STL简介:构建高效程序的基石
开发语言·数据结构·c++·算法
点云SLAM11 分钟前
C++ 中二级指针的正确释放方法
开发语言·数据结构·c++·人工智能·算法
m0_748319082 小时前
图论之幻想迷宫
算法
jia_jia_LL2 小时前
备战蓝桥杯国赛第一天-atcoder-beginner-contest404
c++·算法·蓝桥杯·图论
朝九晚五ฺ3 小时前
【算法学习】递归、搜索与回溯算法(一)
数据结构·学习·算法·深度优先
张书名3 小时前
Leetcode刷题记录29——矩阵置零
算法·leetcode·矩阵
描绘一抹色3 小时前
力扣hot100 (除自身以外数组的乘积)
java·算法·leetcode
自由的风.3 小时前
贪心算法解决会议安排问题
算法·贪心算法·c#
Best_Me073 小时前
FiLo++的框架图介绍
人工智能·算法·机器学习·职场和发展·蓝桥杯
序属秋秋秋3 小时前
《数据结构初阶》【顺序栈 + 链式队列 + 循环队列】
c语言·数据结构·c++·笔记·算法