class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;//定义result为容器里的容器,相当于当容器里还有一个小容器,跟题目最后输出的是符合数组相吻合。sort(nums.begin(), nums.end());//sort类,用于排序,从nums数组的第一个元素到最后一个元素// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) {return result;}// 错误去重方法,将会漏掉-1,-1,2 这种情况/*if (nums[i] == nums[i + 1]) {continue;}*/// 正确去重方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/if (nums[i] + nums[left] + nums[right] > 0) {right--;} else if (nums[i] + nums[left] + nums[right] < 0) {left++;} else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重逻辑应该放在找到一个三元组之后while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;//去重的原理:因为是已经排过序了,重复的序列必然是紧挨着的,我们只需在找到的结果中把指针回退一位即可。(自己动手花花逻辑就能理解了)// 找到答案时,双指针同时收缩right--;left++;}}}return result;}
};

整体的解题思路:

第一步是定义result,定义的是容器里的容器,用于返回的是数组对

第二步是排序,用的是sort方法,从小到大的顺序

第三步就是指针的移动方式,拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下表0的地方开始,同时定一个下表left 定义在i+1的位置上,定义下表right 在数组结尾的位置上。

依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于  a = nums[i] b = nums[left]  c = nums[right]。

接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0  就说明 此时三数之和大了,因为数组是排序后了,所以right下表就应该向左移动,这样才能让三数之和小一些。

如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。

最重要的是去重:去重一共分为两部分,找结果的前提是排序了数组,第一部分是在找到符合条件的值之后,就把其地址存储在容器里,这时候再移动I指针,如果下一个是与原来的值是相等的,那么这就是一种重复的情况。

第二部分是当找到符合条件的值以后,再移动left活着right的时候,旁边的值是一致的,那么就是重复的情况,这时候就要倒回去继续判断了。

题目所涉及的知识点内容可参考以下博主:

一个是容器(vector),具体的一些内容可参考下面博主:https://blog.csdn.net/wkq0825/article/details/82255984

第二个知识点是sort函数,具体内容参考下面博主:https://blog.csdn.net/Architect_chaser/article/details/88322605

三数之和(Leetcode第15题)相关推荐

  1. 15. 三数之和LeetCode

    这算是小总结吧,代码啥的大体上跟大家的一样,只不过我认为官方应该多一个保证不同的操作(反正是通过了,就姑且当我的想法对吧)(明明四数值和官方都进行了保证重复操作,而三个竟然没有都进行,我不理解.) 还 ...

  2. 15.三数之和-LeetCode

    目录 一.问题描述 二.解题思想 三.解题 1.判断极端情况 2.代码实现 总结 一.问题描述 这里直接采用的是leetcode上面的问题描述. 给你一个包含 n 个整数的数组 nums,判断 num ...

  3. Leecode15. 三数之和——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  4. 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

  5. LeetCode 259. 较小的三数之和(固定一点,内层双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个长度为 n 的整数数组和一个目标值 target,寻找能够使条件 nums[i] + nums[j] + nums[k] < target ...

  6. 【LeetCode】两数之和、三数之和、四数之和系列

    文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...

  7. LeetCode实战:最接近的三数之和

    题目英文 Given an array nums of n integers and an integer target, find three integers in nums such that ...

  8. 基础数学(二)两数之和 三数之和

    目录 两数之和_牛客题霸_牛客网 三数之和_牛客题霸_牛客网 两数之和_牛客题霸_牛客网 给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返 ...

  9. Leetcode python《热题 HOT 100》15. 三数之和

    Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...

  10. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

最新文章

  1. 面试投行的20个Java问题
  2. Hadoop详解(十一):Yarn设计理念与基本架构
  3. vb.net webclient 网络目录是否存在_牛眼IPO | 怡合达IPO申请待审核 产品目录被指涉嫌侵权...
  4. 从2D到3D 开发者讲述“街霸V”的美术秘笈
  5. python将姓王的都改成老王_Python老王视频习题答案
  6. Codeforces Good Bye 2015 A. New Year and Days 水题
  7. 简单的UTF8编码生成
  8. 一图看懂云栖大会「云原生」发布
  9. 韩国FSC公布新方案允许分离银行加密业务 以帮助小型交易所继续运营
  10. 招聘贴---这个很重要嘛
  11. @程序员,CSDN卫衣、背包、鼠标垫......福利来啦!!!
  12. how bootstrap fit into our website design?
  13. mysql双机热备份
  14. 深度学习训练模型的硬件条件(点评)
  15. 前端学习从入门到高级全程记录之31(JavaScript高级3)
  16. 22.纯 CSS 创作出美丽的彩虹条纹文字
  17. 五个学习管理系统的优点
  18. linux pacman安装目录,Arch包管理器pacman和yaourt简明用法
  19. 【golang学习总结】10 golang中map用法
  20. 【FinE】资产组合理论(2) 均值方差模型

热门文章

  1. java 定义构造器_java的构造器定义以及使用
  2. elasticsearch date_MySQL数据实时增量同步到Elasticsearch
  3. Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2
  4. 【Python】logging内置模块基本使用
  5. 【数据库】Window环境安装MySQL Server 5.7.21
  6. CentOS7上GitLab的使用
  7. svn 服务器的搭建以及客户端的使用
  8. noip2004普及组第2题 花生采摘
  9. 【JAVA学习】09.创建BootstrapTale列表页
  10. SpringBoot学习笔记(8):事物处理