【LeetCode】18. 4Sum
2017-02-27 11:55
489 查看
18. 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: 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] ]
解题思路
双指针问题。思路还是与3Sum问题相似。差异在于,此处是依次固定第一和第二个数字,然后通过双指针移动控制第三和第四个数字;而3Sum则只需固定第一个数字。
注意:要仔细分析所有while循环的控制条件,防止出现死循环。
AC代码
class Solution { public: vector<vector<int> > fourSum(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); vector<vector<int> > ans; const int vSize = nums.size(); //fix the first number for (int first = 0; first < vSize - 3; ++first) { //fix the second number for (int second = first + 1; second < vSize - 2; ++second) { int third = second + 1; int forth = vSize - 1; while (third < forth) { int curSum = nums[first] + nums[second] + nums[third] + nums[forth]; if (curSum < target) third++; else if (curSum > target) forth--; else { vector<int> tempAns; //注意此处push_back的是数值nums[first],而非下标first tempAns.push_back(nums[first]); tempAns.push_back(nums[second]); tempAns.push_back(nums[third]); tempAns.push_back(nums[forth]); ans.push_back(tempAns); //此处不可以直接写nums[third+1]==nums[third] //因为要确保third一定会被更新到 while (third < forth && nums[third] == tempAns[2]) third++; while (third < forth && nums[forth] == tempAns[3]) forth--; } } while (second < vSize - 1 && nums[second + 1] == nums[second]) second++; } while (first < vSize - 1 && nums[first + 1] == nums[first]) first++; } return ans; } };
相关文章推荐
- 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.array--18. 4Sum
- [leetcode]18. 4Sum
- leetcode 18 4Sum
- LeetCode - 18 - 4Sum
- leetcode 18. 4Sum
- LeetCode *** 18. 4Sum (Two Pointers)
- leetcode 18. 4Sum
- leetcode 1|167.two sum 1|2 && 3.three sum && 16.3Sum Closest && 18. 4Sum
- LeetCode 18. 4Sum
- LeetCode之18_4Sum
- LeetCode 18. 4Sum
- 【leetcode】18. 4Sum