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

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;
    }
};

未完待续~

相关推荐
mit6.8243 分钟前
[Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
算法·哈希算法
c++bug6 分钟前
动态规划VS记忆化搜索(2)
算法·动态规划
哪 吒8 分钟前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
军训猫猫头1 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
success1 小时前
【爆刷力扣-数组】二分查找 及 衍生题型
算法
Orlando cron2 小时前
数据结构入门:链表
数据结构·算法·链表
牛客企业服务2 小时前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
糖葫芦君3 小时前
Policy Gradient【强化学习的数学原理】
算法
向阳@向远方5 小时前
第二章 简单程序设计
开发语言·c++·算法
github_czy6 小时前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法