Leecode 18 思路: 两数之和用双指针,三数之和,固定第一个,再用双指针,四数之和在三数之和上多加一层循环就好了,另外注意同一个位置得前后两个数字不要重复。
代码:
std::vector<std::vector<int>> Leecode18_fourSum(std::vector<int>& nums, int target){ sort(nums.begin(), nums.end()); std::vector<std::vector<int>> result; int size = nums.size(); for (int a = 0; a < size - 3; ++a){ if (a > 0 && nums[a] == nums[a - 1]) continue;//第一个不重 for (int b = a + 1; b < size - 2; ++b){ if (b > a + 1 && nums[b] == nums[b - 1]) continue;//第二个不重 int i = b + 1, j = size - 1; while (i < j) { int sum = nums[a] + nums[b] + nums[i] + nums[j]; if (sum < target) while (i < j && nums[i] == nums[++i]); else if (sum > target) while (i < j && nums[j] == nums[--j]); else { result.push_back({nums[a], nums[b], nums[i], nums[j]}); while (i < j && nums[i] == nums[++i]);//第三个不重 while (i < j && nums[j] == nums[--j]);//第四个不重 } } } } return result; }