[归并排序]leetcode327:区间和的个数(hard)
题目:
题解:
思路:归并排序
- 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)相关推荐
- 树状数组求逆序对_区间和的个数(树状数组)
327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...
- python acm 素数个数_湘潭大学OJ-1098求区间内素数个数问题
求区间内素数个数问题 题目描述 Description 给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数.限制:Time Limit : 1 ...
- leetcode 327. 区间和的个数(treemap)
给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包 ...
- zoj 2112 树状数组 套主席树 动态求区间 第k个数
总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...
- 区间子数组个数 - LeetCode 795 - 从左向右与从右向左查找
一.问题描述 给你一个整数数组 nums 和 两个整数:left 及 right .找出 nums 中连续.非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个 ...
- python根据excel时间表统计24小时各小时区间点的个数
1.首先使用excel中的HOUR()函数,将日期数据(年/月/日 时:分:秒)转换为小时,表格命名为hour.xlsx: 2.使用python读取excel数据hour.xlsx,将小时列转换为列表 ...
- LeetCode 327. 区间和的个数(multiset二分查找/归并排序)
文章目录 1. 题目 2. 解题 2.1 动态规划超时 2.2 二分查找 2.3 归并排序 1. 题目 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 low ...
- 输出指定个数所有枚举_【一天一大 lee】区间和的个数 (难度:困难) Day20201107
20201107 题目: 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper.区间和 S(i, j) 表示在 nums 中,位置从 i ...
- [leetCode]327. 区间和的个数
题目 链接:https://leetcode-cn.com/problems/count-of-range-sum 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数, ...
最新文章
- linux命令行3d,Linux命令行快捷键
- 如何比较PixelCNN与DCGAN两种Image generation方法?
- mybatis-spring整合jar包功能
- IPv6套接字编程介绍
- 山东大学继续教育计算机3,山东大学继续教育数字电子技术基础试题3及答案.doc...
- 【风控策略】大数据风控策略逻辑
- gulp版本号管理插件注意事项
- 小甲鱼windows程序设计(50讲)
- 日本专利分类方法 FI 和 F-Term 分类号 检索
- html 网页飘窗,jquery飘窗插件bay-window.js
- 内存泄露的检测工具——Valgrind
- 肖邦 《第一钢琴协奏曲》E小调,OP.11 个人赏析
- ISUP信令REL原因值
- docker磁盘清理
- 《用递归法解决问题》教学设计
- thinkphp5使用容联发送短信验证码
- android 8华为屏幕录制,数码知识:华为nova8pro如何屏幕录制怎么录屏
- 【Codeforces】1635E Cars 题解
- 心蓝android版本,心蓝抢票app-心蓝抢票软件预约 _5577安卓网
- 数据类型和存储上的差别,基本数据类型,引用数据类型
热门文章
- (Modern Family S01E01) Part 4 PhilClaire Luke射Alex / Haley邀请Dylan
- PAKDD 2019 中国企业深兰科技夺冠:AutoML 如何推动 AI 应用落地?
- 【保姆级】包体积优化教程
- 女朋友过生日送什么礼物好?
- ip.php是什么意思,有人频繁试探云主机的 ip_js. PHP 是什么操作?
- 小学生四则运算考试系统Java
- win8 发现不了网络计算机,Windows8系统无法开启网络发现如何解决
- 联想服务器bios查看网卡信息,如何通过BIOS检查确认硬盘信息可被正常识别
- 微服务项目:尚融宝(42)(核心业务流程:借款额度审批(2))
- 1-1 Java基础和编程概述