面试题整理-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,a ≤b ≤c)
- 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上提交通过。
- 面试题整理-3数之和为0
- 【Killua笔试面试题整理】连续整数之和为1000
- 面试题---两数之和
- 【Killua笔试面试题整理】连翻7张日历之和为138
- 3sum 三个数之和为0
- 剑指offer面试题之和为S的两个数字
- 【IT笔试面试题整理】丑数
- 3Sum 数组找3数之和为0 @LeetCode
- 3sum 三数之和为0的简单实现
- 三数之和为0的组合
- 【IT笔试面试题整理】把n个骰子扔在地上,所有骰子朝上一面的点数之和为S概率-转
- Android面试题整理-3
- Android面试题整理-3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题:不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- iphone开发之数据库CoreData
- 设计模式(九)——Observer 模式
- 由1图得到在2图中的显示,但是不画出来
- BigPipe 应用:新浪微博
- struts2架构剖析-Action
- 面试题整理-3数之和为0
- oracle数据库sql使用 select over 方法(网上整理编辑)
- 防止你的iPhone程序遭盗版(入门篇)
- TNSPING命令
- 递归总结(待完善)
- 备份我的vi配置
- 面试题整理-大数求和
- 动态内存分配函数
- matlab图像处理函数