题目来源:
leetcode题目,网址:18. 四数之和 - 力扣(LeetCode)
解题思路:
排序+双指针。将数组排序后,枚举第一个元素和第二个元素,利用双指针寻找第三个元素和第四个元素。
解题代码:
- class Solution {
- public:
- vector<vector<int>> fourSum(vector
& nums, int target) { - vector<vector<int>> res;
- if(nums.size()<4){
- return res;
- }
- sort(nums.begin(),nums.end());
- long last2Sum=nums[nums.size()-1]+nums[nums.size()-2];
- long last3Sum=last2Sum+nums[nums.size()-3];
- if( last3Sum+nums[nums.size()-4]<target){
- return res;
- }
- for(int i=0;i<nums.size()-3;i++){
- if(nums[i]+last3Sum < target ){
- continue;
- }else if(i!=0 && nums[i]==nums[i-1]){
- continue;
- }
- for(int j=i+1;j<nums.size()-2;j++){
-
- long newTarget=(long)target-nums[i]-nums[j];
- if(nums[j+1]+nums[j+2]>newTarget){
- break;
- }else if(nums[i]+nums[j]+last2Sum<target || (j!=i+1 && nums[j]==nums[j-1])){
- continue;
- }
- int left=j+1;
- int right=nums.size()-1;
-
- while(left<right){
- long sum=nums[left]+nums[right];
- if(sum<newTarget){
- left++;
- }else if(sum>newTarget){
- right--;
- }else{
- vector<int> vec={nums[i],nums[j],nums[left],nums[right]};
- res.push_back(vec);
- left++;
- while(left<right && nums[left]==nums[left-1]){
- left++;
- }
- }
- }
- }
- }
- return res;
- }
- };
总结:
注意四数之和可能超出 int 表示范围。
官方题解也是排序+双指针。