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;}


原创粉丝点击