【LeetCode 算法】15.三数之和
15. 三数之和
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。 nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。 nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1] 输出:[] 解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0] 输出:[[0,0,0]] 解释:唯一可能的三元组和为 0 。
提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
分析及AC代码
分析详见注释!
/*** Created by Liu Xianmeng On 2022/12/30*/
#include <bits/stdc++.h>
using namespace std;vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ans;if(nums.size()<3) return ans; // 元素数目小于3 则没有符合条件的三元组sort(nums.begin(), nums.end()); // 对元素进行排序if(nums[0]>0) return ans; // 如果第一个最小的元素都要大于0 则后续元素的和不可能为0(必然大于0)// 即不存在满足条件的三元组 返回ans 程序结束int i = 0;while(i<nums.size()){ // 【1】遍历的下标为i的元素作为三元组的第一个元素 -3 -1 0 1 3if(nums[i]>0) break; /// 为什么if(nums[i]>0) break;?/// 因为当遍历到的【1】>0的时候后面的三元组的和必然>0 不会再出现符合条件的三元组了/// 即程序结束 返回ansint left = i+1; // 【2】从i+1的位置开始向后遍历查找三元组的下一个元素int right = nums.size()-1; // 【3】三元组其中的一个数从后往前进行遍历查找(从正数的最大值开始向前进行遍历)while(left<right){ // 【2】的下标必须要小于【3】的下标一旦不满足此条件 说明当前的【1】找不到匹配的【2】和【3】// 将【1】【2】【3】转换为long long避免加法过程中溢出(牛啊!这一点是细节!)long long y = nums[i];long long x = nums[left];long long z = nums[right];// 我们最终要确定的三元组的三个数必须要满足 (x+y+z)===0 也就是:x+y===-zif(x + y > -z) // 当 x+y > -z 说明-z的值过小 需要进行扩大 扩大-z,也就是缩小zright--; // right-- -> 缩小zelse if(x + y < -z) // 当 x+y < -z 说明x+y的值过小 需要进行扩大 由于【1】定 所以这里选择扩大yleft++; // left++ -> 扩大yelse{ // 第三种情况就是(x+y)=== z 执行到这里 说明寻找到一组解ans.push_back({nums[i], nums[left], nums[right]}); // 添加此三元组到答案中// 相同的left和right不应该再次出现,因此跳过while(left<right && nums[left]==nums[left+1]) left++;while(left<right && nums[right] == nums[right-1]) right--;left++; // 将【2】更新为下一个新的数(必须与上一个已经满足条件的三元组的【2】不同)right--; // 将【3】更新为下一个新的数(必须与上一个已经满足条件的三元组的【3】不同)/*** 内层while循环 这个地方不太好理解 多多思考 当left<right满足的时候 会用当前遍历的i(也就是三元组的第一个数)* 生成多个满足条件的三元组 直到left>=right 内层while循环才会退出 退出后i才会更新 然后继续进行内层循环* 直到num[i]>0 或者 i===nums.length 程序才会退出外层while循环*/}}// 避免nums[i]作为第一个数重复出现while(i+1<nums.size() && nums[i] == nums[i+1]) i++;i++; // 将【1】更新为下一个新的数(必须与上一个已经遍历过的【1】不同)}return ans;
}int main() {vector<int> v;v.push_back(-1);v.push_back(0);v.push_back(1);v.push_back(2);v.push_back(-1);v.push_back(-4);vector<vector<int>> rst = threeSum(v);printf("断点调试..");return 0;
}
【LeetCode 算法】15.三数之和相关推荐
- leetcode系列--15.三数之和
leetcode 第15题 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三 ...
- leetcode算法题--三数之和
原题链接:https://leetcode-cn.com/problems/3sum/ 排序+双指针法 先将数列从小到大排序 先选择一个数,这一步时间复杂度为O(n) 在这个数后面的数中用双指针分别从 ...
- Leetcode:NO.15 三数之和 夹逼
题解 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...
- leetcode No.15-16 三数之和相关问题
leetcode 15. 三数之和 题目 链接:https://leetcode-cn.com/problems/3sum 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...
- 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结
LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...
- 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和
代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...
- 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...
- Leetcode python《热题 HOT 100》15. 三数之和
Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...
- LeetCode 15. 三数之和(3Sum)
15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...
最新文章
- c语言中dfs用pos做参数,使用DFS解决8-Puzzle
- Java 流程控制与数组
- Nginx(二):安装、配置、常用命令
- access实例_西门子PLC1200组态王跟Access数据库-⑥组态王变量
- 实用素材|UI设计师需要的输入框和表单
- 课后作业1:字串加密
- 《数字电路与逻辑设计》课程教学大纲
- J2ME基本术语词典(05/06/09)
- Linux文字识别软件,Ubuntu 14.04下PDF 文字识别工具gscan2pdf
- 2019年新能源汽车补贴政策,赶紧了解车牌识别!
- web前端大作业 (仿英雄联盟网站制作html css javascript) 学生dreamweaver网页设计作业
- 在vue中使用element-ui二次封装面包屑导条
- twiproxy - 基于GTAP 0.4的twitter API proxy
- ubuntu 本地和服务器scp文件传输
- 用qrcode生成微信支付二维码
- unity3d:向量计算:获得两点连线的垂直向量,判断目标方位(前后左右)
- 家庭小庭院设计的19种要素
- 多线程就一定比单线程快吗?
- 专业成绩第一,获得首届校长奖学金!
- 开发实时视频直播平台的技术要点
热门文章
- 旺店通·企业版与畅捷通T+对接集成查询销售出库单连通创建销售出库单(WT+销售出库单)
- 【Maya】学习笔记 | 基础操作
- Airfoil for mac(无线音乐同步管理器)
- 携职教育:2022年人力资源管理师证书怎么考(报考攻略)
- 将360浏览器的收藏夹导入谷歌浏览器
- 基于MATLAB的数字图像处理系统GUI界面设计
- 第一站电子商务行业:消灭竞争对手的22个秘密武器
- 舞动的灵魂、这一季的雪、让我为自己感伤时间
- 如何跨楼层增强wifi信号 让wifi信号无死角?
- 《牛津字典精华总结》- 初阶系列 - 字母 - T