博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 4Sum
阅读量:6250 次
发布时间:2019-06-22

本文共 1650 字,大约阅读时间需要 5 分钟。

题目描述: 给定一个包含n个整数的数组S和目标整数target,在S中找4个整数a,b,c,d,使得这a + b + c + d = target。找出所有符合这种情况的四元组。最终结果中的四元组要唯一且四元组内元素非降序。
题目来源
题目分析: 先对数组排序,然后构造键为某个和sum,值为所有符合和为sum的元素对的map结构。枚举第一和第二个元素,通过target值得到剩余两个元素的和sum1,使用map中的和为sum1的对象构造第三和四个元素。 正确性说明,假设结果集中某个四元组为a,b,c,d,枚举a,b,通过map中键为target - a - b的值中可以找到c,d,所以解一定在结果集中,剩下的是去掉重复的四元组。使用另一个map对象记录计算过程中已经出现的a,b,这样保证元素对a,b不会重复计算。在对原数组排过序的情况下,如果存在多个相同的元素对,可以保证值相同的元素对在上面介绍的第一个map中的位置相邻,那么可以通过和在结果集中的最近添加的四元组比较来保证元素对c,d不重复(a,b元素对确定的情况下)。
示例代码:
vector
> fourSum(vector
&num, int target) { vector
> ans; sort(num.begin(),num.end()); map
> > m; map
, int> sign; int anssize = 0; int numsize = num.size(); for(int i = 0; i < numsize; ++i) { for(int j = i + 1; j < numsize; ++j) { m[num[i] + num[j]].push_back(pair
(i,j)); } } for(int i = 0; i < numsize; ++i) { for(int j = i + 1; j < numsize; ++j) { if(sign.find(pair
(num[i], num[j])) != sign.end()) continue; sign[pair
(num[i], num[j])] = 1; int x = (target - num[i] - num[j]); if(m.find(x) != m.end()) { for(vector
>::iterator it = m[x].begin(); it != m[x].end(); ++it) { if(it->first <= j) { continue; } if(anssize == 0 || ans[anssize - 1][0] != num[i] || ans[anssize - 1][1] != num[j] || ans[anssize - 1][2] != num[it->first] ) { vector
tmp; tmp.push_back(num[i]); tmp.push_back(num[j]); tmp.push_back(num[it->first]); tmp.push_back(num[it->second]); ans.push_back(tmp); ++anssize; } } } } } return ans;}

 

转载于:https://www.cnblogs.com/daijinqiao/p/3348645.html

你可能感兴趣的文章
区块链游戏导航,一个不错的生意!
查看>>
【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)
查看>>
安装BOSH -在vSphere上通过BOSH工具大规模部署Cloud Foundry
查看>>
采用python的pyquery引擎做网页爬虫,进行数据分析
查看>>
阿里上市,他们如是说
查看>>
HTML将不再有版本号
查看>>
Eclipse代码中中文字显示很小的解决办法
查看>>
ArchLinux and LXDE and LXDM
查看>>
藏头诗琐谈
查看>>
Python分布式+云计算
查看>>
jconsole weblogic
查看>>
VIM快捷键:
查看>>
javascript Date format(js日期格式化)
查看>>
.net中获得Java中currentTimeMillis
查看>>
经典算法题每日演练——第一题 百钱买百鸡
查看>>
DomainUpDown与NumericUpDown
查看>>
POJ-1019 Number Sequence 二分查找
查看>>
ecshop模板<!-- TemplateBeginEditable name="左上角主区域" -->用法
查看>>
Spring中使用Quartz(一)
查看>>
C#教程之自己动手写映射第六节[封装列表]
查看>>