【LeetCode】18_4Sum
来源:互联网 发布:逛1小时淘宝用多少流量 编辑:程序博客网 时间:2024/05/16 09:43
题目
4Sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0 -1 0 -2 2}, and target = 0. A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)
解析
还是那一套类似的。
前两个进行循环,后两个查找固定和即可。
我的代码如下
结果报错了,超时。
class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;if(nums.size()<4)return ret;sort(nums.begin(), nums.end()); for (int i = 0; i<nums.size()-3; i++){if (i>0 && nums.at(i)==nums.at(i-1)){continue;}for (int j = i+1; j<nums.size()-2;j++){if (j>i+1 && nums.at(j)==nums.at(j-1)){continue;}int m = j+1;int n = nums.size()-1;while (m<n){if (nums.at(i)+nums.at(j)+nums.at(m)+nums.at(n) > target){n--;while (m<n && nums.at(n) == nums.at(n+1))n--;}else if (nums.at(i)+nums.at(j)+nums.at(m)+nums.at(n) < target){m++;while (m<n && nums.at(m)==nums.at(m-1))m++;}else{vector<int> tmp;tmp.push_back(nums.at(i));tmp.push_back(nums.at(j));tmp.push_back(nums.at(m));tmp.push_back(nums.at(n));ret.push_back(tmp);n--;m++;while (m<n && nums.at(n)==nums.at(n+1))n--;while (m<n && nums.at(m)==nums.at(m-1))m++;}}}}return ret; } };看看大神的吧。
vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int>> out; set<vector<int>> res; if (num.size() < 4) return out; sort(num.begin(), num.end()); for (int i=0; i<num.size()-3; i++) { for (int j =i+1;j<num.size()-2;j++) { int begin = j+1; int end = num.size()-1; while(begin < end){ int sum = num[i] + num[j] + num[begin] + num[end]; if (sum== target) { vector<int> tmp; tmp.push_back(num[i]); tmp.push_back(num[j]); tmp.push_back(num[begin]); tmp.push_back(num[end]); res.insert(tmp); begin++; end--; } else if(sum < target) { begin++; }else{ end--; } } } } set<vector<int>>::iterator it = res.begin(); for(; it != res.end(); it++) out.push_back(*it); }
用集合来去除重复元素的思想确实很赞。
我把自己代码里也改成使用set,结果还是超时!
于是我把自己代码里的nums.at(i)全部改成了nums[i]于是就accept了。看来这个非常影响性能。可能跟at会进行边界检查有关系。在实际使用中使用at比较好,越界会出错。而[]则行为未定义。
不过,在刷题中:[]的效率比at高,这个需要记住。
改正后如下
class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;set<vector<int>> res;if(nums.size()<4)return ret;sort(nums.begin(), nums.end()); for (int i = 0; i<nums.size()-3; i++){for (int j = i+1; j<nums.size()-2;j++){int m = j+1;int n = nums.size()-1;while (m<n){int sum = nums[i]+nums[j]+nums[m]+nums[n];if ( sum > target){n--;}else if (sum < target){m++;}else{vector<int> tmp;tmp.push_back(nums[i]);tmp.push_back(nums[j]);tmp.push_back(nums[m]);tmp.push_back(nums[n]);res.insert(tmp);n--;m++;}}}}set<vector<int>>::iterator it = res.begin();for (;it != res.end();it++){ret.push_back(*it);}return ret; } };
0 0
- 【LeetCode】18_4Sum
- LeetCode 18_4Sum
- LeetCode之18_4Sum
- leetcode第一刷_4Sum
- 0018_4Sum
- leetcode 18
- Leetcode 18
- Leetcode(18)
- LeetCode 18: 4Sum
- [LeetCode] Implement strStr() [18]
- Leetcode【18】:Letter Combinations
- LeetCode 18 Gas Station
- [leetcode 18] 4Sum
- [leetcode] 18 4Sum
- leetcode.18--------------4Sum
- [leetcode]18 Min Stack
- leetcode 18 4Sum
- LeetCode---(18) 4 Sum
- POJ-3090 Visible Lattice Points
- 四种常见的 POST 提交数据方式
- 跟踪框修正
- Session丢失罪魁祸首之BIN目录
- msi 中断的写tlp包在哪里产生?
- 【LeetCode】18_4Sum
- excel中将一张表中数据拆分成多个工作表,按部门不相同的拆分成单个工作表,且单个工作表名及为部门
- Eclipse 打开报错Java was Started but Returned Exit Code=13
- BZOJ1037
- 杭电 HDU 1219 java AC Me
- MT7620_看门狗(Watchdog)驱动
- 全局变量的另一种思路
- Git管理修正(取消跟踪、合并commit)
- hdoj 1896 Stones