标签:blog io os ar for sp div on 问题
思路: 1.将数组排序,
2.a 遍历 数组a[0]....a[n-1];
3.当 a=a[i] 时 后面的问题 就是 : a[i+1] 到 a[n-1]中 b+c =-a (编程之美 2.12 快速寻找满足条件的两个数 )
记 b=a[j]=a[i-1] c=a[k]=a[n-1]
若 b+c < -a ,j++;
b+c > -a ,j--;
b+c=-a 记录下来,并j++;
4.还有一个问题 就是unique triplet, 所以 a=a[i] 要判断是否和a[i-1]相等,若相等,子问题已经解答。
也要判断 b和c 是否和之前的相同,若相同,就已经判断过了。
// 3Sum.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <algorithm> #include <iostream> using namespace std; bool myComp(int x1, int x2) { return x1 < x2; } class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { sort(num.begin(), num.end(), myComp); int p1 = 0, p2 = 0; vector<vector<int> > res; if (num.size() < 3) return res; for (int i = 0; i < num.size()-2; i++) { if (i>0 && num[i] == num[i - 1])continue; int sum = -num[i]; p1 = i + 1; p2 = num.size() - 1; while (p1<p2) { //while (p1!=1&&num[p1] == num[p1 -1])p1++; while ((p1!=i+1)&&num[p1] == num[p1-1])p1++; while ((p2!=num.size()-1)&&(p2>0)&&(num[p2] == num[p2 +1]))p2--; if (p1 >= p2)break; //cout << "(" << i << "," << p1 << "," << p2 << ")" << endl; if (num[p1] + num[p2] == sum) { vector<int>tempV; tempV.push_back(num[i]); tempV.push_back(num[p1]); tempV.push_back(num[p2]); res.push_back(tempV); //cout << "**" << i << "," << p1 << "," << p2 << endl; p2--; } else if (num[p1] + num[p2] > sum) { p2--; } else if (num[p1] + num[p2] < sum) { p1++; } } } return res; } }; int _tmain(int argc, _TCHAR* argv[]) { vector<int>test; /* test.push_back(-1); test.push_back(0); test.push_back(1); test.push_back(2); test.push_back(-1); test.push_back(-4); */ test.push_back(0); test.push_back(0); test.push_back(0); test.push_back(0); test.push_back(0); test.push_back(0); Solution ss; vector<vector<int> > res = ss.threeSum(test); //cout << res.size()<<endl; for (int i = 0; i < res.size(); i++) { for (int j = 0; j < res[i].size(); j++) cout << res[i][j] << ","; cout << endl; } system("pause"); return 0; }
标签:blog io os ar for sp div on 问题
原文地址:http://www.cnblogs.com/supernigel/p/4028708.html