题目描述

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 区间和的个数相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. [归并排序]leetcode327:区间和的个数(hard)

    题目: 题解: 思路:归并排序 1)对于区间和的快速求解需要使用前缀和,由于 a 中的元素有正有负,所以前缀和数组不是单调递增的,我们可以对前缀和数组进行归并排序,顺便计算区间和的个数,求 pre[j ...

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

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

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

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

最新文章

  1. 云计算公司Zuora提交IPO申请 预计募资1亿美元
  2. 项目支出数据产生过程
  3. 软件工程编码阶段_软件工程的编码阶段
  4. ZZULIOJ 1064:加密字符
  5. Nagios(一)——LAMP 环境搭建
  6. 《淘宝网开店 进货 运营 管理 客服 实战200招》——1.11 开店前要做好调查,预测市场...
  7. Biopython -- SeqRecord
  8. 【Arduino】步进电机驱动程序Stepper_Motor_TB6600
  9. 什么是微信WXID数据?
  10. html图表插入ppt
  11. windows未能启动计算机,电脑开机windows未能启动是怎么回事
  12. Java后端工程师在做什么
  13. indesign选中不了图片删除_图片神器XnView教程、方法和技巧汇总
  14. c语言 统计数量用count_C语言中count该怎么用
  15. 网络营销中的动态定价策略
  16. 干货秘籍:网易游戏《率土之滨》原画设计师分享创作设计经验
  17. 审核工作流程图、在线流程图、审批流程设计、在线绘图
  18. TestNG测试报告美化buid.xml配置
  19. 微软家族的首个跨平台开发工具 Visual Studio Code
  20. 我爸是李刚 java_深入理解java继承从“我爸是李刚”讲起

热门文章

  1. mysql复制模式第二部分-----双主模式
  2. apt-get update 问题 及gcc高亮
  3. 20135127陶俊杰 实验一
  4. SEO你所不知道的!!SEO资源人脉才是王道
  5. jquery ajax 上传文件 demo,Jquery+AJAX上传文件,无刷新上传并重命名文件
  6. wps表格粗线和细线区别_详解论文中的表格技术
  7. python 编码声明位置,python中的编码声明
  8. 华为鸿蒙不再孤,华为鸿蒙OS系统不再孤单!又一款国产系统启动内测:再掀国产替代化...
  9. nacos配置ap_Nacos 1.0.0 功能预览
  10. php8更新,PHP 8 中新特性以及重大调整