题目:


题解:

思路:归并排序

  • 1)对于区间和的快速求解需要使用前缀和,由于 a 中的元素有正有负,所以前缀和数组不是单调递增的,我们可以对前缀和数组进行归并排序,顺便计算区间和的个数,求 pre[j]-pre[i]∈[lower,upper](i,j) 的个数。
  • 2)思考如何利用两个升序数组n1,n2求出n2[j]-n1[i]∈[lower,upper]
  • 3)在解决这一问题后,原问题就迎刃而解了:我们采用归并排序的方式,能够得到左右两个数组排序后的形式,以及对应的下标对数量。对于原数组而言,若要找出全部的下标对数量,只需要再额外找出左端点在左侧数组,同时右端点在右侧数组的下标对数量,而这正是我们此前讨论的问题。

代码如下:

const int N = 1e5+10;
using LL = long long;
class Solution {public:// 思路:归并排序,在两个升序数组中寻找下标对的区间和在[lower,upper]之间。每次统计第二个区间的n2[l]>=n1[0]+lower,n2[r]>n1[0]+uperr,这样的话[l,r)范围内的区间和都在[lower,upper]之间了。由于n1是递增的,因此l,r只能向右移动才能进行统计了。LL pre[N],b[N];int countRangeSum(vector<int>& a, int lower, int upper) {int n=a.size();memset(pre,0,sizeof pre),memset(b,0,sizeof b);// 预处理前缀和数组for(int i=1;i<=n;++i)pre[i]=pre[i-1]+a[i-1];return merge(lower,upper,0,n);}int merge(int lower,int upper,int l,int r){if(l>=r)return 0;// 1.确定分界点,递归处理左右两段int mid=(l+r)>>1;int res=merge(lower,upper,l,mid)+merge(lower,upper,mid+1,r);// 2.统计下标对的数量int i=l,_l=mid+1,_r=mid+1;while(i<=mid){// 直到pre[_l]-pre[i]>=lower为止;直到pre[_r]-pre[i]>upper为止;这样区间[_l,_r)满足情况了while(_l<=r&&pre[_l]-pre[i]<lower)_l++;while(_r<=r&&pre[_r]-pre[i]<=upper)_r++;res+=(_r-_l);i++;}// 3.合并两个升序序列int k=0,j=mid+1;i=l;while(i<=mid||j<=r){if(i>mid)b[k++]=pre[j++];else if(j>r)b[k++]=pre[i++];else{if(pre[i]<pre[j])b[k++]=pre[i++];else b[k++]=pre[j++];}}for(i=l,j=0;i<=r;++i,++j)pre[i]=b[j];return res;}
};

[归并排序]leetcode327:区间和的个数(hard)相关推荐

  1. 树状数组求逆序对_区间和的个数(树状数组)

    327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...

  2. python acm 素数个数_湘潭大学OJ-1098求区间内素数个数问题

    求区间内素数个数问题 题目描述 Description 给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数.限制:Time Limit : 1 ...

  3. leetcode 327. 区间和的个数(treemap)

    给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包 ...

  4. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  5. 区间子数组个数 - LeetCode 795 - 从左向右与从右向左查找

    一.问题描述 给你一个整数数组 nums 和 两个整数:left 及 right .找出 nums 中连续.非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个 ...

  6. python根据excel时间表统计24小时各小时区间点的个数

    1.首先使用excel中的HOUR()函数,将日期数据(年/月/日 时:分:秒)转换为小时,表格命名为hour.xlsx: 2.使用python读取excel数据hour.xlsx,将小时列转换为列表 ...

  7. LeetCode 327. 区间和的个数(multiset二分查找/归并排序)

    文章目录 1. 题目 2. 解题 2.1 动态规划超时 2.2 二分查找 2.3 归并排序 1. 题目 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 low ...

  8. 输出指定个数所有枚举_【一天一大 lee】区间和的个数 (难度:困难) Day20201107

    20201107 题目: 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper.区间和 S(i, j) 表示在 nums 中,位置从 i ...

  9. [leetCode]327. 区间和的个数

    题目 链接:https://leetcode-cn.com/problems/count-of-range-sum 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数, ...

最新文章

  1. linux命令行3d,Linux命令行快捷键
  2. 如何比较PixelCNN与DCGAN两种Image generation方法?
  3. mybatis-spring整合jar包功能
  4. IPv6套接字编程介绍
  5. 山东大学继续教育计算机3,山东大学继续教育数字电子技术基础试题3及答案.doc...
  6. 【风控策略】大数据风控策略逻辑
  7. gulp版本号管理插件注意事项
  8. 小甲鱼windows程序设计(50讲)
  9. 日本专利分类方法 FI 和 F-Term 分类号 检索
  10. html 网页飘窗,jquery飘窗插件bay-window.js
  11. 内存泄露的检测工具——Valgrind
  12. 肖邦 《第一钢琴协奏曲》E小调,OP.11 个人赏析
  13. ISUP信令REL原因值
  14. docker磁盘清理
  15. 《用递归法解决问题》教学设计
  16. thinkphp5使用容联发送短信验证码
  17. android 8华为屏幕录制,数码知识:华为nova8pro如何屏幕录制怎么录屏
  18. 【Codeforces】1635E Cars 题解
  19. 心蓝android版本,心蓝抢票app-心蓝抢票软件预约 _5577安卓网
  20. 数据类型和存储上的差别,基本数据类型,引用数据类型

热门文章

  1. (Modern Family S01E01) Part 4  PhilClaire  Luke射Alex / Haley邀请Dylan
  2. PAKDD 2019 中国企业深兰科技夺冠:AutoML 如何推动 AI 应用落地?
  3. 【保姆级】包体积优化教程
  4. 女朋友过生日送什么礼物好?
  5. ip.php是什么意思,有人频繁试探云主机的 ip_js. PHP 是什么操作?
  6. 小学生四则运算考试系统Java
  7. win8 发现不了网络计算机,Windows8系统无法开启网络发现如何解决
  8. 联想服务器bios查看网卡信息,如何通过BIOS检查确认硬盘信息可被正常识别
  9. 微服务项目:尚融宝(42)(核心业务流程:借款额度审批(2))
  10. 1-1 Java基础和编程概述