优先算法 —— 双指针系列 - 三数之和

1. 三数之和

题目链接:

15. 三数之和 - 力扣(LeetCode)https://leetcode.cn/problems/3sum/description/


2. 题目解析

由题可以得出:三个数不能选择重复位置的下标,同时还要满足三数相加之和为0,并且不能返回重复的三元组合

结合示例1来理解:

我们可以这样选择:

注意:


3. 算法原理

解法1:暴力枚举

排序 + 暴力枚举 + 使用set进行去重

我们可以先进行排序,这样我们枚举之后就会发现如果有相同的那么枚举出来的值是一样的

然后再使用set的特性进行去重

解法2:双指针算法

排序 + 双指针

我们在暴力枚举的基础上进行优化,我们进行了排序,那么数组就变成了有序的,如果是有序的数组,那么我们一般使用 二分 或者 双指针 来解决,一般能够使用双指针来解决问题就不要使用二分

当a>0的时候就不需要考虑了

当我们进行去重操作的时候,当数组是下面这种情况的话,我们的指针是有可能越界的


4. 代码

复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;//记录最终结果

        //排序
        sort(nums.begin(),nums.end());

        //固定完一个数之后使用双指针
        int n=nums.size();
        for(int i=0;i<n;)//固定数a
        {
            if(nums[i]>0) break;

            //target=-nums[i]目标值的相反数
            int left=i+1,right=n-1,target=-nums[i];
            while(left<right)
            {
                int sum=nums[left]+nums[right];
                if(sum>target) right--;
                else if(sum<target) left++;
                else{
                    ret.push_back({nums[i],nums[left],nums[right]});
                    left++;
                    right--;

                    //进行l和r的去重操作
                    while(left<right && nums[left] == nums[left-1]) left++;
                    while(left<right && nums[right] == nums[right+1]) right--;
                }
            }
            //进行i的去重
            i++;//将for循环的i++放到这里
            while(i<n && nums[i] == nums[i-1]) i++;
        }
        return ret;
    }
};

未完待续~

相关推荐
小李飞刀李寻欢几秒前
DeepSeek V3 版本模型结构分析
算法·大模型·deepseek
某不知名網友13 分钟前
C++ 七大排序算法完整讲解
java·算法·排序算法
得物技术33 分钟前
得物推荐系统诊断 Agent:从 “调接口” 到 “会思考”|AICon 演讲整理
人工智能·算法·架构
Lugas42 分钟前
为啥说男生找对象尽量在25岁前找到?
算法
MrZhao40044 分钟前
从能跑到可用:一个 Agent Harness 还差哪些工程闭环?
算法
QN1幻化引擎1 小时前
Gravity-Anchored Cognitive Field Architecture: The DalinX V8/V10 Implementation
java·前端·算法
学计算机的计算基2 小时前
LeetCode 图论四题精讲:BFS、拓扑排序、Trie 树的模板与优化
java·笔记·算法
浩瀚地学2 小时前
【面试算法笔记】0202-链表-基本功能实现
java·经验分享·笔记·算法·面试
tkevinjd2 小时前
416分割等和子集
java·python·算法·leetcode·职场和发展
Keven_112 小时前
算法札记:Tarjan与拓扑序(Topo)的关系
算法·拓扑·tarjan