算法练习(8):4Sum
2017-09-26 20:58
274 查看
题意:因为上一道题刚好是找出三个数的,这次是找出四个数的,所以就刚好放在一起做了。
分析与思路:这次的解法跟上一道题的解法思路,完全一模一样,不需要改变算法,只需要在最外层再加一层循环,并不会超时。所以还是直接上代码吧
代码:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
if (nums.size() == 0 || nums.size() < 4) {//不满足条件的情况
return result;
}
sort(nums.begin(), nums.end());//对数组排序
for (int t = 0; t < nums.size() - 3; t++) {
if (t > 0 && nums[t] == nums[t - 1]) continue;
for (int it = t + 1; it < nums.size() - 2; it++) {
if (it > 0 && t != it - 1 && nums[it] == nums[it - 1]) continue;//对于同目标值的元素可以跳过,因为重复了
int targett = target - (nums[it]+nums[t]);
int l = it + 1, r = nums.size() - 1;//设置左右指针
while (l < r) {
if (nums[l] + nums[r] == targett) {
vector<int> re;
re.push_back(nums[t]);
re.push_back(nums[it]);
re.push_back(nums[l]);
re.push_back(nums[r]);
result.push_back(re);//把满足要求的组合加到答案中
while (nums[r] == nums[r - 1]) r--;//因为按照左指针不变的情况下,右值相同会得到相同组合
while (nums[l] == nums[l + 1]) l++;
r--;
l++;//已得匹配组合,则两端都需要移到分别跟原来不同值的位置才行
}
else {
if (nums[l] + nums[r] < targett) {//小于目标则左指针加1
l++;
}
else {
r--;
}
}
}
}
}
return result;
}
};
相关文章推荐
- poj2891和2018年全国多校算法寒假训练营练习比赛(第三场)B:一个小问题
- 每日算法练习之括号配对
- 2018年全国多校算法寒假训练营练习比赛(第四场)题解
- nowcoder 2018年全国多校算法寒假训练营练习比赛(第四场)-道路建设
- 算法练习(14):词法分析程序设计
- 算法练习(字符串压缩)
- 算法练习-excel地址转换
- 算法练习:两指针之三色排序
- 牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第四场)A.石油采集(dfs) B.道路建设(最小生成树prim) C.求交集(暴力) F.Call to your teacher(迪杰斯特拉乱用) H.老子的全排列呢(dfs)
- 2018年全国多校算法寒假训练营练习比赛(第一场)最强的决斗者一切都是必然的!
- 2018年全国多校算法寒假训练营练习比赛(第四场)E 题 通知小弟 强联通
- 算法练习3:Playing with digits
- 数据结构与算法(c语言) 学习笔记——第三章练习
- 算法练习笔记(七)——在BST树中的遍历
- 算法练习4:Buying a car
- [算法练习]找到单向链表的中间节点
- [算法导论]练习4.1-5最大连续子数组问题
- 2018年全国多校算法寒假训练营练习比赛(第四场) - D - 小明的挖矿之旅
- 筛选算法——算法练习
- 常见算法练习leetcode