【优选算法】三数之和(双指针算法)

必须有为成功付出代价的决心,然后想办法付出这个代价。

目录

[一、【题目:15. 三数之和 - 力扣(LeetCode)】](#一、【题目:15. 三数之和 - 力扣(LeetCode)】)

二、【代码原理】

三、【代码】


一、【题目:15. 三数之和 - 力扣(LeetCode)

需要注意的是,答案中不可以包含重复的三元组,也就是说,满足要求的组与组之间的三个数要不相同,每组要不重复。

二、【代码原理】

解法一:排序+暴力枚举+利用set去重

排序之后用三个for循环枚举出所有的情况一一排查,将满足条件的组都放到set里面去重,再将不同的组返回即可。

解法二:排序+双指针算法

  1. 将数组排序
  2. 先固定一个数 a(从头开始选定)
  3. 在这个数后面的区间内,使用「双指针算法」快速找到两个数之和等于 -a 即可。

同时需要注意的是【去重】操作,这个去重操作,是直接避免结果里有重复的数据

  1. 当处理完一个结果时,left 和 right 指针要跳过两边重复的元素。这样直接避免掉重复的数据。
  2. 当 i+1 == i 时,跳过重复的 i,直到遇到不同的 i。

三、【代码】

cpp 复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums)
    {
        vector<vector<int>> ret;

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

        //2.利用双指针解决问题
        int n = nums.size();
        for (int i = 0; i < n; )
        {
            if (nums[i] > 0) break;
            int left = i + 1, right = n - 1, target = -nums[i];
            while (left < right)
            {
                int sum = nums[left] + nums[right];
                if (sum < target) left++;
                else if (sum > target) right--;
                else
                {
                    ret.push_back({ nums[i], nums[left], nums[right] });
                    left++, right--;
                    //去重 left 和 right,用left<right防止越界
                    while (left < right && nums[left] == nums[left - 1])
                        left++;
                    while (left < right && nums[right] == nums[right + 1])
                        right--;
                }
            }
            i++;
            //去重i,用i<n 来防止越界
            while (i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }
};

代码一定要思考透彻,多回顾,不要怕动脑,多思考几遍就没有想象中的那么复杂了,

明天继续。。。

相关推荐
鱼鱼不愚与3 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络8 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷1 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络1 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络1 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4001 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4001 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
LinXunFeng2 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
JieE2123 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法