hot100:06三数之和

题目链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

算法思想:

使用双指针的思想,首先需要先对数组进行排序,让数组满足单调性,这样在相加的时候更加方便更新条件;再遍历数组,遍历数组的目的就是确定一个数numsi,然后在剩下的数中找到两个数时其相加等于-numsi,这样三个数相加的结果就是0了

注意:

结果要求返回的三元组不能是重复的,所以每找到一组三元组的时候,更新left和right两个指针的时候也需要进行去重(就是多加一个条件,判断更新指针之后的数如果和更新之前的数一样的话就继续更新指针),同时去重的时候也要注意越界问题

java 复制代码
public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ret = new ArrayList<>();
        //1.先对数组排序
        Arrays.sort(nums);
        //2.使用双指针解决
        //2.1先固定第一个数
        int n = nums.length;
        for(int i = 0;i < n;) {
            //对后面的数组利用双指针的思想
            int target = -nums[i];
            int left = i+1;
            int right = n-1;
            while(left < right) {
                int sum = nums[left] + nums[right];
                if(sum < target) {
                    left++;
                } else if(sum > target) {
                    right--;
                } else {
                    //此时的三元组是:nums[i] nums[left] nums[right]
                    ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
                    left++;
                    right--;
                    //需要去重 去重的时候要防止数组下标越界
                    while(left < right && nums[left] == nums[left-1]) {
                        left++;
                    }
                    while(left < right && nums[right] == nums[right+1]) {
                        right--;
                    }
                }
            }
            //外面固定的数nums[i]也需要进行去重
            i++;
            while(i < n && nums[i] == nums[i-1]) {
                i++;
            }
        }
        return ret;
    }
相关推荐
学计算机的计算基8 分钟前
LeetCode 图论四题精讲:BFS、拓扑排序、Trie 树的模板与优化
java·笔记·算法
浩瀚地学8 分钟前
【面试算法笔记】0202-链表-基本功能实现
java·经验分享·笔记·算法·面试
3DVisionary13 分钟前
如何用单目高速DIC把“看不见“的振动变成“数得清“的数据
java·spring boot·python·数码相机·微小振动·精密件·单目高速dic
tkevinjd19 分钟前
416分割等和子集
java·python·算法·leetcode·职场和发展
Keven_1128 分钟前
算法札记:Tarjan与拓扑序(Topo)的关系
算法·拓扑·tarjan
qq_4523962334 分钟前
第三篇:《Jenkins Pipeline as Code:Declarative Pipeline 深度实战》
java·servlet·jenkins
ShallWeL41 分钟前
AUC、F1、召回率怎么选
人工智能·算法·机器学习
再让我睡两分钟44 分钟前
【无标题】
android·java·数据库·人工智能·prompt·ai应用开发
水龙吟啸1 小时前
华为2026.6.3机考选择题+编程题【速刷敲黑板】
人工智能·深度学习·算法·华为
学究天人1 小时前
数学公理体系大全:第十四章 向量空间与模:线性代数的公理化与推广
线性代数·算法·矩阵·动态规划·抽象代数