题目描述
给了一个字符串,只有* 和 | ,分别表示盘子和蜡烛
再给了很多查询,对某个查询[x, y],问在区间内的且在蜡烛之间的盘子的个数?
基本分析
- 1个字符多个查询可以考虑什么?预处理
- 对每个查询x,y需要知道什么?索引>=x的最近的盘子位置;索引<=y的最近的盘子的位置
- 根据2的需求,需要预处理出什么?对每个数字x,找到索引<=x的蜡烛的索引l,left[x] = l; 对每个数字x,找到索引>=x的蜡烛的索引r,right[y] = r。
- 找到蜡烛以后,还需要知道啥?每个蜡烛左边的盘子的个数,可以在遍历left数组时候计算出来
- 怎么找到区间内的和?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 |
总结
- 统计left和right数组时候,如果左边和右边没有蜡烛怎么办?初值给成-1
- 当x=0时候,presum[-1]越界怎么办?如果x=0,表示x处是蜡烛,可以用presum[x]代替
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现