LeeCode数组第15题三数之和
题目:三数之和
内容:
给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路:
题目实现可分为两个步骤,分别是(1)寻找三个满足条件的元素(2)去重复
对于第一个小问题,首先考虑三个for循环,直接寻找
1.第一个数字(num1)选取范围1~n
2.第二个数字(num2)选取范围num1+1~n
3.第三个数字(num3)选取范围num2+1~n
代码如下:
//寻找三数之和为0的数 C++
vector<int> vec();
unsigned int num1 = , num2 = , num3 = ;
for (num1; num1 < nums.size() - ; num1++){
for (num2 = num1 + ; num2 < nums.size() - ; num2++){
for (num3 = num2 + ; num3 < nums.size(); num3++){
if (nums[num1] + nums[num2] + nums[num3] == ){
vec[] = nums[num1];
vec[] = nums[num2];
vec[] = nums[num3];
vecs.push_back(vec);
}
}
}
}
第二个小问题去重复
C++ 的STL提供有去重算法unique,直接去重即可
1.在寻找满足条件的三个数字之前要先排序,防止相同的vec因为内部元素顺序不同去不了重复,如[1,2,3]和[2,1,3]会判定为不重复
2.对于vecs结果进行去重,去重之前一定要再次排序,因为unique函数只是比较相邻的两个元素是否重复,如果重复就将重复的放到尾部,如果不限排序,对于vecs[[1,2,3],[0,0,0],[1,2,3]],因为相邻的元素都不想等([1,2,3]≠[0,0,0]),系统会去重失败
去重代码如下:
//先排序,方便去重
sort(nums.begin(), nums.end());
//寻找三个满足条件的数字代码省略。。。。
//去重
sort(vecs.begin(), vecs.end());
vecs.erase(unique(vecs.begin(), vecs.end()), vecs.end()); return vecs;
此外,还要考虑异常的情况,当传入的数组长度小于3时,无法给出满足条件的解,应返回空的容器
完整代码如下:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> vecs;
//异常判断
if (nums.size() < )
return vecs; //先排序,方便去重
sort(nums.begin(), nums.end()); //寻找三数之和为0的数
vector<int> vec();
unsigned int num1 = , num2 = , num3 = ;
for (num1; num1 < nums.size() - ; num1++){
for (num2 = num1 + ; num2 < nums.size() - ; num2++){
for (num3 = num2 + ; num3 < nums.size(); num3++){
if (nums[num1] + nums[num2] + nums[num3] == ){
vec[] = nums[num1];
vec[] = nums[num2];
vec[] = nums[num3];
vecs.push_back(vec);
}
}
}
} //去重
sort(vecs.begin(), vecs.end());
vecs.erase(unique(vecs.begin(), vecs.end()), vecs.end()); return vecs;
}
对于较短的输入,能给出合适的结果,然后对于巨长的数组,系统提示运算时间过长,因此需要优化代码。
根据题目所给的条件,可以看出三个数字之和是定值,因此,当我们选取第一个数字num1后,问题变为寻找和为0-num1的两个数字。
可以观察到,因为数组是有序的,我们可以设置两个指针从两边同时选取
int targetSum = - nums[num1];
while (pLeft < pRight ){
int sum = nums[pLeft] + nums[pRight];
if (sum > targetSum || nums[pRight] == nums[pRight-]){
pRight--;
}
else if (sum < targetSum || nums[pLeft] == nums[pLeft - ]){
pLeft++;
}
else{
vec[] = nums[num1];
vec[] = nums[pLeft];
vec[] = nums[pRight];
vecs.push_back(vec);
pLeft++;
pRight--;
}
}
也因为数组是排序的,为了如果我们选取的第一个数子大于0,则后两个必然大于0,可以跳出循环
对于重复的数字,我们可以选择跳过
完整代码如下:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> vecs;
//异常判断
if (nums.size() < )
return vecs; //先排序,方便去重
sort(nums.begin(), nums.end()); //寻找三数之和为0的数
vector<int> vec();
unsigned int num1 = , num2 = , num3 = ;
for (num1; num1 < nums.size() - ; num1++){
if (nums[num1] * > )//数组是从小到大排序
break;
if (num1 != && nums[num1] == nums[num1 - ])
continue; int pLeft, pRight;
pLeft = num1+;
pRight = nums.size() - ; int targetSum = - nums[num1];
while (pLeft < pRight ){
int sum = nums[pLeft] + nums[pRight];
if (sum > targetSum || nums[pRight] == nums[pRight-]){
pRight--;
}
else if (sum < targetSum || nums[pLeft] == nums[pLeft - ]){
pLeft++;
}
else{
vec[] = nums[num1];
vec[] = nums[pLeft];
vec[] = nums[pRight];
vecs.push_back(vec);
pLeft++;
pRight--;
}
}
} //去重
sort(vecs.begin(), vecs.end());
vecs.erase(unique(vecs.begin(), vecs.end()), vecs.end()); return vecs;
}
对于复杂测试案例的运行时间是60ms,通过题目!
LeeCode数组第15题三数之和的更多相关文章
- LeetCode 第15题-三数之和
1. 题目 2.题目分析与思路 3.思路 1. 题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且 ...
- leetcode 刷题(数组篇)15题 三数之和 (双指针)
很有意思的一道题,值得好好思考,虽然难度只有Mid,但是个人觉得不比Hard简单 题目描述 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b ...
- [LeetCode] 15. 3Sum 三数之和
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- 【LeetCode】15、三数之和为0
题目等级:3Sum(Medium) 题目描述: Given an array nums of n integers, are there elements a, b, c in nums such t ...
- 【LeetCode】15. 3Sum 三数之和
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...
- [leetcode]15. 3Sum三数之和
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...
- Leetcode(15)-三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- 【LeetCode 15】三数之和
题目链接 [题解] 先把n个数字升序排个序. 然后枚举三元组最左边的那个数字是第i个数字. 之后用两个指针l,r移动来获取三元组的第2个和第3个数字. (初始值,l=i+1,r = n-1); 如果a ...
- [LeetCode] 259. 3Sum Smaller 三数之和较小值
Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ...
随机推荐
- web多语言url的设计
因为项目要支持国际化,最近跟一个同事在讨论多语言版本下面url如何设计,假如我们需要支持en和cn的版本. 他倾向于支持如下的url格式,后续以格式1指代: /en/group/abc.html /c ...
- Android Studio 从安装到配置使用
Android Studio是谷歌为android量身定制的IDE,在2013年谷歌大会上提出之后一直持续更新,现在已经是功能十分强劲的android开发工具,作为一个android开发者,还是早点转 ...
- CTBS问题百科
1.浏览CTBS网站时,Service Unavailable或应用程序池自动停止的现象 解决方法: 点击"开始"-"控制面板"-"管理工具" ...
- linux内核代码的编写初步以及makefile的配置
在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准 而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块. 在GNU C标准中, ...
- 01_MUI之Boilerplate中:HTML5示例,动态组件,自定义字体示例,自定义字体示例,图标字体示例
1安装HBuilder5.0.0,安装后的界面截图如下: 2 按照https://www.muicss.com/docs/v1/css-js/boilerplate-html中的说明,创建上图的 ...
- eclipse搭建ssh后台
SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring, ...
- Windows CE Notification API的使用方法
1 引言 以Windows CE 为操作系统的掌上电脑(如PocketPC或HPC),除具备PC的功能外,还具备很强的自身控制能力.Windows CE API超越微软其他操作系统的 API ...
- STL - miltimap(可重映射)
#include <iostream> #include <map> #include <string> using namespace std; //Multim ...
- .NET(C#)连接各类数据库代码-集锦
1.C#连接连接Access 复制代码代码如下: using System.Data; using System.Data.OleDb; .. string strConnection=& ...
- Git错误一例
Bitbucket一直不稳定,push, pull经常失效.幸好还有goagent可以用. 把git的全局配置改为走goagent代理,可以正常使用: [http] proxy = http://12 ...