18.4Sum

Description

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]
]
一.题目理解
这道题也是数组,双指针求解的问题,相当于3Sum的加强版,多一个循环。

二.题目解答
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums,int target) {

        vector<vector<int>> ans;
        int _size = nums.size();

        if(nums.size() < 4)
            return ans;

        sort(nums.begin(),nums.end());
        for(int i = 0; i < nums.size() - 3; i++) {

            if (nums[i]+nums[i+1]+nums[i+2] +nums[i+3]> target)
                break;

            if(i > 0 && nums[i - 1] == nums[i])
                continue;

            for(int j = i + 1; j < nums.size() - 2; j++) {

                if (nums[i] + nums[j] + nums[j+1] + nums[j+2]> target)
                    break;

                if(j > i + 1 && nums[j - 1] == nums[j])
                    continue;

                int front = j + 1;
                int rear = nums.size() - 1;

                while(front < rear) {
                    int sum = nums[i] + nums[j] + nums[front] + nums[rear];

                    if(sum < target)
                        front++;
                    else if(sum > target)
                        rear--;
                    else {
                        ans.push_back({nums[i],nums[j],nums[front],nums[rear]});

                        do {
                            front++;
                        } while (nums[front] == nums[front - 1] && front < rear);
                        do {
                            rear--;
                        } while (nums[rear] == nums[rear + 1] && front < rear);

                    }
                }
            }
        }
        return ans;
    }
};

还可以进行一些优化,多一些判断
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums,int target) {

        vector<vector<int>> ans;
        int _size = nums.size();

        if(nums.size() < 4)
            return ans;

        sort(nums.begin(),nums.end());
        for(int i = 0; i < nums.size() - 3; i++) {

            if(i > 0 && nums[i - 1] == nums[i])
                continue;

            if (nums[i]+nums[i+1]+nums[i+2] +nums[i+3]> target)
                break;

            if (nums[i] + nums[_size - 1] + nums[_size - 2] + nums[_size - 3] < target)
                continue;

            for(int j = i + 1; j < nums.size() - 2; j++) {

                if(j > i + 1 && nums[j - 1] == nums[j])
                    continue;

                if (nums[i] + nums[j] + nums[j+1] + nums[j+2]> target)
                    break;

                if (nums[i] + nums[_size -  1] + nums[_size - 2] + nums[j] < target)
                    continue;

                int front = j + 1;
                int rear = nums.size() - 1;

                while(front < rear) {
                    int sum = nums[i] + nums[j] + nums[front] + nums[rear];

                    if(sum < target)
                        front++;
                    else if(sum > target)
                        rear--;
                    else {
                        ans.push_back({nums[i],nums[j],nums[front],nums[rear]});

                        do {
                            front++;
                        } while (nums[front] == nums[front - 1] && front < rear);
                        do {
                            rear--;
                        } while (nums[rear] == nums[rear + 1] && front < rear);

                    }


                }

            }
        }
        return ans;
    }
};













原文地址:https://www.cnblogs.com/ovs98/p/9845875.html