【算法专题突破】双指针 - 三数之和(7)

这篇具有很好参考价值的文章主要介绍了【算法专题突破】双指针 - 三数之和(7)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 题目解析

2. 算法原理

3. 代码编写

写在最后:


1. 题目解析

题目链接:15. 三数之和 - 力扣(Leetcode)

【算法专题突破】双指针 - 三数之和(7),算法专题训练,算法,c++,leetcode

 题目就是要找出和为0的不重复的三元组,

注意三元组的每个元素是得不同的位置,那不重复又是什么意思呢?

我们可以看第一个示例,

他找出了三个三元组,但是他最后只返回了两个,

也就是,三元组的元素相同算同一个三元组。(如果没有就返回空集。)

2. 算法原理

第一个想法当然是暴力枚举,具体来说就是,

先排序,然后暴力枚举,最后用set去重就行,

那我们就得想一想怎么把N3的暴力枚举优化一下,

排序之后是有序数组,那我们就得想到改用二分还是双指针来优化:当然是优先双指针啦

来看具体解法:

固定一个 i 位置:

【算法专题突破】双指针 - 三数之和(7),算法专题训练,算法,c++,leetcode

我们只需要通过双指针快速找到 left 位置 + right 位置的和是 4 的位置即可。

3. 代码编写

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size() - 2; i++) {
            int left = i + 1, right = nums.size() - 1;
            while(left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if(sum < 0) left++;
                else if(sum > 0) right--;
                else { // sum == 0
                    ans.push_back({nums[i], nums[left], nums[right]});
                    while(left < right && nums[left] == nums[left + 1]) left++;
                    while(left < right && nums[right] == nums[right - 1]) right--;
                    left++, right--;
                }
            }
            while(i < nums.size() - 2 && nums[i] == nums[i + 1]) i++;
        }
        return ans;
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~文章来源地址https://www.toymoban.com/news/detail-702792.html

到了这里,关于【算法专题突破】双指针 - 三数之和(7)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和

    [双指针] (三) LeetCode LCR 179. 查找总价格为目标值的两个商品 和 15. 三数之和 查找总价格为目标值的两个商品 LCR 179. 查找总价格为目标值的两个商品 题目分析 (1) 数组内数字是升序 (2) 目标值为target (3) 找两数之和为target 解题思路 找两个数字的和与目标值相等,我们可以想到

    2024年02月05日
    浏览(33)
  • 【LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月13日
    浏览(30)
  • 【算法专题突破】双指针 - 快乐数(3)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:202. 快乐数 - 力扣(Leetcode) 这道题的题目也很容易理解, 看一下题目给的示例就能很容易明白, 但是要注意一个点,最后有可能无限循环无法到达1。 这个时候我们就要想一下怎么判断他是无线循环呢? 实际

    2024年02月11日
    浏览(26)
  • 【算法专题突破】双指针 - 移动零(1)

    目录 写在前面 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 在进行了剑指Offer和LeetCode hot100的毒打之后, 我决心系统地学习一些经典算法,增强我的综合算法能力。 题目链接:283. 移动零 - 力扣(Leetcode) 读完题目大概就能明白他的意思, 就是在不改变其他数字的情况下

    2024年02月11日
    浏览(30)
  • 【算法专题突破】双指针 - 复写零(2)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:1089. 复写零 - 力扣(Leetcode) 我先来读题, 题目的意思非常的简单,其实就是, 遇到 0 就复制一个写进数组,然后右边的元素就右移一位, 看一眼例子可以很容易理解题意。  一般像这种需要移动数组的元素

    2024年02月11日
    浏览(34)
  • 【算法专题突破】双指针 - 盛最多水的容器(4)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:11. 盛最多水的容器 - 力扣(Leetcode)   这道题目也不难理解, 两边的柱子的盛水量是根据短的那边的柱子决定的, 而盛水量就是短的柱子的高度 * 宽度即可。  这道题可以用暴力枚举,两层for循环,肯定是可

    2024年02月10日
    浏览(28)
  • 【算法专题突破】双指针 - 和为s的两个数字(6)

    目录   1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:剑指 Offer 57. 和为s的两个数字 - 力扣(Leetcode)  这道题题目就一句话但是也是有信息可以提取的, 最重要的就是开始的那句话,“递增序列” 然后在数组中找出两个和为s的数即可(而且是任意一对即可)

    2024年02月09日
    浏览(29)
  • 【算法专题突破】双指针 - 有效三角形的个数(5)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:611. 有效三角形的个数 - 力扣(Leetcode)  我们可以根据示例1来理解这一道题目, 他说数组里面的数可以组成三角形三条边的个数, 那我们先自己枚举一下所有情况看看:  【2, 2, 3】  【2, 2, 4】  【2,

    2024年02月10日
    浏览(34)
  • [哈希专题]四数相加|赎金信|三数之和|四数之和

    此题思路:前两个数求和sum,sum1=0-后两数之和。判断sum1是否在之前出现过,此时用到哈希表,即判断sum1是否在前两个数中出现过。从而求得个数。 此题思路:定义两个指针left和right,遍历i,看三个位置的值是否为0。如果三个点值大于0,right--;如果小于0,left++。等于零即

    2024年01月17日
    浏览(34)
  • 力扣精选算法100题——四数之和(双指针专题)

    上一篇讲到(俩数之和and三数之和)这一篇我要来解析四数之和,四数之和建立在三数之和的基础上,我们需要熟练掌握三数之和的算法原理,如果大家三数之和还没弄清楚,请点击三数之和and二数之和链接即可看到。  三数之和和四数之和的题意其实都一样。 找到出四个数

    2024年01月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包