算法day21 四数之和

题目描述

思路:双指针
四数之和的求解思路本质上与三数之和没什么差别,只不过这一次我们要嵌套两层for循环,而且要注意返回的条件,现在我们的目标是收集四个元素相加和等于target的子数组,所以我们不会再向之前一样固定在第一个加数大于0时返回,而是要考虑的更多。具体的细节可以参考代码。

代码如下:

 vector<vector<int>> fourSum(vector<int>& nums, int target) {
    vector<vector<int>> res;
    sort(nums.begin(),nums.end());
    int len = nums.size();
    for(int i=0;i<len-1;i++){
        if(nums[i]>target && nums[i]>=0){//nums[i]>=0成立,则后续的元素必然大于等于0
            break;
        }
        if(i>0&&nums[i]==nums[i-1]){
            continue;
        }
    for(int j = i+1;j<len;j++){
        if(nums[i]+nums[j]>target&&nums[j]>=0){//与nums[i]的逻辑同理
            break;
        }
        if(j>i+1&&nums[j]==nums[j-1]){
            continue;
        }
        int left = j+1;
        int right = len-1;
        while(left<right){
            if(left<right && (long) nums[i]+nums[j]+nums[left]+nums[right]<target){
                left++;
            }
            else if(left<right && (long)nums[i]+nums[j]+nums[left]+nums[right]>target){
                right--;
            }
            else{
                res.insert(res.begin(),vector<int>{nums[i],nums[j],nums[left],nums[right]});
                while(left<right && nums[left] == nums[left+1]) left++;
                while(left<right && nums[right] == nums[right-1]) right--;
                left++;
                right--;
            }

        }
    }
    }
    return res;
}

时间复杂度:O(n^3)
空间复杂度:O(n^2)

END

posted on 2025-04-28 14:19  sakura430  阅读(16)  评论(0)    收藏  举报