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 <= arr.length <= 100
1 <= arr[i] <= 1000
解法:
对询问进行差分,计算出每个位置会被累加多少次,
最后对次数数组和nums数组排序,累加次数大的位置填大的数即可.
code:
const int mod=1e9+7;
class Solution {
public:
    int maxSumRangeQuery(vector<int>& a, vector<vector<int>>& b) {
        int n=a.size();
        vector<int>d(n);
        for(auto s:b){
            int l=s[0],r=s[1];
            d[l]++;
            if(r+1<n)d[r+1]--;
        }
        for(int i=1;i<n;i++){
            d[i]+=d[i-1];
        }
        sort(d.begin(),d.end());
        sort(a.begin(),a.end());
        int ans=0;
        for(int i=0;i<n;i++){
            ans+=1ll*a[i]*d[i]%mod;
            ans%=mod;
        }
        return ans;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值