LeetCode(C++)刷题计划:15-三数之和
15-三数之和
@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com
Category | Difficulty | Pass rate | Tags | Companies |
---|---|---|---|---|
algorithms | Medium | 24.31% | array / two-pointers | adobe / amazon / bloomberg / facebook / microsoft |
1. 题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c,a,b,c ,a,b,c,使得 a+b+c=0a + b + c = 0a+b+c=0 ?找出所有满足条件且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[[-1, 0, 1],[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum/
2. 解法
2.1 解法一:双指针法
- 首先对数组从大到小排序,数组的大小为
n
。 - 固定一个数,从其右侧的数中寻找另外两个数。
假设我们固定的数为nums[k], k = 0 to n-1
, 另外两个数初始时分别为nums[l], nums[r]
, 其中l = k + 1, r = n - 1
。 - 令
sum = nums[k] + nums[l] + nums[r]
。- 若
sum < 0
,则我们要增大sum
,此时只能对l
向右挪一格,即:l ++
。 - 若
sum > 0
,则我们要减小sum
,此时只能对r
向左挪一格,即:r --
。 - 若
sum == 0
,此时这三个数就我们需要的数,将他们加入结果里。此时,l
和r
之间的数还可能有我们需要的数,我们此时需要左右都向内移动,即:l ++, r --
。。
- 若
- 避免重复的数据。
- 当
sum == 0
时,我们需要l
和r
都向内移动。此时需要过滤掉和当前nums[l], nums[r]
重复的数据,我们巧妙的使用了两个while循环,同时需注意l 要一直小于 r
。
while (l < r && nums[l] == nums[++ l]) { }
while (l < r && nums[r] == nums[-- r]) { }
- 同时,我们也要在
k
的循环中过滤掉和当前nums[k]
重复的数字。这里的k < len - 2
主要是防止数组越界。
while (k < len - 2 && nums[k] == nums[++ k]) { }
- 当
- 当
l >= r
时,说明与当前固定的nums[k]
相组合的两个数已经找完,所以要进入下一个nums[k]
。
执行用时: 112 ms, 在所有 cpp 提交中击败了98.73%的用户
内存消耗: 14.6 MB, 在所有 cpp 提交中击败了86.17%的用户
class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;int len = nums.size();if (len < 3) {return res;}sort(nums.begin(), nums.end());int k = 0;while(k < len - 2 && nums[k] <= 0) {int l = k + 1;int r = len - 1;while (l < r) {int sum = nums[k] + nums[l] + nums[r];if (sum == 0) {res.push_back({nums[k], nums[l], nums[r]});while (l < r && nums[l] == nums[++ l]) { }while (l < r && nums[r] == nums[-- r]) { }}else if (sum < 0) {++ l;}else {-- r;}}while (k < len - 2 && nums[k] == nums[++ k]) { }}return res;}
};
LeetCode(C++)刷题计划:15-三数之和相关推荐
- LeetCode刷题笔记- 15.三数之和
LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...
- 【leetcode刷题】21.三数之和——Java版
⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 一题二写,三数之和,题解四瞅五瞄六瞧,水平还七上八下九流,十分辣鸡. --leetcode此题热评 前言 哈喽,大家好,我是一条. ...
- Leetcode题库 15.三数之和_0(双指针 C实现)
第二次尝试结果:成功 第二次成果链接:三数之和 第一次尝试结果:失败 第一次过程如下 #include <stdio.h>void Bub_Sort(int* head, int low, ...
- Leetcode题库 15.三数之和_1(双指针 C实现)
第二次尝试结果:成功 第二次过程如下 #include <stdio.h>void Bub_Sort(int* head, int low, int high, int Bool) {// ...
- Bia布刷题日记 LC-15 三数之和
Leecode 540 有序数组中的单一元素 算法描述: 540.有序数组中的单一元素给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个 ...
- Leetcode python《热题 HOT 100》15. 三数之和
Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...
- leetcode每日刷题计划-简单篇day8
leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...
- LeetCode 15. 三数之和(3Sum)
15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...
- [双指针|模拟] leetcode 15 三数之和
[双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...
最新文章
- python27-python27安装
- 路径调度问题(CVRP)后续之如何在MATLAB中安装YALMIP及CPLEX包
- Spring Cloud Stream整合RabbitMQ
- Linux虚拟机示范
- PHP学习笔记--抽象类和抽象方法的应用
- 最大子树和(洛谷-P1122)
- 收藏 | 机器学习领域必知必会的12种概率分布(附Python代码实现)
- 浅谈CDN技术的性能与优势
- Lucene.Net
- pdf文字无法复制怎么办?unlock解密pdf
- 空间计量模型_5种经典空间计量模型的回归命令、程序及原始数据:SAR模型、SDM模型、SAC模型、SEM模型及GSPRE模型...
- 苹果笔记本linux系统安装教程视频教程,苹果系统安装教程,小编教你苹果电脑怎么重装系统...
- 【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法
- 告别拼接模板 —— 阿里妈妈动态描述广告创意
- Message: session not created: This version of ChromeDriver only supports Chrome version XX
- windows 连接蓝牙耳机失败 解决方法
- 第5章 以太网与FlexRay
- Linux服务器搭建----Web服务器(apache)
- Smss.exe 进程分析--NT 源码--当机方法
- Pauling学编程打卡
热门文章
- vue后台管理、APP项目总结集合
- IDEA类和方法注释模板
- 乐玩插件和大漠插件哪个好_教您用好Home Assistant各种插件系列之媒体播放器插件DLNA_DMR...
- 360的声明腾讯要挟用户卸载360周总真有招啊!看看大家相信谁。
- 即兴噱头所没有的幽默感
- Android消息推送:第三方消息推送平台详细解析
- 难道ERP"死了",中台"凉了",低/无代码要称王了?
- ubuntu数字小键盘不能输入数字解决办法
- 2012第20周国内Android应用下载排行榜动态
- Celery - 最佳实践