Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【优选算法】三数之和(双指针算法)

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

作者头像
云边有个稻草人
发布于 2025-01-20 10:14:49
发布于 2025-01-20 10:14:49
11200
代码可运行
举报
运行总次数:0
代码可运行
一、【题目:15. 三数之和 - 力扣(LeetCode)

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

二、【代码原理】

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

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

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

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

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

  1. 当处理完一个结果时,left 和 right 指针要跳过两边重复的元素。这样直接避免掉重复的数据。
  2. 当 i+1 == i 时,跳过重复的 i,直到遇到不同的 i。
三、【代码】
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
};

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【优选算法】不允许你还不会双指针
(错误)决策一:利用双指针从前向后遍历时往dest上填写会发现行不通,它会把之后的数覆盖。
egoist祈
2025/03/05
410
【优选算法】不允许你还不会双指针
【优选算法题练习】day3
15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。
摘星
2023/10/15
1790
【优选算法题练习】day3
三数之和(medium)07
这里我根据官方可以优化我们的代码:比如比较两数和时候,提前定义一个sum,这样后面就直接用sum代替和,代码长度就会减少许多。
用户11319080
2024/10/17
950
三数之和(medium)07
【优选算法】四数之和(双指针算法)
前面的三数之和题如果理解透彻且代码能够自己写出来,其实这道四数之和题自己也是能够写出来的,就是这道题有一个数据溢出的问题解决一下就好了。
云边有个稻草人
2025/01/20
740
【优选算法】四数之和(双指针算法)
优先算法 —— 双指针系列 - 四数之和
https://blog.csdn.net/hedhjd/article/details/144129358?spm=1001.2014.3001.5502
迷迭所归处
2024/12/24
740
优先算法 —— 双指针系列 - 四数之和
算法思想总结:双指针算法
该题的重要信息:1、不要在超过该数组的长度的位置写入元素(就是不要越界)2、就地修改(就是不能创建新数组)。3、不返回任何东西。
小陈在拼命
2024/03/16
1400
算法思想总结:双指针算法
【算法】双指针算法
一、题目分析 要将0放在所有数组的最后,而且非零元素的顺序保持不变,要求原地对数组进行移动。
zxctscl
2024/04/15
1360
【算法】双指针算法
【优先算法】专题——双指针
题目分析:题目说不要超过数组长度其实就是告诉我们不要越界,题目还告诉我们不能创建额外数组让我们就地修改原数组,我们不需要返回任何内容。
用户11375356
2024/11/25
1440
【优先算法】专题——双指针
优先算法 —— 双指针系列 - 三数之和
https://leetcode.cn/problems/3sum/description/
迷迭所归处
2024/12/24
900
优先算法 —— 双指针系列 - 三数之和
我爱学算法之—— 感受双指针带来的快感(下)
我们这里借用两数之和中利用双指针算法找和为target的思路;依次固定(从左到右)给定数组中的数字i,然后利用双指针算法,在其右边区间内找到和为-i的两个数,找到返回即可。
星辰与你
2024/12/29
830
我爱学算法之—— 感受双指针带来的快感(下)
基础算法--双指针算法
通常我们讲的双指针就是用两个指针,两个指针可以是快慢指针,解决成环的问题,也可以是指向收尾的两个指针,来减小时间复杂度。双指针算法里的指针也不止是指针,在数组中也可以是数组元素的下标,这里双指针是一种思想,并不是单单指的是指针。 接下来我们用几道例题来看看双指针算法。
用户11305458
2024/10/09
1360
基础算法--双指针算法
指尖的无声告白,算法里的隐约温柔
给定一个整数数组 nums,判断数组中是否存在三个元素 nums[i], nums[j], nums[k],使得它们的和为 0,返回所有符合条件且不重复的三元组。要求:
Undoom
2024/10/19
1160
指尖的无声告白,算法里的隐约温柔
015. 三数之和 | Leetcode题解
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 _a,b,c ,_使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
苏南
2020/12/16
4250
015. 三数之和 | Leetcode题解
7.《双指针篇》---⑦三数之和(中等偏难)
用户11288958
2024/11/21
400
7.《双指针篇》---⑦三数之和(中等偏难)
【优选算法篇】两队接力跑:双指针协作解题的艺术(下篇)
引言:通过上篇文章带大家简单了解“双指针算法”,小试牛刀。接下来将让大家感受一下双指针在解题的妙处。
熬夜学编程的小王
2024/12/24
950
【优选算法篇】两队接力跑:双指针协作解题的艺术(下篇)
【Leetcode】《双指针出击:多数和问题的“破阵之匙”,解锁高效算法密码》
本题的题目要求就是给定一个目标数,然后在数组内,找到两个数,使得这两个数的和为目标数;
用户11288949
2025/01/17
800
【Leetcode】《双指针出击:多数和问题的“破阵之匙”,解锁高效算法密码》
初识算法 · 双指针(3)
本文通过介绍和为S的两数之和,以及三数之和,对双指针算法进行深一步的了解,介绍该算法博主使用三部曲,第一步对题目进行分析,里面会夹杂着暴力解法的问题,第二步对于算法原理进行分析,第三步则是对算法进行编写,最后分析时间复杂度,可能会分析空间复杂度。
_lazy
2024/10/16
1100
初识算法 · 双指针(3)
算法专题一: 双指针
2. 快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。
用户11317877
2024/10/16
640
算法专题一: 双指针
我爱学算法之—— 感受双指针带来的快感(中)
题目描述十分简单,我们首先相当直接暴力枚举,依次判断是否满足条件就行了;但是这样时间复杂度就是O(n^3),我们需要简化一下
星辰与你
2024/12/29
790
我爱学算法之—— 感受双指针带来的快感(中)
【算法专题】双指针
其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使⽤快慢指针的思想。快慢指针的实现方式有很多种,最常用的⼀种就是:
YoungMLet
2024/03/01
1480
相关推荐
【优选算法】不允许你还不会双指针
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验