2055. 蜡烛之间的盘子

题目描述

给了一个字符串,只有* 和 | ,分别表示盘子和蜡烛
再给了很多查询,对某个查询[x, y],问在区间内的且在蜡烛之间的盘子的个数?

f1-预处理+前缀和

基本分析

  1. 1个字符多个查询可以考虑什么?预处理
  2. 对每个查询x,y需要知道什么?索引>=x的最近的盘子位置;索引<=y的最近的盘子的位置
  3. 根据2的需求,需要预处理出什么?对每个数字x,找到索引<=x的蜡烛的索引l,left[x] = l; 对每个数字x,找到索引>=x的蜡烛的索引r,right[y] = r。
  4. 找到蜡烛以后,还需要知道啥?每个蜡烛左边的盘子的个数,可以在遍历left数组时候计算出来
  5. 怎么找到区间内的和?presum[y] - presum[x-1]

代码

class Solution:
def platesBetweenCandles(self, s: str, queries: List[List[int]]) -> List[int]:
n = len(s)
left, l = [0] * n, -1
presum = [0] * n
cnt = 0
for i in range(n):
if s[i] == "|":
l = i
else:
cnt += 1
left[i] = l
presum[i] = cnt
right, r = [0] * n, -1
for i in range(n-1, -1, -1):
if s[i] == '|':
r = i
right[i] = r
m = len(queries)
ans = [0] * m
for i, (x, y) in enumerate(queries):
x, y = right[x], left[y]
if x >= 0 and y >= 0 and x < y:
ans[i] = presum[y] - presum[x]
return ans

总结

  1. 统计left和right数组时候,如果左边和右边没有蜡烛怎么办?初值给成-1
  2. 当x=0时候,presum[-1]越界怎么办?如果x=0,表示x处是蜡烛,可以用presum[x]代替
posted @   zhangk1988  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示