18. 四数之和

leetcode力扣刷题打卡

题目:18. 四数之和
描述:给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

思路:

1、先排序,固定头尾两个数字(用for循环),中间两个数用双指针查找
3、三数之和的升级版

原代码##

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int n = nums.size();
        if (n < 4) return {};
        sort(nums.begin(), nums.end());
        set<vector<int>> set;
        for (int i = 0; i < n - 3; ++i) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            for (int j = n - 1; j > i + 2; --j) {
                if ((j != n - 1) && (nums[j] == nums[j + 1])) {
                    continue;
                }
                int l = i + 1, r = j - 1;
                long long  temp1 = nums[i] + nums[j];
                while (l < r) {
                    long long temp2 = temp1 + nums[l] + nums[r];
                    if (temp2 == target) {
                        set.insert({nums[i], nums[l], nums[r], nums[j]});
                        l++;
                        r--;
                    } else if (temp2 < target) {
                        l++;
                    } else {
                        r--;
                    }
                }
            }
        }
        vector<vector<int>> ans(set.begin(), set.end());
        return ans;
    }
};

你可能感兴趣的:(leetcode刷题打卡,leetcode,算法,c++)