LeetCode 18 4Sum
2018-03-10 22:30
513 查看
LeetCode 18 4Sum
Description
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: 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] ]
解题思路
求出所有的两个数的和,问题转化为2Sum,二分即可,用Set去重。代码
class Solution { public: struct sum { sum(int a, int b, int aIdx, int bIdx) : a(a), b(b), aIdx(aIdx), bIdx(bIdx) { c = a + b; } int a, b, c; int aIdx, bIdx; bool operator<(const sum &x) const { return c < x.c; } }; bool checkSum(sum &x, sum &y) const { return x.aIdx != y.aIdx && x.bIdx != y.bIdx && x.aIdx != y.bIdx && x.bIdx != y.aIdx; } int lowerBound(const vector<sum> &sums, int target) { int l = -1, r = (int) sums.size() - 1, mid = (l + r) >> 1; while (r - l > 1) { if (sums[mid].c < target) { l = mid; } else { r = mid; } mid = (l + r) >> 1; } return r; } vector<vector<int>> fourSum(vector<int> &nums, int target) { vector<sum> sums; set<vector<int>> ansSet; vector<vector<int>> ans; int size = (int) nums.size(); for (int i = 0; i < size; ++i) { for (int j = i + 1; j < size; ++j) { sums.emplace_back(sum(nums[i], nums[j], i, j)); } } sort(sums.begin(), sums.end()); int sumsSize = (int) sums.size(); for (auto &eachSum:sums) { int pos = lowerBound(sums, target - eachSum.c); while (pos < sumsSize && sums[pos].c + eachSum.c == target) { if (checkSum(sums[pos], eachSum)) { vector<int> tmp{sums[pos].a, eachSum.a, sums[pos].b, eachSum.b}; sort(tmp.begin(), tmp.end()); ansSet.insert(tmp); } ++pos; } } for (auto &each:ansSet) { ans.emplace_back(each); } return ans; } };
相关文章推荐
- leetcode18 4Sum
- LeetCode 18 - 4Sum
- leetcode18~4Sum
- Leetcode 18 4Sum
- leetcode-18 4Sum
- [leetcode] 【数组】18. 4Sum
- Leetcode 18 - 4Sum
- LeetCode_18---4SUM
- Sum—LeetCode-18 4Sum
- leetcode——18——4Sum
- LeetCode_OJ【18】4Sum
- LeetCode 18. 4Sum
- LeetCode 18_4Sum
- Leetcode 18. 4Sum
- Leetcode 18. 4Sum
- LeetCode(18)4Sum
- LeetCode - 18. 4Sum
- leetcode (18) - 4Sum
- LeetCode 18. 4Sum
- LeetCode(18) 4Sum