四数之和为target特定值的序列
来源:互联网 发布:休闲食品数据 编辑:程序博客网 时间:2024/06/05 02:33
一、算法思路是简单的
(1)先求出所有的两数之和,将和与下表存储到mutimap中;
(2)利用 val = { target-(1)两数和 } 去查询multimap ;
(3)如果查到,则记录下对应的序列;如果没有,则不用记录。
二、代码是复杂的
(1)有个四元组的operator< 重载问题,需要复杂的 if/else结构。原来设想的太简单的。
(2)需要multimap、set、vector的综合运用,才能完成复杂的逻辑。
(3)友元的使用还是第一次。
三、代码分为两部分,类以及main测试,如下:
(类):
class node{//friend bool operator==(const node &l,const node &r);//friend bool operator!=(const node &l,const node &r);friend class solution;friend bool operator< (const node &l,const node &r);friend ostream& operator<<(ostream& out,const node &four);public:node():first(0),second(0),third(0),forth(0){}node(int a,int b,int c, int d):first(a),second(b),third(c),forth(d){}public:int first;int second;int third;int forth;};/*bool operator==(const node &l,const node &r){return (l.first==r.first) && (l.second==r.second) && (l.third==r.third) && (l.forth == r.forth);}bool operator!=(const node &l,const node &r){return !(l==r);}*/bool operator<(const node &l,const node &r){//return r.first>l.first?(r.second>l.second?(r.third>l.third?(r.forth>l.forth?1:0):0):0):0;if(l.first<r.first) return true;else if(l.first>r.first) return false;else{if(l.second<r.second) return true;else if (l.second>r.second) return false;else{if(l.third<r.third) return true;else if(l.third>r.third) return false;else{if(l.forth<r.forth) return true;else if(l.forth>r.forth) return false;else return false;}}}}ostream& operator<<(ostream& out,const node &four){out<<four.first<<" "<<four.second<<" "<<four.third<<" "<<four.forth;return out;}class Solution {public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > res; vector<int> row; if(num.size()<4) return res; multimap<int,pair<int,int> > ht; multimap<int,pair<int,int> >::iterator it,pos; set<node> s; int n = num.size(); for(int i =0 ; i< n-1; ++i) for(int j =i+1 ; j<n;++j){ int tmp = num[i]+num[j]; //ht[tmp]=make_pair(i,j); ht.insert(make_pair(tmp,make_pair(i,j))); } for(it=ht.begin();it!=ht.end();++it){ int k = (*it).first; int key= target - k; if(ht.count(key)!=0) for(pos=ht.lower_bound(key);pos!=ht.upper_bound(key);++pos) if( (*it).second.first!= (*pos).second.first && (*it).second.second!= (*pos).second.second && (*it).second.second!= (*pos).second.first && (*it).second.first!= (*pos).second.second ){//cout<<"test "; //cout<<(*it).second.first<<" "<<(*it).second.second<<" "; //cout<<(*pos).second.first<<" "<<(*pos).second.second<<endl; row.clear(); row.push_back(num[(*it).second.first]); row.push_back(num[(*it).second.second]); row.push_back(num[(*pos).second.first]); row.push_back(num[(*pos).second.second]); sort(row.begin(),row.end()); node x(row[0],row[1],row[2],row[3]); //cout<<x<<endl; //x.first=row[0];x.second=row[1];x.third=row[2];x.forth=row[3]; //cout<<s.count(x)<<endl; if(s.find(x)==s.end()) {s.insert(x);res.push_back(row);} } } return res; }};
(测试):
#include <iostream>#include <algorithm>#include <map>#include <set>#include <vector>using namespace std;class node{//friend bool operator==(const node &l,const node &r);//friend bool operator!=(const node &l,const node &r);friend bool operator< (const node &l,const node &r);friend ostream& operator<<(ostream& out,const node &four);public:node():first(0),second(0),third(0),forth(0){}node(int a,int b,int c, int d):first(a),second(b),third(c),forth(d){}public:int first;int second;int third;int forth;};/*bool operator==(const node &l,const node &r){return (l.first==r.first) && (l.second==r.second) && (l.third==r.third) && (l.forth == r.forth);}bool operator!=(const node &l,const node &r){return !(l==r);}*/bool operator<(const node &l,const node &r){//return r.first>l.first?(r.second>l.second?(r.third>l.third?(r.forth>l.forth?1:0):0):0):0;if(l.first<r.first) return true;else if(l.first>r.first) return false;else{if(l.second<r.second) return true;else if (l.second>r.second) return false;else{if(l.third<r.third) return true;else if(l.third>r.third) return false;else{if(l.forth<r.forth) return true;else if(l.forth>r.forth) return false;else return false;}}}}ostream& operator<<(ostream& out,const node &four){out<<four.first<<" "<<four.second<<" "<<four.third<<" "<<four.forth;return out;}vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int> > res; vector<int> row; if(num.size()<4) return res; multimap<int,pair<int,int> > ht; multimap<int,pair<int,int> >::iterator it,pos; set<node> s; int n = num.size(); for(int i =0 ; i< n-1; ++i) for(int j =i+1 ; j<n;++j){ int tmp = num[i]+num[j]; //ht[tmp]=make_pair(i,j); ht.insert(make_pair(tmp,make_pair(i,j))); } for(it=ht.begin();it!=ht.end();++it){ int k = (*it).first; int key= target - k; if(ht.count(key)!=0) for(pos=ht.lower_bound(key);pos!=ht.upper_bound(key);++pos) if( (*it).second.first!= (*pos).second.first && (*it).second.second!= (*pos).second.second && (*it).second.second!= (*pos).second.first && (*it).second.first!= (*pos).second.second ){//cout<<"test "; //cout<<(*it).second.first<<" "<<(*it).second.second<<" "; //cout<<(*pos).second.first<<" "<<(*pos).second.second<<endl; row.clear(); row.push_back(num[(*it).second.first]); row.push_back(num[(*it).second.second]); row.push_back(num[(*pos).second.first]); row.push_back(num[(*pos).second.second]); sort(row.begin(),row.end()); node x(row[0],row[1],row[2],row[3]); //cout<<x<<endl; //x.first=row[0];x.second=row[1];x.third=row[2];x.forth=row[3]; //cout<<s.count(x)<<endl; if(s.find(x)==s.end()) {s.insert(x);res.push_back(row);} } } return res; }int main() {// your code goes herevector<int> num;int n;int target;int tmp;cin>>n>>target;for(int i=0 ; i<n; i++){cin>>tmp;num.push_back(tmp);}vector<vector<int> > res;res = fourSum(num,target);if(res.size()==0){cout<<"empty result "<<endl; return 0;}int row = res.size();//if(!row) return 0;int col = res[0].size();//if(!col) return 0;for(int i=0 ; i< row; i++){for(int j =0 ; j< col; j++)cout<<res[i][j]<<" ";cout<<endl;}return 0;}
0 0
- 四数之和为target特定值的序列
- 【算法世界】(八)找出数组中的两个数,使得二者之和为特定值target
- 【lintcode】两数之和、三数之和、最接近的三数之和、四数之和小结
- 2009年山东大学计算机复试上机题目,输入一个数,求所有连续序列之和为这个数的序列
- 找出数组中相加之和等于特定值的四个数
- 实现连续正整数之和为某个特定值【算法】
- 实现连续正整数之和为某个特定值【算法】
- 查找数组中和为特定值的两个数
- 题目:四数之和
- 四数之和
- lintcode-- 四数之和
- 三数之和为0的组合
- 在给定的序列中寻找两数之和为定值m的情况--对算法复杂度的分析与优化
- LintCode两数之和,三数之和,四数之和
- 寻找两数之和为某个值
- 算法10:给一个array和一个target value, 检查array里是否存在两个数之和为target
- 快速寻找满足条件的两个数(两数之和为给定值)
- 求各位数之和为5的数
- uvm_info信息定制
- nginx源码分析--请求体的读取(2)
- QwtPlotLayout解读---from Qwt-6.1.1
- 我是没得事
- Windows下Git bash乱码问题
- 四数之和为target特定值的序列
- 二叉树的先序,中序,后序递归和非递归实现
- nginx源码分析--多阶段请求处理
- Ajax Json示例
- 循环链表实现约瑟夫环
- 数组大折腾(3)
- uva 11853 Paintball dfs找连通块
- 设置图像的感兴趣区域(opencv1.0)
- JSON.stringify 和 JSON.parse