LeetCode Hot100 15.三数之和

题干:

思路:

首先想到的是哈希表,类似于两数之和的想法,共两层循环,将遍历到的第一个元素和第二个元素存入哈希表中,然后按条件找第三个元素,但是这道题有去重的要求,哈希表实现较为麻烦。

优解是用双指针的解法,将数组排序,排序的目的是为了后续定义的判定条件,题干要求返回的是数组中的值,并不是索引所以可以排序。排完序,先固定第一个元素,然后固定左指针和右指针

​​​​​​​ ​​​​​​​

当三个元素和大于0时,需要将右指针左移,元素和小于0时,将左指针右移。另外还要考虑去重。

代码实现如下:

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        //对数组进行排序
        Arrays.sort(nums);

        for (int i = 0; i < nums.length; i++) {
            //如果第一个数字已经大于0,则凑不成三元组
            if(nums[i] > 0){
                return res;
            }
            //对第一个数字去重
            if(i > 0 && nums[i] == nums[i-1]){
                continue;
            }

            //记录第一个数字
            int temp = nums[i];
            //定义双指针
            int left = i + 1;
            int right = nums.length - 1;
            while(right > left){
                int sum = temp + nums[left] + nums[right];
                if(sum > 0){
                    right--;
                }else if(sum < 0){
                    left++;
                }else {
                    //Arrays.asList():将数组转换为一个固定的列表
                    res.add(Arrays.asList(temp, nums[left], nums[right]));
                    //对第二个和第三个数数字去重
                    while(right > left && nums[right] == nums[right-1]){
                        right--;
                    }
                    while(left < right && nums[left] == nums[left + 1]){
                        left++;
                    }
                    right--;
                    left++;
                }
            }

        }

        return res;
        
    }
}
相关推荐
No0d1es6 分钟前
2024年9月青少年软件编程(C语言/C++)等级考试试卷(七级)
c语言·开发语言·c++·算法·青少年编程·电子学会·七级
Lindsey_feiren14 分钟前
代码随想录算法训练营day41|动态规划04
算法·leetcode·动态规划
Jeffrey_oWang34 分钟前
软间隔支持向量机支持向量的情况以及点的各种情况
算法·机器学习·支持向量机
我感觉。1 小时前
【机器学习chp2】贝叶斯最优分类器、概率密度函数的参数估计、朴素贝叶斯分类器、高斯判别分析。万字超详细分析总结与思考
算法·机器学习·贝叶斯·朴素贝叶斯分类器·高斯判别分析
三小尛1 小时前
归并排序(C语言)
c语言·数据结构·算法
Nonullpoint.2 小时前
对称加密与非对称加密:密码学的基石及 RSA 算法详解
java·计算机网络·算法·网络安全·密码学
AAA_bo12 小时前
每日一题3239.最少翻转次数使二进制矩阵回文;
算法
陈壮实的搬砖日记2 小时前
一文读懂BatchNorm2d()函数的计算逻辑
算法
ahadee2 小时前
蓝桥杯每日真题 - 第15天
c语言·vscode·算法·蓝桥杯
戊子仲秋2 小时前
【LeetCode】每日一题 2024_11_16 最少翻转次数使二进制矩阵回文 II(矩阵,分类讨论)
leetcode·矩阵·分类