327 区间和的个数
题目描述
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.
Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive.
Note:
A naive algorithm of O(n2) is trivial. You MUST do better than that.
Example:
Input: nums = [-2,5,-1], lower = -2, upper = 2,
Output: 3
Explanation: The three ranges are : [0,0], [2,2], [0,2] and their respective sums are: -2, -1, 2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-of-range-sum
解题思路
我自己其实是没有什么思路的,只想到了暴力加前缀和,其实也思考了线段树,但是线段树求解区间和的速度比前缀和明显慢很多。
看了题解的第一种解法,并自己实现了一下,爆了一发long long
,第二遍就过了,虽然思路不是自己的但是还是很开心的。
决定跟随官方题解仔细研究一下这道题。
题解一
主要的思路在于考虑解决一个子问题:两个升序排列的数组a,ba,ba,b,求a[i]<b[j]a[i] < b[j]a[i]<b[j]的(i,j)(i,j)(i,j)对数量
实现代码:
class Solution {public:typedef long long ll;ll ans = 0;ll Lower, Upper;void Merge(vector<ll> &sum, vector<ll> &tmp, int l, int r){if(r - l <= 1) return ;int mid = (l + r) >> 1;Merge(sum, tmp, l, mid);Merge(sum, tmp, mid, r);int pl = mid, pr = mid;int idx = l;while(idx < mid){while(pl < r && sum[pl] < sum[idx] + Lower) ++pl;while(pr < r && sum[pr] <= sum[idx] + Upper) ++pr;ans += pr - pl;++idx;}int i = l, j = mid;idx = l;while(i < mid || j < r){if(j >= r || i < mid && sum[i] < sum[j]){tmp[idx++] = sum[i++];} else {tmp[idx++] = sum[j++];}}for(int i=l; i<r; ++i){sum[i] = tmp[i];}}int countRangeSum(vector<int>& nums, int lower, int upper) {int n = nums.size();Lower = lower; Upper = upper;vector<long long > sum(n+1, 0);vector<long long > tmp(n+1, 0);for(int i=1; i<=n; ++i){sum[i] = sum[i-1] + nums[i-1];}Merge(sum, tmp, 0, n+1);return ans;}
};
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. 区间和的个数 给定一个整数数组 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 ...
- 区间子数组个数 - LeetCode 795 - 从左向右与从右向左查找
一.问题描述 给你一个整数数组 nums 和 两个整数:left 及 right .找出 nums 中连续.非空且其中最大元素在范围 [left, right] 内的子数组,并返回满足条件的子数组的个 ...
- python根据excel时间表统计24小时各小时区间点的个数
1.首先使用excel中的HOUR()函数,将日期数据(年/月/日 时:分:秒)转换为小时,表格命名为hour.xlsx: 2.使用python读取excel数据hour.xlsx,将小时列转换为列表 ...
最新文章
- 云计算公司Zuora提交IPO申请 预计募资1亿美元
- 项目支出数据产生过程
- 软件工程编码阶段_软件工程的编码阶段
- ZZULIOJ 1064:加密字符
- Nagios(一)——LAMP 环境搭建
- 《淘宝网开店 进货 运营 管理 客服 实战200招》——1.11 开店前要做好调查,预测市场...
- Biopython -- SeqRecord
- 【Arduino】步进电机驱动程序Stepper_Motor_TB6600
- 什么是微信WXID数据?
- html图表插入ppt
- windows未能启动计算机,电脑开机windows未能启动是怎么回事
- Java后端工程师在做什么
- indesign选中不了图片删除_图片神器XnView教程、方法和技巧汇总
- c语言 统计数量用count_C语言中count该怎么用
- 网络营销中的动态定价策略
- 干货秘籍:网易游戏《率土之滨》原画设计师分享创作设计经验
- 审核工作流程图、在线流程图、审批流程设计、在线绘图
- TestNG测试报告美化buid.xml配置
- 微软家族的首个跨平台开发工具 Visual Studio Code
- 我爸是李刚 java_深入理解java继承从“我爸是李刚”讲起
热门文章
- mysql复制模式第二部分-----双主模式
- apt-get update 问题 及gcc高亮
- 20135127陶俊杰 实验一
- SEO你所不知道的!!SEO资源人脉才是王道
- jquery ajax 上传文件 demo,Jquery+AJAX上传文件,无刷新上传并重命名文件
- wps表格粗线和细线区别_详解论文中的表格技术
- python 编码声明位置,python中的编码声明
- 华为鸿蒙不再孤,华为鸿蒙OS系统不再孤单!又一款国产系统启动内测:再掀国产替代化...
- nacos配置ap_Nacos 1.0.0 功能预览
- php8更新,PHP 8 中新特性以及重大调整