树状数组讲解

文章目录

    • 1395.统计作战单位数

树状数组b站博主
灵神博主

tree数组Tree[i] 存储的是原本的数组中num[i - (i&-i)+1]到nums[i]的和
更新的时候,num[i[更新,逐一修改num[i+(i & -i)]

307.区间和检索-数组可修改

题目实战

在这里插入图片描述

总的代码:


class NumArray:__slots__ = 'nums', 'tree'def __init__(self, nums: List[int]):n = len(nums)# 注意,nums 是从0-n-1的下标,tree是1-n的下标self.nums = [0] * n  # 使 update 中算出的 delta = nums[i]self.tree = [0] * (n + 1)for i, x in enumerate(nums):self.update(i, x)def update(self, index: int, val: int) -> None:delta = val - self.nums[index]self.nums[index] = vali = index + 1# 注意这个+1的操作是下标的对应的操作while i < len(self.tree):self.tree[i] += deltai += i & -idef prefixSum(self, i: int) -> int:s = 0while i:s += self.tree[i]i &= i - 1  # i -= i & -i 的另一种写法return sdef sumRange(self, left: int, right: int) -> int:return self.prefixSum(right + 1) - self.prefixSum(left)

1395.统计作战单位数

在这里插入图片描述
在这里插入图片描述

力扣参照博主

思路分析:这个题目的关键就是在于,外层的循环想需要遍历全部的rating,然后就是统计rating[i]的前面有多少个元素小于 和 大于 rating[i[,以及对应的rating[i[后面有多少个元素小于和大于rating[i]
一般情况下,我们就是通过暴力进行统计的,对于这个题目来说暴力的时间的复杂度就是 O(n^2),对于这个题目来说,由于rating.length<=1000,所以并不会超时,但是优化来说,还是使用树状数组来维护最好,树状数组由于在更新和查询都是 o(logn),所以总体的时间复杂度是 o(nlogn)

在这里插入图片描述

# 暴力情况
class Solution:def numTeams(self, rating: List[int]) -> int:ans = 0n = len(rating)for i in range(1, n-1):# 前序元素small1 = 0      # 前序元素中小于当前值的元素数目for j in range(i):if rating[j] < rating[i]:small1 += 1# large1:前序元素中大于当前值的元素数目【满足small1+large1=i】large1 = i - small1# 后序元素small2 = 0      # 后序元素中小于当前值的元素数目for j in range(i+1, n):if rating[j] < rating[i]:small2 += 1# large2:后序元素中大于当前值的元素数目【满足small2+large2=n-1-i】large2 = n-1 - i - small2ans += small1*large2 + large1*small2return ans

如何理解这个树状数组的作用?
我们开始的时候并不是为了树状数组而使用树状数组,对于这个题目来说,我们可以按照rating[i]的顺序,使用一个数组nums[i]=1,然后对于当前的rating[i],我们只用求解 nums[i] 前面的前缀和就知道有多少个元素小于nums[i]

# 树状数组
class Solution:def numTeams(self, rating: List[int]) -> int:def lowbit(x):          # lowbit函数:二进制最低位1所表示的数字return x & (-x)def add(i, delta):      # 单点更新:执行+deltawhile i<len(tree):tree[i] += deltai += lowbit(i)def query(i):           # 前缀和查询presum = 0while i>0:presum += tree[i]i -= lowbit(i)return presum'''主程序'''# 离散化:绝对数值转秩次rankuniques = sorted(rating)    # rating没有重复值rank_map = {v:i+1 for i,v in enumerate(uniques)}    #【rank从1开始】# 构建树状数组tree = [0] * (len(rank_map) + 1)    # 树状数组下标从1开始# 枚举中间点ans = 0n = len(rating)add(rank_map[rating[0]], 1)     # 先将第一个元素入列for i in range(1, n-1):         # 从第二个元素开始遍历,直至倒数第二个元素rank = rank_map[rating[i]]  # 当前元素的排名/秩次small1 = query(rank-1)      # 查询前序元素中排名<rank的元素数目large1 = i - small1         # small1 + large1 = ismall2 = (rank-1) - small1  # 共有rank-1个元素排名<rank:small1 + small2 = rank-1large2 = n-1 - i - small2   # small2 + large2 = n-1-iadd(rank, 1)                # 当前元素入列ans += small1*large2 + large1*small2return ans

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

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

相关文章

PostGIS笔记:PostgreSQL中表、键和索引的基础操作

创建、查看与删除表 在数据库中创建一个表&#xff0c;使用如下代码&#xff1a; create table streets (id serial not null primary key, name varchar(50));这里的表名是streets&#xff0c;id是主键所以非空&#xff0c;采用serial数据类型&#xff0c;这个数据类型会自动…

【JavaEE进阶】图书管理系统 - 壹

目录 &#x1f332;序言 &#x1f334;前端代码的引入 &#x1f38b;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f343;后端服务器代码实现 &#x1f6a9;登录接口 &#x1f6a9;图书列表接口 &#x1f384;前端代码实现 &#x1f6a9;登录页面 &#x1f6a9;…

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

C++:多继承习题3

题目内容&#xff1a; 声明一个时间类Time&#xff0c;时间类中有3个私有数据成员(Hour&#xff0c;Minute&#xff0c;Second)和两个公有成员函数(SetTime和PrintTime)。要求&#xff1a; &#xff08;1&#xff09; SetTime根据传递的3个参数为对象设置时间&#xff1b; &a…

14-6-2C++STL的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…

Elasticsearch——Elasticsearch性能优化实战

摘要 本文主要介绍了 Elasticsearch 性能优化的实战方法&#xff0c;从硬件配置优化、索引优化设置、查询方面优化、数据结构优化以及集群架构设计等五个方面进行了详细阐述&#xff0c;旨在帮助读者提升 Elasticsearch 的性能表现。 1. 硬件配置优化 升级硬件设备配置一直都…

Linux进程调度与等待:背后的机制与实现

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 当一个进程发起某种操作&#xff08;如I/O请求、信号、锁的获取等&#xff09;&#xff0c;但该操作需要的资源暂时不可用时&#xff0c;进程会被操作系统挂起&#xff0c;进入“等待队列”或“阻塞状态”。…

【教学类-89-02】20250128新年篇02——姓名藏头对联(星火讯飞+Python,五言对联,有横批)

背景需求&#xff1a; 过年了&#xff0c;我想用幼儿的名字写对联&#xff0c;但是我根本不会写&#xff0c;于是尝试让AI来写。 1.我班的孩子的名字都是2字和3字的 2.惊喜发现&#xff0c;AI它很快就能生成带名字的对联 但是观察发现&#xff0c;如果是二个名字的对联&#…

Node.js基础

浏览器知识 浏览器 个浏览器都内置了DOM、BOM等API函数&#xff0c;供浏览器中的Javascript调用。 每个浏览器都有对应的JavaScript解析引擎。 浏览器中的JavaScript环境 V8引擎负责解析和执行JavaScript代码 内置API是由运行环境提供的特殊接口&#xff0c;只能在所属的运…

【漫话机器学习系列】066.贪心算法(Greedy Algorithms)

贪心算法&#xff08;Greedy Algorithms&#xff09; 贪心算法是一种逐步构建解决方案的算法&#xff0c;每一步都选择当前状态下最优的局部选项&#xff08;即“贪心选择”&#xff09;&#xff0c;以期望最终获得全局最优解。贪心算法常用于解决最优化问题。 核心思想 贪心选…

WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用

WPF基础 | WPF 常用控件实战&#xff1a;Button、TextBox 等的基础应用 一、前言二、Button 控件基础2.1 Button 的基本定义与显示2.2 按钮样式设置2.3 按钮大小与布局 三、Button 的交互功能3.1 点击事件处理3.2 鼠标悬停与离开效果3.3 按钮禁用与启用 四、TextBox 控件基础4.…

GD32的GD库开发

所有的Cortex-M处理器都有相同的SysTick定时器&#xff0c;因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。 这个定时器可以用作延时函数&#xff0c;不管是STM32的芯片还是GD32&#xff0c;AT32的芯片&#xff0c;delay函数都可以这么写&#xff0c;只要它是cortex-M…

跨域问题及解决方案

跨域问题不仅影响开发效率&#xff0c;还可能导致项目进度延误。因此&#xff0c;理解和掌握跨域问题的原理及其解决方案对于前端开发者和后端开发者来说都至关重要。本文将详细介绍什么是跨域、跨域产生的原因&#xff0c;以及常见的后端跨域解决方案。 文章目录 一、什么是跨…

MoE的学习

1.MoE的介绍 混合专家模型&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;是一种先进的神经网络架构&#xff0c;旨在通过整合多个模型或“专家”的预测来提升整体模型性能。MoE模型的核心思想是将输入数据分配给不同的专家子模型&#xff0c;然后将所有子模型的输…

c++学习第十四天

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考。 //力扣代码 class Solution {const char* numStrArr[10]{"","","abc","def","ghi","jkl","mno","pqrs","tuv&q…

【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像

一、背景 由于国际镜像国内无法直接访问&#xff0c;会导致搜索模型时加载失败&#xff0c;如下&#xff1a; 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意&#xff1a;务…

循序渐进kubernetes-RBAC(Role-Based Access Control)

文章目录 概要Kubernetes API了解 Kubernetes 中的 RBACRoles and Role Bindings:ClusterRoles and ClusterRoleBindings检查访问权限&#xff1a;外部用户结论 概要 Kubernetes 是容器化应用的强大引擎&#xff0c;但仅仅关注部署和扩展远远不够&#xff0c;集群的安全同样至…

思维练习题

目录 第一章 假设法1.题目1. 如何问问题2. 他们的职业是分别什么3. 谁做对了4. 鞋子的颜色 2.答案 空闲时间写一些思维题来锻炼下思维逻辑&#xff08;题目均收集自网上&#xff0c;分析推理为自己所写&#xff09;。 第一章 假设法 一个真实的假设往往可以让事实呈现眼前&…

HarmonyOS:创建应用静态快捷方式

一、前言 静态快捷方式是一种在系统中创建的可以快速访问应用程序或特定功能的链接。它通常可以在长按应用图标&#xff0c;以图标和相应的文字出现在应用图标的上方&#xff0c;用户可以迅速启动对应应用程序的组件。使用快捷方式&#xff0c;可以提高效率&#xff0c;节省了查…

深入探索C++17的std::any:类型擦除与泛型编程的利器

文章目录 基本概念构建方式构造函数直接赋值std::make_anystd::in_place_type 访问值值转换引用转换指针转换 修改器emplaceresetswap 观察器has_valuetype 使用场景动态类型的API设计类型安全的容器简化类型擦除实现 性能考虑动态内存分配类型转换和异常处理 总结 在C17的标准…