双指针应用八:四数之和

2021-05-11  本文已影响0人  程一刀

题目地址: https://leetcode-cn.com/problems/4sum/

题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
参考代码:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        for (int i = 0; i< nums.size(); i++) {
//            if(nums[i] > target) { // 不能加这个,-3,-4,-5,0,0,target 为 -7,如果 target >= 0, 可以 加这个
//                break;
//            }
            if (i>0&&nums[i] ==nums[i-1]) {
                continue;
            }
            for (int j = i + 1;j<nums.size(); j++) {
                if (j>i+1 && nums[j]==nums[j-1]) {
                    continue;
                }
                int left = j + 1;
                int right = nums.size()-1;
                while (left< right) {
                    int value = nums[i] + nums[j] +  nums[left] + nums[right];
                    
                    if (value == target) {
                        result.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});
                        
                        while (left+1<nums.size() &&nums[left] == nums[left+1]) {
                            left ++;
                        }
                        while (right-1>left && nums[right] == nums[right-1]) {
                            right--;
                        }
                        left++;
                        right--;
                    } else if (value > target){
                        right--;
                        
                    } else {
                        left++;
                    }
                }
            }
        }
        return  result;
    }
};

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
//    vector<int> data = {-1,0,1,2,-1,-4};
//    vector<int> data = {0,0,0,0};
//    vector<int> data = {0};
//    Solution1().threeSum(data);
//    [1,-2,-5,-4,-3,3,3,5]
//    -11
    vector<int> data = {1,-2,-5,-4,-3,3,3,5};
    // {-5,-4,-3,-2,}
    Solution().fourSum(data, -11);
    return 0;
}

参考链接: https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.md

上一篇 下一篇

猜你喜欢

热点阅读