面试题整理-3数之和为0

来源:互联网 发布:linux vnc安装 编辑:程序博客网 时间:2024/05/16 14:46

Given an array S of n integers, are there elements a,b,c inS such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie,abc)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},    A solution set is:
(-1, -1, 2)
(-1, 0, 1)

注意输出的次序是由小到大。首先比较的是第一个数。然后第二个数。

说一下大致思路:

先求出两数之和S,再利用hash表查看一下是否有-s在数组中存在。如果有,并且位置与前面两数不同。则放入结果中。


注意的是,在每个三元组中,每个位置的数只能用一次。

重复的三元组不用多次输出,比如0 0 0 0 0  0输出0 0 0 就可以了。

然后就是注意排序。

粘个代码。

#include <iostream>#include <vector>#include <set>#include <algorithm>#include <ext/hash_map>using namespace std;using namespace __gnu_cxx;class node{public:    int x[3];    void sort() { std::sort(x, x + 3);}node(){memset(x, 0, sizeof(x));}node(const node &n) { (*this) = n; }node &operator = (const node &n){x[0] = n.x[0]; x[1] = n.x[1]; x[2] = n.x[2];return (*this);}bool operator == (const node &a) const{return x[0] == a.x[0] && x[1] == a.x[1] && x[2] == a.x[2];}bool operator < (const node &a) const {if (x[0] < a.x[0]) return true;if (x[0] > a.x[0]) return false;if (x[1] < a.x[1]) return true;if (x[1] > a.x[1]) return false;if (x[2] < a.x[2]) return true;return false;}};class Solution{private:vector<vector<int> > m_matrix;set<node>     m_set;public:vector<vector<int> > &threeSum(vector<int> &vs){node x;m_set.clear();vector<int> v;m_matrix.clear();hash_map<int, vector<int> > rec;for (int i = 0; i < vs.size(); ++i){hash_map<int, vector<int> >::iterator iter = rec.find(vs[i]);if (rec.end() == iter){v.clear(); v.push_back(i);rec.insert(pair<int, vector<int> >(vs[i], v));} else {iter->second.push_back(i);}}for (int i = 0; i < vs.size(); ++i){for (int j = i + 1; j < vs.size(); ++j){const int s = vs[i] + vs[j];hash_map<int, vector<int> >::iterator iter = rec.find(-s);if (rec.end() != iter){for (int k = 0; k < iter->second.size(); ++k){const int t = (iter->second)[k];if (t != i && t != j){x.x[0] = vs[i]; x.x[1] = vs[j]; x.x[2] = vs[t];x.sort();m_set.insert(x);}}}}}for (set<node>::iterator iter = m_set.begin(); iter != m_set.end(); ++iter){vector<int> x(iter->x, (iter->x)+3);m_matrix.push_back(x);}return m_matrix;}void printf(){for (int i = 0; i < m_matrix.size(); ++i){for (int j = 0; j < m_matrix[i].size(); ++j){cout << m_matrix[i][j] << ",";}cout << endl;}}};

我这里用的是Dev C++。能够在Leetcode上提交通过。


原创粉丝点击