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

Given an array S of n integers, are there elements a,b,c in S 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上提交通过。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值