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;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浏览器访问本地文件

之前一直苦恼无法在浏览器访问本地文件&#xff0c;尤其是写的网页需要调用外部数据的时候&#xff0c;今天学习到可以用python很方便的解决问题 如果有python3环境&#xff0c;直接在对应的文件夹下运行&#xff08;这里是Ubuntu环境&#xff0c;如果是Windows应该在命令行也…

Ubuntu使用jupyter notebook +导出PDF

因为最近需要做数据分析的工作&#xff0c;所以复习了一下numpy和pandas&#xff0c;并安装了jupyter notebook进行数据分析&#xff0c;这里记录一下环境的设置。 ps:jupyter notebook真香 安装 python3 -m pip install --upgrade pip //升级pip pip3 install jupyter使用 …

SSH:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

给服务器重装了一下系统&#xff0c;结果报了上述错误&#xff1a; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! ...在网上找…

Ubuntu20.04 更新后黑屏无法加载驱动

本来我的电脑好好的&#xff0c;突然提示说有可应用的更新&#xff0c;我想都没想就直接更新了&#xff0c;可是没想到更新以后经过grub以后就会黑屏&#xff0c;一动不动&#xff0c;在网上搜索了许多&#xff0c;提到的说法是在grub界面对第一个Ubuntu的启动按e进行编辑 在倒…

每日一题:leetcode1489. 找到最小生成树里的关键边和伪关键边

时隔多年我终于又开始写博客了&#xff0c;主要是已经放假了&#xff0c;之前一直忙于考试和课设没有时间写博客&#xff0c;学习笔记也因为买了iPad的缘故大部分都是手写的了。 假期想要把以前做过的项目都整理一下放在github和CSDN上。 也已经很久没有写算法题了&#xff0…

每日一题:leetcode989.数组形式的整数加法

题目描述 题目分析 题目非常简单&#xff0c;但是我还是wa了几发&#xff0c;对不起&#xff0c;我太菜了。我的想法是把K转换为数组然后用大整数加法处理。但是因为太久没有写了导致写了好久。 class Solution { public:void add(vector<int> &A, vector<int&g…

每日一题:leetcode674.最长连续递增序列

题目描述 题目分析 一遍遍历&#xff0c;如果硬要说用了什么算法的话觉得应该算是一个简单的滑动窗口吧 AC代码 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {if (nums.size() 0) {return 0;}int ret 1;int cnt 1;for (int i 1; i <…

每日一题:leetcode959.由斜杠划分区域

题目描述 题目分析 仔细分析这道题以后虽然觉得可能要转化为图之类的&#xff0c;但是完全没有具体的想法&#xff0c;因为每个格子都有三种情况&#xff0c;这三种情况的不同的组合又会产生不同的结果。 发现找不到编码转化为图以后&#xff0c;我分析了一下不同数量方块之间…

每日一题:leetcode1319.联通网络的操作次数

题目描述 题目分析 ps&#xff1a;这篇博客是补前天的&#xff0c;前天在老家不方便写博客 题目挺简单的&#xff0c;但是通过题目对图的连通性有了一个更深刻的认识&#xff1a;如果有超过&#xff08;或等于&#xff09;n-1条边&#xff0c;则一定是可以让整个图联通的。 如…

每日一题:leetcode1128.等价多米诺骨牌对数

题目描述 题目分析 看到题目以后第一个想法是遍历数组&#xff0c;对每个元素有一个数据结构中保存了该元素出现的次数&#xff0c;然后往结果中相加&#xff08;表示该元素和前面的对数&#xff09;&#xff0c;然后再将元素出现的次数加一。 思考用什么数据结构保存元素出现…

每日一题:leetcode1579.保证图可完全遍历

题目描述 题目分析 非常惭愧&#xff0c;感觉自己有点畏难心理&#xff0c;看到是困难题第一个想法是自己想不出来。。。 因为自己认为自己做不出来&#xff0c;所以完全不能进行思考&#xff0c;稍微思考一下就觉得不行不行。 我也想到了分别用两个并查集判断各自可以去掉多少…

每日一题:leetcode724.寻找数组的中心索引

题目描述 题目分析 今天这道题原本很简单&#xff0c;我都没打算写题解&#xff0c;当时用手机看的题目&#xff0c;我想着我三分钟应该能写出来&#xff0c;结果没想到wa了三发。。。 对待简单题不要轻视&#xff0c;对待难题不要畏难。 今天的主要问题是没有看数据范围&…

C++Primer学习笔记:第2章 变量和基本类型

空类型不对应具体的值&#xff0c;仅用于一些特殊的场合 long的长度为32位&#xff0c;float有&#xff17;个有效位&#xff0c;double有16个有效位 如果数值超过了int的范围&#xff0c;应该用long long而不是long&#xff0c;long一般和int一样大 在算术表达式中不要使用…

C++Primer学习笔记:第3章 字符串、向量和数组

可以使用using声明而无需专门的前缀&#xff1a;using namespace::name;.。位于头文件的代码一般来说不应该使用using声明&#xff0c;这是因为头文件的内容会拷贝到所有引用他的文件中去&#xff0c;如果头文件中有某个using声明&#xff0c;那么每个使用了该头文件的文件都会…

C++Primer学习笔记:第4章 表达式

表达式由一个或多个运算对象组成&#xff0c;对表达式求值将得到一个结果。字面值和变量是最简单的表达式&#xff0c;其结果就是字面值和变量的值。把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式。 重载运算符包括运算对象的类型和返回值的类型&#xff0…

C++Primer学习笔记:第5章 语句

一个表达式末尾加上分号就变成了表达式语句。最简单的语句是空语句&#xff08;一个单独的分号&#xff09;&#xff1a;语法上需要一条语句但是逻辑上不需要 复合语句是指用花括号括起来的&#xff08;可能为空&#xff09;语句和声明的序列&#xff1a;用在语法上需要一条语…

z3 C++学习笔记

因为项目需要使用z3库来解决问题&#xff0c;所以自己学习了一下&#xff0c;结果发现网上教程比较少&#xff0c;而且大部分都是使用Python&#xff0c;而我本人是C的忠实信徒&#xff0c;在知道C也可以使用z3库以后我毫不犹豫地着手用C使用z3&#xff0c;但是我很快发现&…

C++Primer学习笔记:第6章 函数

通过调用运算符()调用函数 函数的调用完成两项工作&#xff1a; 用实参初始化函数对应的形参将控制权转移给被调用函数&#xff1a;主调函数的执行被暂时中断&#xff0c;被调函数开始执行 尽管实参与形参存在对应关系&#xff0c;但是并没有规定实参的求值顺序。编译器能以任…

C++Primer学习笔记:第8章 IO库

C语言不直接处理输入输出&#xff0c;而是通过一族定义在标准库中的类型来处理IO iostream定义了用于读写流的基本类型fstream定义了读写命名文件的类型sstream定义了读写内存string对象的类型 标准库使得我们能够忽略这些不同类型的流之间的差异&#xff0c;是通过继承机制实…

C++Primer学习笔记:第7章 类

类的基本思想是数据抽象data abstraction和封装encapsulation。数据抽象是一种依赖于接口interface和实现implementation分离的编程技术 在类中&#xff0c;由类的设计者负责考虑类的实现过程&#xff0c;使用该类的程序员只需要抽象地思考类型做了什么&#xff0c;而无须了解…