0
点赞
收藏
分享

微信扫一扫

《每日一题》18. 四数之和

大师的学徒 2022-04-04 阅读 37
c++

 

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        sort(nums.begin(),nums.end());
        int len = nums.size();
        for (int i = 0; i < len; i++){
            //去重
            if (i != 0 && nums[i] == nums[i-1]){
                continue;
            }
            for (int j = i + 1; j < len ;j++){
                //去重
                if (j >i+1 && nums[j] == nums[j-1])
                    continue;
                int left = j + 1;
                int right = len - 1;

                while (left < right){
                    // nums[i] + nums[j] + nums[left] + nums[right] > target 会溢出
                    if (nums[i] + nums [j] > target - (nums[left] + nums[right])){
                        right--;
                        while (left < right && nums[right] == nums[right + 1]) right--;
                    }
                    else if (nums[i] + nums [j] < target - (nums[left] + nums[right])){
                        left++;
                        while (left < right && nums[left] == nums[left - 1]) left++; //这里是-1,不做多于计算的处理
                    }
                    else {
                        result.push_back(vector<int>({nums[i], nums[j], nums[left], nums[right]}));
                        while (left < right && nums[right] == nums[right - 1]) right--;
                        while (left < right && nums[left] == nums[left + 1]) left++;//这里是+1,排除重复
                        right--;
                        left++;
                    }
                }
            }
        }

        return result;
    }
};
举报

相关推荐

0 条评论