leetcode15 3Sum
2015-10-22 23:37
375 查看
题意就是给定一组数,任意选取三个数,每个数只能选取一次,找到所有三个数为0的组合,其实找到所有组合还是比较简单的,先固定一个数,之后两个数因为是在一个序列上选取,定义两个指针一个指向头一个指向尾,根据三个数的和是否大于0来决定往前走还是往后走,这样就简化成n^2的效率.
难点在去重上,先是用了vector的去重结果超时了.
之后就想重复的数一定就是产生重复序列的罪魁祸首,之后就利用三个while循环,略过所有一样的数,调了几次,果断ok了.还是逻辑上想的不够多,导致总是缺项,加强逻辑缜密性啊.
#include "iostream"
#include "vector"
#include "algorithm"
#include "string"
using namespace std;
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
int len = nums.size();
int right,left;
sort(nums.begin(),nums.end());
vector<vector<int> > result;
if(len < 3)
return result;
for(int i = 0 ; i < nums.size()-2; i++)
//cout<<"("<<nums[i]<<")\n";
{
if(nums[i]>0)
break;
if(i!=0)
{
if(nums[i] == nums[i-1])
continue;
}
//cout<<"("<<result.size()<<")"<<endl;
//-2 0 1 1 2
right = i+1;
left = nums.size()-1;
for(;right<left;)
{
if(nums[i]+nums[right]+nums[left] == 0)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[right]);
temp.push_back(nums[left]);
result.push_back(temp);
}
if(nums[i]>0)
break;
if(nums[i]+nums[right]+nums[left] > 0)
{
left--;
while(nums[left] == nums[left+1])
left--;
}
else
{
right++;
while(nums[right] == nums[right-1])
right++;
}
}
}
//sort(result.begin(), result.end());
//vector<vector<int> >::iterator last2;
//last2 = unique(result.begin(),result.end());
//result.erase(last2, result.end());
return result;
}
};
int main()
{
Solution test;
vector<int> num;
num.push_back(1);
num.push_back(1);
num.push_back(-2);
num.push_back(0);
num.push_back(2);
//num.push_back(0);
vector<vector<int> > result;
result = test.threeSum(num);
for(int i = 0 ; i < result.size(); i++)
{
cout<<i<<endl;
for(int j = 0 ; j < result[i].size(); j++)
{
cout<<"<"<<result[i][j]<<">"<<endl;
}
}
return 0;
}
难点在去重上,先是用了vector的去重结果超时了.
之后就想重复的数一定就是产生重复序列的罪魁祸首,之后就利用三个while循环,略过所有一样的数,调了几次,果断ok了.还是逻辑上想的不够多,导致总是缺项,加强逻辑缜密性啊.
#include "iostream"
#include "vector"
#include "algorithm"
#include "string"
using namespace std;
class Solution {
public:
vector<vector<int> > threeSum(vector<int>& nums) {
int len = nums.size();
int right,left;
sort(nums.begin(),nums.end());
vector<vector<int> > result;
if(len < 3)
return result;
for(int i = 0 ; i < nums.size()-2; i++)
//cout<<"("<<nums[i]<<")\n";
{
if(nums[i]>0)
break;
if(i!=0)
{
if(nums[i] == nums[i-1])
continue;
}
//cout<<"("<<result.size()<<")"<<endl;
//-2 0 1 1 2
right = i+1;
left = nums.size()-1;
for(;right<left;)
{
if(nums[i]+nums[right]+nums[left] == 0)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[right]);
temp.push_back(nums[left]);
result.push_back(temp);
}
if(nums[i]>0)
break;
if(nums[i]+nums[right]+nums[left] > 0)
{
left--;
while(nums[left] == nums[left+1])
left--;
}
else
{
right++;
while(nums[right] == nums[right-1])
right++;
}
}
}
//sort(result.begin(), result.end());
//vector<vector<int> >::iterator last2;
//last2 = unique(result.begin(),result.end());
//result.erase(last2, result.end());
return result;
}
};
int main()
{
Solution test;
vector<int> num;
num.push_back(1);
num.push_back(1);
num.push_back(-2);
num.push_back(0);
num.push_back(2);
//num.push_back(0);
vector<vector<int> > result;
result = test.threeSum(num);
for(int i = 0 ; i < result.size(); i++)
{
cout<<i<<endl;
for(int j = 0 ; j < result[i].size(); j++)
{
cout<<"<"<<result[i][j]<<">"<<endl;
}
}
return 0;
}
相关文章推荐
- IO中常用的方法
- maven环境搭建以及构建maven普通项目和web项目
- 文件“bin\Debug\WindowsFormsApplication2.exe”正由另一进程使用,因此该进程无法访问该文件。
- 解决 多列 布局
- JSP/Servlet-----11、Filter
- ubuntu vi/vim 基本使用方法
- [Ubuntu] Linux 解压乱码问题
- 待做的题
- java 中的try—catch异常处理
- 使用逻辑回归进行MNIST分类(Classifying MNIST using Logistic Regressing)
- 新手程序媛要怎么做
- 多个else if语句
- UITabBarController定制
- 在应用程序中使用RunSpace 3
- Jsoup获取网页源代码不一致的问题
- 2006年浙江大学1019简单计算器代码(栈的使用)
- Xcode升级到7.1出现itms-90049 错误 的解决办法
- 使用struts2+MySQL做简单的登录验证
- 二维数组查询
- samsung s3 gt-19300 开发 键盘回车事件