力扣795.区间子数组个数 | 树状数组解法

server/2024/9/24 13:00:02/

Problem: 795. 区间子数组个数

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

示例 1:

输入:nums = [2,1,4,3], left = 2, right = 3
输出:3
解释:满足条件的三个子数组:[2], [2, 1], [3]
示例 2:

输入:nums = [2,9,2,5,6], left = 2, right = 8
输出:7

文章目录

  • 思路
  • 复杂度
  • Code

思路

  • 思路本质和官方题解的一次遍历做法一样。
  • 我看到区间就往树状数组想,确实能做,没想到ac完看到官方题解,时间、空间复杂度很少就ac了。所以就当为此题提供一种新的解决方法吧。

复杂度

时间复杂度:

O ( n l o g n ) O(nlogn) O(nlogn)

空间复杂度:

O ( n ) O(n) O(n)

Code

const int MAX = 1e5+5;
int tr[MAX];
int lowbit(int x){return x&-x;}
void add(int x,int val){for(;x<MAX;x+=lowbit(x))tr[x]+=val;
}
// query表示的状态:以这个数作末尾有几种情况
int query(int x){int res=0;for(;x>0;x-=lowbit(x)){res+=tr[x];}return res;
}
class Solution {
public:// 单个区间的子数组个数(已保证该区间的所有数都<=right)int numArray(vector<int>& nums, int left) {memset(tr,0,sizeof(tr));int res=0;int lastIndex=-1;// lastIndex记录符合[left,right]的数的下标,不断更新for(int i=1;i<=nums.size();++i){// 树状数组下标从1开始add(i,1);// 如果数字小于left,就往左找到第一个符合[left,right]的数,结果加上他本身存在的情况数if(nums[i-1]<left&&lastIndex!=-1)res+=query(lastIndex);// 如果数字符合[left,right],则总数加上以这个数作末尾的情况if(nums[i-1]>=left){res+=query(i);lastIndex=i;}}return res;}int numSubarrayBoundedMax(vector<int>& nums, int left, int right) {int res=0;// 利用每个大于right的数去划分,得到多个子区间,对每个区间都使用numArray去计算该区间的数量,最后累加即可vector<int>tmp;for(auto num:nums){if(num<=right)tmp.emplace_back(num);else{if(tmp.size()>0){res+=numArray(tmp,left);tmp.clear();}}}if(tmp.size()>0){res+=numArray(tmp,left);tmp.clear();}return res;}
};

http://www.ppmy.cn/server/16654.html

相关文章

Vs Code npm install 报错解决方法

用的人家的前端框架发现是封装过的&#xff0c;要修改人家前端的话还得把前端源码放在Vs Code 上运行&#xff0c;后端放在IDEA上运行&#xff0c;然后前后端并行开发&#xff0c;在配置前端环境时遇到&#xff1a; npm install 这个的原因是我把node下载到D盘了权限不够框框爆…

【树莓派】强力烧写工具 Balena Etcher,烧写树莓派系统,树莓派系统克隆,备份

文章目录 使用Win32DiskImager备份和写入树莓派系统步骤一&#xff1a;下载和安装Win32DiskImager步骤二&#xff1a;准备工作步骤三&#xff1a;备份树莓派系统步骤四&#xff1a;写入树莓派系统 使用Balena Etcher给树莓派烧写系统Balena Etcher简介步骤一&#xff1a;下载Ba…

Oracle数据库的简单使用

Oracle简单使用 一、数据库的介绍二、Oracle介绍账号管理Oracle的安装Oracle服务的作用OracleRemExecService服务创建数据库 常用命令 三、SQL语言SQL分类实用的数据表添加注释数据操纵语言&#xff08;DML&#xff09;查询语句&#xff08;SELECT&#xff09;wherelikedistinc…

Vue.prototype则是一种注册全局变量的方式,使得定义的属性和方法可以在所有Vue实例中共享和访问。

Vue.prototype是Vue构造函数的原型对象&#xff0c;它用于向所有Vue实例添加共享的方法和属性。通过在Vue.prototype上定义方法&#xff0c;可以确保这些方法在所有Vue实例中都是可用的。这种设计主要是为了防止全局变量的污染&#xff0c;并提供了一种更规范的方式来访问全局方…

车企如何利用数据技术,指导汽车全生命周期的业务运营?

引言&#xff1a;数据正作为重点&#xff0c;为行业提供不可或缺的指导 《汽车数据发展研究报告&#xff08;2023&#xff09;》指出&#xff0c;汽车行业正由传统硬件制造向“电动化、智能化、网联化”方向转变。德勤预测&#xff0c;到 2025 年&#xff0c;汽车行业 20%的利…

前端如何优化工程

文章目录 使用CDN1. 请求定位&#xff1a;2.内容缓存&#xff1a;3.负载均衡&#xff1a;4.边缘计算&#xff1a; 优化Webpack1.合理配置Loader&#xff1a;2.优化代码分割&#xff1a;3.压缩和优化输出文件&#xff1a;4.利用Tree Shaking&#xff1a;5.优化解析速度&#xff…

jvm知识点总结(二)

Java8默认使用的垃圾收集器是什么? Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器&#xff08;Parallel GC&#xff09; 如果CPU使用率飙升&#xff0c;如何排查? 1.先通过top定位到消耗最高的进程id 2.执行top -h pid单独监控该进程 3.在2中输入H&#xff…

使用Python进行自然语言处理:情感分析

使用Python进行自然语言处理的热门应用:情感分析 自然语言处理(NLP)是人工智能领域中的一个重要分支,它致力于使计算机能够理解、解释和生成人类语言。在NLP的诸多应用中,情感分析是一项备受关注的热门应用之一。情感分析(Sentiment Analysis)是通过分析文本中的情感色…