15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != 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.三数之和相关推荐

  1. leetcode系列--15.三数之和

    leetcode 第15题 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三 ...

  2. leetcode算法题--三数之和

    原题链接:https://leetcode-cn.com/problems/3sum/ 排序+双指针法 先将数列从小到大排序 先选择一个数,这一步时间复杂度为O(n) 在这个数后面的数中用双指针分别从 ...

  3. Leetcode:NO.15 三数之和 夹逼

    题解 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...

  4. leetcode No.15-16 三数之和相关问题

    leetcode 15. 三数之和 题目 链接:https://leetcode-cn.com/problems/3sum 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...

  5. 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结

    LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...

  6. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

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

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

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

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

  9. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

最新文章

  1. c语言中dfs用pos做参数,使用DFS解决8-Puzzle
  2. Java 流程控制与数组
  3. Nginx(二):安装、配置、常用命令
  4. access实例_西门子PLC1200组态王跟Access数据库-⑥组态王变量
  5. 实用素材|UI设计师需要的输入框和表单
  6. 课后作业1:字串加密
  7. 《数字电路与逻辑设计》课程教学大纲
  8. J2ME基本术语词典(05/06/09)
  9. Linux文字识别软件,Ubuntu 14.04下PDF 文字识别工具gscan2pdf
  10. 2019年新能源汽车补贴政策,赶紧了解车牌识别!
  11. web前端大作业 (仿英雄联盟网站制作html css javascript) 学生dreamweaver网页设计作业
  12. 在vue中使用element-ui二次封装面包屑导条
  13. twiproxy - 基于GTAP 0.4的twitter API proxy
  14. ubuntu 本地和服务器scp文件传输
  15. 用qrcode生成微信支付二维码
  16. unity3d:向量计算:获得两点连线的垂直向量,判断目标方位(前后左右)
  17. 家庭小庭院设计的19种要素
  18. 多线程就一定比单线程快吗?
  19. 专业成绩第一,获得首届校长奖学金!
  20. 开发实时视频直播平台的技术要点

热门文章

  1. 旺店通·企业版与畅捷通T+对接集成查询销售出库单连通创建销售出库单(WT+销售出库单)
  2. 【Maya】学习笔记 | 基础操作
  3. Airfoil for mac(无线音乐同步管理器)
  4. 携职教育:2022年人力资源管理师证书怎么考(报考攻略)
  5. 将360浏览器的收藏夹导入谷歌浏览器
  6. 基于MATLAB的数字图像处理系统GUI界面设计
  7. 第一站电子商务行业:消灭竞争对手的22个秘密武器
  8. 舞动的灵魂、这一季的雪、让我为自己感伤时间
  9. 如何跨楼层增强wifi信号 让wifi信号无死角?
  10. 《牛津字典精华总结》- 初阶系列 - 字母 - T