1589. 所有排列中的最大和-差分数组+快速排序+贪心算法
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]。
这一题,博主一开始做的时候并没有想到差分数组,查阅了资料之后 才知道这个工具的妙处,可谓非常棒的一个工具,在我们解决问题时,一定可以有很大的帮助,感兴趣的可以了解一下差分数组在统计区间统计数量统计的作用
那么对于这一题,首先统计每个坐标的的统计次数,然后排序,次数,按照次数最多的一次加数组中的较大值,解题代码如下:
void add_r(int *r,int *a,int numsSize){
r[a[0]]++;
if (a[1] + 1 < numsSize) {
r[a[1] + 1]--;
}
}
void quick_sort(int *a,int low,int high){
int l=low,h=high;
if(low<high){
int p=a[low];
while(low<high){
while(low<high&&a[high]<=p){
high--;
}
a[low]=a[high];
while(low<high&&a[low]>=p){
low++;
}
a[high]=a[low];
}
a[low]=p;
quick_sort(a,l,low-1);
quick_sort(a,low+1,h);
}
}
int cmp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int maxSumRangeQuery(int* nums, int numsSize, int** requests, int requestsSize, int* requestsColSize){
int *r=(int *)malloc(sizeof(int)*numsSize);
for(int i=0;i<numsSize;i++){
r[i]=0;
}
for(int i=0;i<requestsSize;i++){
add_r(r,requests[i],numsSize);
}
for (int i = 1; i < numsSize; i++) {
r[i] += r[i - 1];
}
quick_sort(nums,0,numsSize-1);
quick_sort(r,0,numsSize-1);
long long re=0;
for(int i=0;i<numsSize;i++){
if(r[i]!=0){
re=(re+r[i]*(long long)nums[i])%1000000007;
}
}
return re;
}
相关文章
- 经典算法题每日演练——第十三题 赫夫曼树
- Java实现 蓝桥杯 算法提高 数组求和
- Java实现 蓝桥杯 算法训练 数据交换
- Java实现 蓝桥杯VIP 算法训练 一元三次方程
- Java实现 蓝桥杯 算法训练 寻找数组中最大值
- 【经典算法】——KMP,深入讲解next数组的求解
- (算法)位图BitMap
- 算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组
- 【学习总结】java数据结构和算法-第三章-稀疏数组和队列
- 重新整理数据结构与算法——数组模拟队列和环形队列[三]
- MySQL索引相关的数据结构和算法
- DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——21~40
- Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)
- 【负荷预测】布谷鸟(CS)算法优化BP神经网络的负荷及天气预测(Matlab代码实现)
- 【模型原理】详解 蒙特卡罗算法 原理+实践
- 基于OFDM通信系统的PAPR抑制算法matlab仿真,对比OFDMA,LFDMA,IFDMA三种不同调制方式
- 1827. 最少操作使数组递增-贪心算法-原地修改数组
- 1899. 合并若干三元组以形成目标三元组-c语言-贪心算法+标记数组
- 从决策树学习谈到贝叶斯分类算法、EM、HMM
- Lucene默认的打分算法——ES默认
- 【初级算法】在排序数组中查找元素的第一个和最后一个位置
- KMP模式匹配算法改进---nextval数组
- 数组结构与算法之栈
- 【数据结构与算法】——第五章:树与二叉树(1)
- 数组专题~有人十八单手开法拉利,有人二十加在lc刷算法题