三数之和(Leetcode第15题)
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题)相关推荐
- 15. 三数之和LeetCode
这算是小总结吧,代码啥的大体上跟大家的一样,只不过我认为官方应该多一个保证不同的操作(反正是通过了,就姑且当我的想法对吧)(明明四数值和官方都进行了保证重复操作,而三个竟然没有都进行,我不理解.) 还 ...
- 15.三数之和-LeetCode
目录 一.问题描述 二.解题思想 三.解题 1.判断极端情况 2.代码实现 总结 一.问题描述 这里直接采用的是leetcode上面的问题描述. 给你一个包含 n 个整数的数组 nums,判断 num ...
- Leecode15. 三数之和——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...
- LeetCode 259. 较小的三数之和(固定一点,内层双指针)
文章目录 1. 题目 2. 解题 1. 题目 给定一个长度为 n 的整数数组和一个目标值 target,寻找能够使条件 nums[i] + nums[j] + nums[k] < target ...
- 【LeetCode】两数之和、三数之和、四数之和系列
文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...
- LeetCode实战:最接近的三数之和
题目英文 Given an array nums of n integers and an integer target, find three integers in nums such that ...
- 基础数学(二)两数之和 三数之和
目录 两数之和_牛客题霸_牛客网 三数之和_牛客题霸_牛客网 两数之和_牛客题霸_牛客网 给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返 ...
- Leetcode python《热题 HOT 100》15. 三数之和
Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...
- LeetCode刷题笔记- 15.三数之和
LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...
最新文章
- 面试投行的20个Java问题
- Hadoop详解(十一):Yarn设计理念与基本架构
- vb.net webclient 网络目录是否存在_牛眼IPO | 怡合达IPO申请待审核 产品目录被指涉嫌侵权...
- 从2D到3D 开发者讲述“街霸V”的美术秘笈
- python将姓王的都改成老王_Python老王视频习题答案
- Codeforces Good Bye 2015 A. New Year and Days 水题
- 简单的UTF8编码生成
- 一图看懂云栖大会「云原生」发布
- 韩国FSC公布新方案允许分离银行加密业务 以帮助小型交易所继续运营
- 招聘贴---这个很重要嘛
- @程序员,CSDN卫衣、背包、鼠标垫......福利来啦!!!
- how bootstrap fit into our website design?
- mysql双机热备份
- 深度学习训练模型的硬件条件(点评)
- 前端学习从入门到高级全程记录之31(JavaScript高级3)
- 22.纯 CSS 创作出美丽的彩虹条纹文字
- 五个学习管理系统的优点
- linux pacman安装目录,Arch包管理器pacman和yaourt简明用法
- 【golang学习总结】10 golang中map用法
- 【FinE】资产组合理论(2) 均值方差模型
热门文章
- java 定义构造器_java的构造器定义以及使用
- elasticsearch date_MySQL数据实时增量同步到Elasticsearch
- Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2
- 【Python】logging内置模块基本使用
- 【数据库】Window环境安装MySQL Server 5.7.21
- CentOS7上GitLab的使用
- svn 服务器的搭建以及客户端的使用
- noip2004普及组第2题 花生采摘
- 【JAVA学习】09.创建BootstrapTale列表页
- SpringBoot学习笔记(8):事物处理