zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    













  • 相关阅读:
    iozone
    2019-11-23-WPF-使用-RawInput-接收裸数据
    2019-11-22-Roslyn-在多开发框架让-msbuild-的-Target-仅运行一次
    2019-3-1-C#-json-转-xml-字符串
    2018-11-19-visualStudio-无法登陆
    2019-4-21-Roslyn-通过-NuGet-库修改应用程序入口函数
    2019-8-31-dotnet-core-集成到-Mattermost-聊天工具
    2019-7-29-win10-UWP-使用-MD5算法
    2018-8-10-C#-TimeSpan-时间计算
    2019-6-15-WPF-触摸到事件
  • 原文地址:https://www.cnblogs.com/ovs98/p/9845875.html
Copyright © 2011-2022 走看看