【LeetCode 327】区间和的个数
题目描述
给定一个整数数组
,返回区间和在 之间的个数,包含 和 。区间和 表示在 中,位置从 到 的元素之和,包含 和 。
示例1
输入:
nums = [-2,5,-1], lower = -2, upper = 2,
输出:
3
解释:
3个区间分别是: [0,0], [2,2], [0,2],它们表示的和分别为: -2, -1, 2。
题解
最暴力的解法就是
枚举所有区间,然后判断,显然会超时。
对于区间
来说,它的和可以表示为 ,其中 是前缀和,表示第 个到第 个元素之和。
如果这个区间满足条件,那就有 。如果我们遍历每个
的话,只要求出满足 的左端点 的数量即可。
如果将
数组排好序,那就能直接用二分法找出满足条件的数量了。但是这里需要在遍历右端点 的时候动态插入 ,然后只对 到 进行排序。而目前应该没有什么数据结构能很快的同时支持动态有序插入和二分查找。
因此这里可以采用树状数组(或线段树),来求取一段区间的和是多少。而树状数组的值表示这个数有没有出现过(0或1)。
对于注意到这里有负数出现,因此需要先做离散化,对于每个前缀和
,只需要离散化三个值:、、 即可。
代码
c++
typedef long long ll;class BIT {
private:static const int MAXN = 100010;int bit[MAXN];public:BIT() {memset(bit, 0, sizeof bit);}int lowbit(int x) {return x&(-x);}void add(int i, int x) {while (i < MAXN) {bit[i] += x;i += lowbit(i);}}void sub(int i, int x) {while (i < MAXN) {bit[i] -= x;i += lowbit(i);}}int sum(int i) {int s = 0;while (i > 0) {s += bit[i];i -= lowbit(i);}return s;}
};class ID {
private:unordered_map<ll, int> mp;set<ll> st;int idx;public:ID() {mp.clear();st.clear();idx = 1;}void addNum(ll x) {st.insert(x);}void proj() {for (ll x: st) {mp[x] = idx++;}}int getID(ll x) {return mp[x];}
};class Solution {
public:int countRangeSum(vector<int>& nums, int lower, int upper) {int n = nums.size();ll sum = 0, res = 0;ID id = ID();BIT bit = BIT();id.addNum(0);for (int i = 0; i < n; ++i) {sum += nums[i];id.addNum(sum);id.addNum(sum-lower);id.addNum(sum-upper);}id.proj();bit.add(id.getID(0), 1);sum = 0;for (int i = 0; i < n; ++i) {sum += nums[i];int lb = id.getID(sum-upper), rb = id.getID(sum-lower);res += bit.sum(rb) - bit.sum(lb-1);bit.add(id.getID(sum), 1);}return res;}
};
作者简介:godweiyang,知乎同名,华东师范大学计算机系硕士在读,方向自然语言处理与深度学习。喜欢与人分享技术与知识,期待与你的进一步交流~
我的微信:godweiyang。有任何问题都可以在评论区留言,也欢迎加我微信深入沟通~
【LeetCode 327】区间和的个数相关推荐
- leetcode 327. 区间和的个数(treemap)
给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包 ...
- LeetCode 327. 区间和的个数(multiset二分查找/归并排序)
文章目录 1. 题目 2. 解题 2.1 动态规划超时 2.2 二分查找 2.3 归并排序 1. 题目 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 low ...
- [leetCode]327. 区间和的个数
题目 链接:https://leetcode-cn.com/problems/count-of-range-sum 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数, ...
- 327 区间和的个数
题目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusi ...
- LeetCode 795. 区间子数组个数
给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = [2, 1, 4, 3] ...
- 区间子数组个数 - LeetCode 795 - 从左向右与从右向左查找
一.问题描述 给你一个整数数组 nums 和 两个整数:left 及 right .找出 nums 中连续.非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个 ...
- 树状数组求逆序对_区间和的个数(树状数组)
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 ...
- zoj 2112 树状数组 套主席树 动态求区间 第k个数
总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...
- [归并排序]leetcode327:区间和的个数(hard)
题目: 题解: 思路:归并排序 1)对于区间和的快速求解需要使用前缀和,由于 a 中的元素有正有负,所以前缀和数组不是单调递增的,我们可以对前缀和数组进行归并排序,顺便计算区间和的个数,求 pre[j ...
最新文章
- 使用C语言来扩展PHP,写PHP扩展dll
- python实现验证码与进度条
- 信息学奥赛一本通 1092:求出e的值 | OpenJudge NOI 1.5 35
- 不到70行 Python 代码,轻松玩转 RFM 用户分析模型(附案例数据和代码)
- 计算机专业课教学,计算机专业课教学的原则和方法
- 计算机各个盘找不到应用程序,电脑硬盘打不开 提示找不到应用程序
- python相关性分析
- 北京地标《信息化项目软件开发费用测算规范》完成公开征求意见
- selenium模拟登陆163邮箱
- CC00051.elasticsearch——|HadoopElasticSearch.V03|——|ELK.v03Logstash部署.V3|
- HTML5网页中的链接
- HTTP网页从请求到响应过程详解
- Centos 7安装Gnome图形界面
- Glove 细节介绍
- bandit(21-25)
- Autojs 谁是卧底-炸弹猫计牌辅助
- SQL:DBMS函数的差异(限制输出结果、拼接字段)
- PHP代码审计DVWASQL注入[SQL Injection]
- (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
- android开发 nfc,Android NFC开发概述
热门文章
- windows下nginx+mono+fastCGI部署asp.net网站
- php底层深度探索(3) ---Apache启动阶段分析 王泽宾
- Matlab代码生成任意边长等间距正六边形采样点
- office2019 使用
- 测试一软件测试基础知识总结
- Ubuntu18.04 下搭建Hyperledger Fabric 1.0.0环境
- Idea 里svn的导入使用
- Android开发中Ant命令编译和APK签名的一些心得
- 切断数据感知控件,大大提升软件运行速度
- [转]详细解说:简单CSS3实现炫酷读者墙