Leetcode 1589. 所有排列中的最大和(有思路但超时)
Published on 2022-06-19 11:52 in 分类: C/C++ with 萧海~
分类: C/C++

Leetcode 1589. 所有排列中的最大和(有思路但超时)

    ()
    有一个整数数组 nums ,和一个查询数组 requests ,其中 requests[i] = [starti, endi] 。第 i 个查询求 nums[starti] + nums[starti + 1] + ... + nums[endi - 1] + nums[endi] 的结果 ,starti 和 endi 数组索引都是 从 0 开始 的。

    你可以任意排列 nums 中的数字,请你返回所有查询结果之和的最大值。

    由于答案可能会很大,请你将它对 109 + 7 取余 后返回。

    示例 1:

    输入:nums = [1,2,3,4,5], requests = [[1,3],[0,1]]
    输出:19
    解释:一个可行的 nums 排列为 [2,1,3,4,5],并有如下结果:
    requests[0] -> nums[1] + nums[2] + nums[3] = 1 + 3 + 4 = 8
    requests[1] -> nums[0] + nums[1] = 2 + 1 = 3
    总和为:8 + 3 = 11
    一个总和更大的排列为 [3,5,4,2,1],并有如下结果:
    requests[0] -> nums[1] + nums[2] + nums[3] = 5 + 4 + 2 = 11
    requests[1] -> nums[0] + nums[1] = 3 + 5 = 8
    总和为: 11 + 8 = 19,这个方案是所有排列中查询之和最大的结果。

    示例 2:

    输入:nums = [1,2,3,4,5,6], requests = [[0,1]]
    输出:11
    解释:一个总和最大的排列为 [6,5,4,3,2,1] ,查询和为 [11]。

    示例 3:

    输入:nums = [1,2,3,4,5,10], requests = [[0,2],[1,3],[1,1]]
    输出:47
    解释:一个和最大的排列为 [4,10,5,3,2,1] ,查询结果分别为 [19,18,10]。

    提示:

    • n == nums.length
    • 1 <= n <= 10^5
    • 0 <= nums[i] <= 10^5
    • 1 <= requests.length <= 10^5
    • requests[i].length == 2
    • 0 <= starti <= endi < n

    Code:

    class Solution {
    public:
    typedef pair<int, int> PAIR;
    struct CmpByValue {
    bool operator()(const PAIR& lhs, const PAIR& rhs) {
    return lhs.second > rhs.second;
    }
    };
    int maxSumRangeQuery(vector<int>& nums, vector<vector<int>>& requests) {
    #if 1
    map<int,int>mymap;
    for(int i=0;i<requests.size();i++)
    {
    vector<int>sub=requests[i];
    for(int j=sub[0];j<=sub[1];j++)
    {
    mymap[j]++;
    }
    }
    //把map中元素转存到vector中
    vector<PAIR> map_vec(mymap.begin(), mymap.end());
    //对vector排序
    sort(map_vec.begin(), map_vec.end(), CmpByValue());
    sort(nums.begin(),nums.end(),greater<int>());
    vector<int>newnums;
    newnums.resize(nums.size(),-1);
    for(int i=0;i<map_vec.size();i++)
    {
    // cout<<"map_vec[i].first="<<map_vec[i].first<<" "<<nums[i]<<endl;
    newnums[map_vec[i].first]=nums[i];
    }
    for(int i=map_vec.size();i<nums.size();i++)
    {
    for(int j=0;j<newnums.size();j++)
    {
    if(newnums[j]==-1)
    {
    newnums[j]=nums[i];
    break;
    }
    }
    }
    // cout<<"newvec:"<<endl;
    // for(int i=0;i<newnums.size();i++)
    // {
    // cout<<newnums[i]<<endl;
    // }
    #endif
    uint64_t res=0;
    int exp=1000000007;
    for(int i=0;i<requests.size();i++)
    {
    vector<int>sub=requests[i];
    for(int j=sub[0];j<=sub[1];j++)
    {
    res+=newnums[j];
    }
    }
    cout<<res%exp<<endl;;
    return res%exp;
    }
    };
    posted @   萧海~  阅读(32)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · winform 绘制太阳,地球,月球 运作规律
    · AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
    · 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
    · 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
    · 上周热点回顾(3.3-3.9)
    点击右上角即可分享
    微信分享提示
    电磁波切换