
题目
给定数组和target,从数组中找出4个数组成的所有list,使得每个的和都是target,返回的数组中不能有重复的元素。
分析
略(本文写出nSum的通用方法)
C++代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); vector<vector<int>> res = nSum(nums, 0, 4, target); return res; }
vector<vector<int>> nSum(vector<int>& nums, int begin, int count, int target){ vector<vector<int>> res; if(count == 2){ int i = begin; int j = nums.size() - 1; while(i < j){ int x = nums[i], y = nums[j]; if(x + y == target){ vector<int> tmp; tmp.push_back(nums[i]); tmp.push_back(nums[j]); res.push_back(tmp); while(i < nums.size() && nums[i] == x) i++; while(j >= begin && nums[j] == y) j--; } else if(x + y < target) i++; else j--; } } else { for(int i = begin; i < nums.size(); i ++){ if(i > begin && nums[i] == nums[i-1]) continue; vector<vector<int>> tmp = nSum(nums, i + 1, count - 1, target - nums[i]); if(!tmp.empty()){ for(int j = 0; j < tmp.size(); j++){ tmp[j].push_back(nums[i]); res.push_back(tmp[j]); } } } } return res; } };
|
近期评论