当前位置: 首页 > news >正文

算法:树状数组

文章目录

      • 面试题 10.10. 数字流的秩
      • 327. 区间和的个数
      • 315. 计算右侧小于当前元素的个数

树状数组可以理解一种数的存储格式。
在这里插入图片描述

面试题 10.10. 数字流的秩

假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。
请实现数据结构和算法来支持这些操作,也就是说:
实现 track(int x) 方法,每读入一个数字都会调用该方法;
实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个数。

面试题 10.10. 数字流的秩

class StreamRank {vector<int> v;int lowbit(int x) {return x & -x;}
public:StreamRank(): v(50002, 0) {}void track(int x) {++x; //x + 1是因为树状数组处理的元素下标从1开始while (x <= 50001) {v[x]++;x += lowbit(x);}}int getRankOfNumber(int x) {++x;int ans = 0;while (x) {ans += v[x];x -= lowbit(x);}return ans;}
};
class StreamRank:def __init__(self):self.l = [0]*50002def lowBit(self, x):return x & (-x)def track(self, x: int) -> None:x += 1while x <= 50001:self.l[x] += 1x += self.lowBit(x)def getRankOfNumber(self, x: int) -> int:x += 1ans = 0while x:ans += self.l[x]x -= self.lowBit(x)return ans

327. 区间和的个数

给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。
区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

327. 区间和的个数
区间过大,hash,然后到树状数组。

class Solution:def countRangeSum(self, nums, lower: int, upper: int) -> int:n = len(nums)prefixs = [0]*nt = 0ans = 0for i in range(n):t += nums[i]prefixs[i] = tif lower<= t<= upper:ans += 1s = set()for i in range(n):s.add(prefixs[i])s.add(prefixs[i]-lower)s.add(prefixs[i] - upper)l = sorted(s)d = {x: i+1 for i, x in enumerate(l)}  # hash到固定长度trie = [0]*(len(d)+1)  # 树状数组for i in range(n):left, right = d[prefixs[i]-upper], d[prefixs[i]-lower]ans += self.query(trie, right) - self.query(trie, left-1)self.insert(trie, d[prefixs[i]])return ansdef query(self, trie, x):ans = 0while x:ans += trie[x]x -= x & (-x)return ansdef insert(self, trie, x):while x < len(trie):trie[x] += 1x += x & (-x)

315. 计算右侧小于当前元素的个数

给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

315. 计算右侧小于当前元素的个数

class Solution:def countSmaller(self, nums: List[int]) -> List[int]:n = len(nums)l = [0]*20002 # -10000~10000 -> 2~20002 因为求小于x的值,x=2,count输入x=1ans = [0]*nfor i in range(n-1,-1,-1):x = nums[i] + 10002ans[i] = self.count(l, x-1)self.insert(l, x)return ansdef count(self, l, x):ans = 0while x:ans += l[x]x -= self.lowBit(x)return ansdef lowBit(self, x):return x & (-x)def insert(self, l, x):while x < len(l):l[x] += 1x += self.lowBit(x)

算法学习笔记(2) : 树状数组

http://www.lryc.cn/news/357695.html

相关文章:

  • Kafka SASL_SSL集群认证
  • 同城交友论坛静态页面app Hbuild
  • spring session+redis存储session,实现用户登录功能,并在拦截器里面判断用户session是否过期,过期就跳转到登录页面
  • Debug-013-el-loading中显示倒计时时间
  • 5月29日,每日信息差
  • 2024年弘连网络FIC大会竞赛题线下决赛题
  • Element-UI 入门指南:从安装到自定义主题的详细教程
  • vs工程添加自定义宏
  • shell脚本:将一维数组以二维数组显示
  • QT C++ 读写mySQL数据库 图片 例子
  • Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数
  • Facebook之魅:数字社交的体验
  • 【重装windows遇到网络适配器无法更改】
  • FFmpeg+QT播放器实战1---UI页面的设计
  • C/C++语法|pthread线程库的使用
  • 四川汇聚荣聚荣科技有限公司是正规的吗?
  • tomcat学习--部署java项目
  • 用 vue3 + phaser 实现经典小游戏:飞机大战
  • 【Linux|数据恢复】extundelete和ext4magic数据恢复工具使用
  • 用户接入和认证技术
  • 【面试】Java虚拟机的生命周期
  • Nginx高可用性架构:实现负载均衡与故障转移的探索
  • 计算机网络-运输层
  • 网络通信(一)
  • Linux环境中部署docker私有仓库Registry与远程访问详细流程
  • springboot项目使用validated参数校验框架
  • Azure Chatgpt demo部署——本地CentOS Docker
  • MybatisPlus中自定义sql
  • HCIA--DHCP: 动态主机配置协议 (复习)
  • MySQL select for update 加锁