Description
Given an array nums
of n integers and an integer target
, are there elements a, b, c, and d in nums
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.
Example:
Given array nums = [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的加强版,多一个循环。
二.题目解答
class Solution { public: vector<vector<int>> fourSum(vector<int>& nums,int target) { vector<vector<int>> ans; int _size = nums.size(); if(nums.size() < 4) return ans; sort(nums.begin(),nums.end()); for(int i = 0; i < nums.size() - 3; i++) { if (nums[i]+nums[i+1]+nums[i+2] +nums[i+3]> target) break; if(i > 0 && nums[i - 1] == nums[i]) continue; for(int j = i + 1; j < nums.size() - 2; j++) { if (nums[i] + nums[j] + nums[j+1] + nums[j+2]> target) break; if(j > i + 1 && nums[j - 1] == nums[j]) continue; int front = j + 1; int rear = nums.size() - 1; while(front < rear) { int sum = nums[i] + nums[j] + nums[front] + nums[rear];
if(sum < target) front++; else if(sum > target) rear--; else { ans.push_back({nums[i],nums[j],nums[front],nums[rear]}); do { front++; } while (nums[front] == nums[front - 1] && front < rear); do { rear--; } while (nums[rear] == nums[rear + 1] && front < rear); } } } } return ans; } };
还可以进行一些优化,多一些判断
class Solution { public: vector<vector<int>> fourSum(vector<int>& nums,int target) { vector<vector<int>> ans; int _size = nums.size(); if(nums.size() < 4) return ans; sort(nums.begin(),nums.end()); for(int i = 0; i < nums.size() - 3; i++) { if(i > 0 && nums[i - 1] == nums[i]) continue; if (nums[i]+nums[i+1]+nums[i+2] +nums[i+3]> target) break; if (nums[i] + nums[_size - 1] + nums[_size - 2] + nums[_size - 3] < target) continue; for(int j = i + 1; j < nums.size() - 2; j++) { if(j > i + 1 && nums[j - 1] == nums[j]) continue; if (nums[i] + nums[j] + nums[j+1] + nums[j+2]> target) break; if (nums[i] + nums[_size - 1] + nums[_size - 2] + nums[j] < target) continue; int front = j + 1; int rear = nums.size() - 1; while(front < rear) { int sum = nums[i] + nums[j] + nums[front] + nums[rear]; if(sum < target) front++; else if(sum > target) rear--; else { ans.push_back({nums[i],nums[j],nums[front],nums[rear]}); do { front++; } while (nums[front] == nums[front - 1] && front < rear); do { rear--; } while (nums[rear] == nums[rear + 1] && front < rear); } } } } return ans; } };