LeetCode 3Sum
来源:互联网 发布:jni 传递byte数组 编辑:程序博客网 时间:2024/05/20 01:39
想法:先排序,先考虑0的情况(三个以上连续的0),再考虑绝对值相同的数值,再考虑不包括0的情况,两个正数和为一个负数,或者两个负数的和为一个正数。这样的结果会包含重复的元素,最后再去掉重复的。提交时自己写的针对容器的容器去重和排序在本地VS2008下编译通过,但是提交不通过,去掉自己的比较函数,直接去重居然也好使,通过了。
// LeetCode_3Sum.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <vector>#include <algorithm>using namespace std;bool lessthan(const vector<int> &vec1,const vector<int> &vec2){return vec1[0]<vec2[0];}bool equal(const vector<int> &vec1,const vector<int> &vec2){int lenvec1 = vec1.size();int lenvec2 = vec2.size();if (lenvec1 != lenvec2)return false;for (int i=0;i<lenvec2;i++){if (vec1[i] != vec2[i]){return false;}}return true;}vector<vector<int> > threeSum(vector<int> &num) {int numlen = num.size();sort(num.begin(),num.end());//sort(num.begin(),num.end(),less<int>())bool flag;vector<vector<int>> ret;vector<int> retelem;vector<int>::iterator pos = find(num.begin(),num.end(),0);vector<int>::iterator conterpos;if (pos == num.end())flag = false;elseflag = true;if (flag){vector<int>::iterator iterzero = find(num.begin(),num.end(),0);if(iterzero+2<num.end()&&*(iterzero+2)==0){retelem.push_back(0);retelem.push_back(0);retelem.push_back(0);ret.push_back(retelem);retelem.clear();}vector<int>::iterator iter = num.begin();while(iter!=pos){conterpos = find(pos,num.end(),-*iter);if (conterpos!=num.end()){retelem.push_back(*iter);retelem.push_back(0);retelem.push_back(-*iter);ret.push_back(retelem);retelem.clear();}iter++;}}vector<int>::iterator iteredge = num.begin();while(iteredge!=num.end()&&*iteredge<0) iteredge++;if (iteredge==num.begin()||iteredge==num.end()){return ret;}vector<int>::iterator iter1front = num.begin();vector<int>::iterator iter2front = iteredge;vector<int>::iterator iter1back,iter2back;while (iter1front != iteredge){iter1back = iteredge;iter2back = num.end()-1;while(iter1back<iter2back){if (*iter1back + *iter2back == -*iter1front){retelem.push_back(*iter1front);retelem.push_back(*iter1back);retelem.push_back(*iter2back);ret.push_back(retelem);retelem.clear();iter2back--;iter1back++;}else{if (*iter1back + *iter2back > -*iter1front)iter2back--;elseiter1back++;}}iter1front++;}iter1back = iteredge;while(iter1back != num.end()){iter1front = num.begin();iter2front = iteredge-1;while(iter1front<iter2front){if (*iter1front + *iter2front == -*iter1back){retelem.push_back(*iter1front);retelem.push_back(*iter2front);retelem.push_back(*iter1back);ret.push_back(retelem);retelem.clear();iter1front++;iter2front--;}else{if (*iter1front + *iter2front > -*iter1back)iter2front--;elseiter1front++;}}iter1back++;}sort(ret.begin(),ret.end());//sort(ret.begin(),ret.end(),lessthan);ret.erase(unique(ret.begin(),ret.end()),ret.end());//ret.erase(unique(ret.begin(),ret.end(),equal),ret.end());return ret;}int _tmain(int argc, _TCHAR* argv[]){vector<int> vec;vec.push_back(-1);//{-1 0 1 2 -1 -4}vec.push_back(0);//vec.push_back(0);//vec.push_back(0);vec.push_back(0);vec.push_back(1);vec.push_back(2);vec.push_back(-1);vec.push_back(-4);vector<vector<int> > ret;ret = threeSum(vec);int retlen = ret.size();for (int i=0;i<retlen;i++){for(int j=0;j<ret[i].size();j++)cout<<ret[i][j]<<" ";cout<<endl;}system("pause");return 0;}
- 【Leetcode】3Sum (Sum)
- Leetcode:2Sum,3Sum
- 【Leetcode】3Sum Closest (Sum)
- leetcode 2 sum 3sum 4sum
- Leetcode 2SUM-3SUM-4SUM
- Leetcode-2sum,3sum,4sum
- leetcode 2 sum & 3 sum & 4 sum
- [LeetCode] 2Sum, 3Sum, 4Sum, 3SUm closet
- [LeetCode] K sum(2Sum、3Sum、4Sum)
- leetcode--sum集合:2sum,3sum,4sum
- leetcode --- 2 sum , 3 sum , 4 sum , k sum problem
- LeetCode: 3Sum
- LeetCode: 3 Sum Closest
- leetcode - 3 Sum
- leetcode - 3 sum closest
- leetcode 3Sum
- leetcode 3Sum Closest
- LeetCode: 3Sum
- Linux下多个命令的组合方式小结
- 机器学习、数据挖掘、计算机视觉等领域经典书籍推荐
- 从头到尾彻底理解傅里叶变换算法
- 解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'(using password: YSE)
- PHP6 中get_magic_quotes_gpc()函数
- LeetCode 3Sum
- 软件架构师应该知道的97件事
- 生存作用의 生․ 長․ 成
- 大数据处理的基本思路
- android:intent flags
- 新手建MAVEN (2)
- Linux下管道命令的汇编自结
- union的用法以及struct的初始化
- 一道看到的面试题 [写一个函数,比较2个整数大小,但不是用任何比较操作符]