leetcode5505

有一个整数数组 nums ,和一个查询数组 requests ,其中 requests[i] = [starti, endi] 。第
i 个查询求 nums[starti] + nums[starti + 1] + … + nums[endi - 1] +
nums[endi] 的结果 ,starti 和 endi 数组索引都是 从 0 开始 的。 你可以任意排列 nums
中的数字,请你返回所有查询结果之和的最大值。

这里的思路比较简单,就是对每一位的查询次数进行排序,然后与排序后的nums对应,查询次数越多对应的数字越大。但是,如果直接遍历求每一位的查询次数会超时。这里需要使用扫描线的方法。

首先,我们设置一个数组mi,记录各位查询的次数。每次获得一个查询[i,j],就将mi[i]–,mi[j+1]++。
最后,通过mi[i]+=mi[i-1]获得最终数组。

class Solution {
public:
    int maxSumRangeQuery(vector<int>& nums, vector<vector<int>>& requests) {
        long long mod = 1e9+7;
        int n = nums.size();
        vector<int> mi(n,0);
        for(auto r : requests) {
            mi[r[0]]++;
            if(r[1] + 1 < n) mi[r[1] + 1]--;
        }
        for(int i = 1; i < n; i++) mi[i] += mi[i - 1];
        long long res = 0;
        sort(nums.rbegin(),nums.rend());
       sort(mi.rbegin(),mi.rend());
        int i =0;
        for(auto m:mi){
            if(m>0){
                res += m*nums[i];
                res %=mod;
            }else break;
            i++;
        }
        return (int)res;
    }
};
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页