[leetcode题解]17.4sum

Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c+ d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

The solution set must not contain duplicate quadruplets.

Example:

Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

这个题目其实是3sum的基础上再加入一个数,其实可以for所有的数然后执行3sum的算法,为了方便可以通过两重for循环的形式直接下载一块。 3sum的问题也可以拆分成一个数加2sum,所以本地最基础考察的是2sum,只是在2sum的基础上做了扩展,当然我们还可以求解5sum,6sum,那时候我们就要改一下,不要搞4重循环或者5重 循环。可以把外面的nsum搞成一个循环,从而最多三重循环搞定所有nsum问题。

代码如下:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        int i = 0, j = 0;
        int le = 0, ri = 0;
        int tmp_target = 0;
        int sum = 0;
        vector<int> four_nums;
        
        sort(nums.begin(), nums.end());
        for (i = 0; i < nums.size(); i++) {
            if (i > 0 && nums[i] == nums[i - 1])
                continue;
            
            for (j = i + 1; j < nums.size(); j++) {
                if (j > i + 1 && nums[j] == nums[j - 1])
                    continue;
                
                le = j + 1;
                ri = nums.size() - 1;
                tmp_target = target - nums[i] - nums[j];
                
                while (le < ri) {
                    sum = nums[le] + nums[ri];
                    if (le > j + 1 && nums[le] == nums[le - 1]) {
                        le++;
                        continue;
                    }
                    if (sum < tmp_target) {
                        le++;
                    } else if (sum > tmp_target) {
                        ri--;
                    } else {
                        four_nums.clear();
                        four_nums.push_back(nums[i]);
                        four_nums.push_back(nums[j]);
                        four_nums.push_back(nums[le]);
                        four_nums.push_back(nums[ri]);
                        res.push_back(four_nums);
                        le++;
                        ri--;
                    }
                }
            }
        }
        return res;
    }
private:
   
};

本文遵从CC3.0协议转载请注明:转自凌风技术站

本文标题:[leetcode题解]17.4sum

本文链接地址:https://www.iaccepted.net/algorithm/leetcode/208.html

相关文章