求无序数组中四元素相加等于特定值的所有情况
来源:互联网 发布:mysql运行原理 编辑:程序博客网 时间:2024/05/16 23:48
/*************************************************************************************************description:给定一个无序数组和目标数target,要求返回数组中4个元素相加等于target的所有4元素组合** 要求:4个元素从小到大排列;不能返回重复的4元素组合** 如:Input: a={1 0 -1 0 -2 2},target=0** Output: (-1,0,0,1), (-2,-1,1,2),(-2,0,0,2)***********************************************************************************************/#include<iostream>#include<vector>#include<algorithm>#include<unordered_map>using namespace std;//方法一:先排序,然后对内层左右夹逼//时间复杂度为O(n^3)vector<vector<int>> fourSum_1(vector<int> &arr, int target){ vector<vector<int>> result; if (arr.size() < 4) return result; sort(arr.begin(), arr.end()); for (int i = 0; i < arr.size() - 3; i++) { if (i > 0 && arr[i] == arr[i - 1]) continue; for (int j = i + 1; j < arr.size() - 2; j++) { if (j > i + 1 && arr[j] == arr[j - 1]) continue; int m = j + 1; int n = arr.size() - 1; while (m < n) { if (arr[i] + arr[j] + arr[m] + arr[n] < target) m++; else if (arr[i] + arr[j] + arr[m] + arr[n] > target) n--; else { vector<int> group; group.push_back(arr[i]); group.push_back(arr[j]); group.push_back(arr[m]); group.push_back(arr[n]); result.push_back(group); m++; n--; while (arr[m] == arr[m -1]) m++; } } } } return result;}//方法二:用hashmap存储两个数之和,然后再两层遍历从hashmap中找到对应的数据//时间复杂度:平均O(n^2),最坏O(n^4),空间复杂度:O(n^2)vector<vector<int>> fourSum_2(vector<int> &arr, int target){ vector<vector<int>> result; if (arr.size() < 4) return result; sort(arr.begin(), arr.end()); unordered_map<int, vector<pair<int, int>>> cache; for (int i = 0; i < arr.size() - 1; i++) { for (int j = i + 1; j < arr.size(); j++) { cache[arr[i] + arr[j]].push_back(pair<int, int>(i, j)); } } for (int i = 0; i < arr.size(); i++) { for (int j = i + 1; j < arr.size(); j++) { int data = target - arr[i] - arr[j]; if (cache.find(data) != cache.end()) { for (int k = 0; k < cache[data].size(); k++) { if (i > cache[data][k].first && j > cache[data][k].second && i > cache[data][k].second) { vector<int> group; group.push_back(arr[cache[data][k].first]); group.push_back(arr[cache[data][k].second]); group.push_back(arr[i]); group.push_back(arr[j]); result.push_back(group); } } } } } return result;}//方法三:用multi hashmap存储两个数之和,然后再两层遍历从hashmap中找到对应的数据//时间复杂度:O(n^2),空间复杂度:O(n^2)vector<vector<int>> fourSum_3(vector<int> &arr, int target){ vector<vector<int>> result; if (arr.size() < 4) return result; sort(arr.begin(), arr.end()); unordered_multimap<int, pair<int, int>> cache; for (int i = 0; i < arr.size() - 1; i++) { for (int j = i + 1; j < arr.size(); j++) { cache.insert(pair<int, pair<int,int>>(arr[i] + arr[j],pair<int,int>(i,j))); } } for (auto i = cache.begin(); i != cache.end(); i++) { int data = target - i->first; auto range = cache.equal_range(data); for (auto j = range.first; j != range.second; j++) { int a = i->second.first; int b = i->second.second; int c = j->second.first; int d = j->second.first; if (c > b) { vector<int> group; group.push_back(arr[a]); group.push_back(arr[b]); group.push_back(arr[c]); group.push_back(arr[d]); result.push_back(group); } } } result.erase(unique(result.begin(), result.end()), result.end()); sort(result.begin(), result.end()); return result;}
阅读全文
0 0
- 求无序数组中四元素相加等于特定值的所有情况
- 求无序数组中三元素相加等于特定值的所有情况
- 求无序数组中两元素相加等于特定值的索引
- 数组中相加之和等于特定值的元素
- java 无序数组中两个元素相加等于指定的数 o(n)
- 求无序数组中三个元素相加与目标数最接近的三元素之和
- java求子集和,给定数组求这个数组中某些数字相加等于某个值的所有可能集合
- 求数组中两两元素相加等于20的组合种数
- java实现 数组中两个元素相加等于指定数的所有组合
- 找出数组中相加之和等于特定值的四个数
- 求数组中多个数相加等于某一值
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 数组中大于等于所有元素平均值的元素
- JAVA 在数组中求出所有和等于特定值的可能组合
- 给定一个整型数组,求数组元素大于等于所有元素平均值的元素个数
- 求无序数组中第二小的元素
- 经典算法学习——快速找出数组中两个数字,相加等于某特定值
- mysql-5.7.18-winx64 免安装配置
- ubuntu14.04 Torch7安装与配置GPU
- MATLAB求解线性规划(含整数规划和0-1规划)问题
- 《UNIX网络编程 卷1》 笔记: UNIX域协议
- leetcode-61. Rotate List
- 求无序数组中四元素相加等于特定值的所有情况
- 数据库事务隔离级别
- 实现字符串翻转和重复性验证
- USCAO-Section1.2 Milking Cows
- POJ 1988-Cube Stacking
- sql语句常用语
- Flipped 阅读笔记
- 关于PHP连接数据库SQL语句的易犯错误
- Kotlin入门____类和对象(二)