题目:

给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s ,它只包含字符 '*' 和 '|' ,其中 '*' 表示一个 盘子 ,'|' 表示一支 蜡烛 。

同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示 子字符串 s[lefti...righti] (包含左右端点的字符)。对于每个查询,你需要找到 子字符串中 在 两支蜡烛之间 的盘子的 数目 。如果一个盘子在 子字符串中 左边和右边 都 至少有一支蜡烛,那么这个盘子满足在 两支蜡烛之间 。

比方说,s = "||**||**|*" ,查询 [3, 8] ,表示的是子字符串 "*||**|" 。子字符串中在两支蜡烛之间的盘子数目为 2 ,子字符串中右边两个盘子在它们左边和右边 都 至少有一支蜡烛。
请你返回一个整数数组 answer ,其中 answer[i] 是第 i 个查询的答案。

示例 1:

输入:s = "**|**|***|", queries = [[2,5],[5,9]]
输出:[2,3]
解释:
- queries[0] 有两个盘子在蜡烛之间。
- queries[1] 有三个盘子在蜡烛之间。
示例 2:

输入:s = "***|**|*****|**||**|*", queries = [[1,17],[4,5],[14,17],[5,11],[15,16]]
输出:[9,0,0,0,0]
解释:
- queries[0] 有 9 个盘子在蜡烛之间。
- 另一个查询没有盘子在蜡烛之间。

提示:

3 <= s.length <= 105
s 只包含字符 '*' 和 '|' 。
1 <= queries.length <= 105
queries[i].length == 2
0 <= lefti <= righti < s.length

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/plates-between-candles
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结果:

解题思路:

这个题如果用暴力法循环获取,虽然构造的表格可能少了,但是会超时。

因此看了题解找到了预处理的方法。

首先,我们要找到给的范围中最长的蜡烛之间的距离,因此左侧要找最靠近的右边的蜡烛坐标,右侧要找最靠近的左边的坐标。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
* * * | * * | * * * * * | * * | | * * | *
盘子个数 1 2 3 3 4 5 5 6 7 8 9 10 10 11 12 12 12 13 14 14 15
left -1 -1 -1 3 3 3 6 6 6 6 6 6 12 12 12 15 16 16 16 19 19
right 3 3 3 3 6 6 6 12 12 12 12 12 12 15 15 15 16 19 19 19 -1

如上图:盘子的个数是从左往右数的,left表示左边最近的蜡烛坐标,right表示右侧最近的蜡烛坐标。

1、当queries中获取的坐标(X,Y)要去其区间中做大的蜡烛区间,

也就是X要取其右侧最近的蜡烛,Y要取其左侧最近的蜡烛。

2、由此获得两个新的坐标(L,R)

3、通过L和R所在下标的盘子个数计算区间中能拥有多少盘子。

**如果L或者R取值为-1,那么说明当前没有蜡烛,也就不可能有区间内最大盘子数,直接取0.

用 R所在下标的盘子个数 - L所在下标的盘子个数 = 其区间的盘子个数。

注意:这里有可能获取为负数,因此需要判断为负数的时候改为0.

代码:

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* platesBetweenCandles(char * s, int** queries, int queriesSize, int* queriesColSize, int* returnSize){int len = strlen(s);int *counts = (int *)malloc(sizeof(int) * len);  // 用于存储到这个位置位置有几个盘子了int *left = (int *)malloc(sizeof(int) * len);  // 用于存储左侧最近的蜡烛位置int *right = (int *)malloc(sizeof(int) * len);  // 用于存储右侧最近的蜡烛位置// 设置盘子数量表格和最近左侧的蜡烛坐标for (int i = 0; i < len; i++) {if (s[i] == '*') {if (i == 0) {counts[i] = 1;left[i] = -1;} else {counts[i] = counts[i - 1] + 1;left[i] = left[i - 1];}} else {if (i == 0) {counts[i] = 0;} else {counts[i] = counts[i - 1];}left[i] = i;}}// 设置最近右侧蜡烛坐标表for (int i = len - 1; i >= 0; i--) {if (s[i] == '*') {if (i == len - 1) {right[i] = -1;} else {right[i] = right[i + 1];}} else {right[i] = i;}}int *retArr = (int *)malloc(sizeof(int) * queriesSize); for (int i = 0; i < queriesSize; i++) {int l = right[queries[i][0]];int r = left[queries[i][1]];if (l < 0 || r < 0) {retArr[i] = 0;continue;}retArr[i] = counts[r] - counts[l];if (retArr[i] < 0) {retArr[i] = 0;}}*returnSize = queriesSize;return retArr;
}

C练题笔记之:Leetcode-2055. 蜡烛之间的盘子相关推荐

  1. LeetCode 2055. 蜡烛之间的盘子(前缀和)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长桌子,桌子上盘子和蜡烛排成一列. 给你一个下标从 0 开始的字符串 s ,它只包含字符 '*' 和 '|' ,其中 '*' 表示一个 盘子 ,' ...

  2. C练题笔记之:Leetcode-12. 整数转罗马数字

    题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符          数值 I             1 V             5 X             1 ...

  3. C练题笔记之:Leetcode-307. 区域和检索 - 数组可修改

    题目: 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的n ...

  4. C练题笔记之:Leetcode-303. 区域和检索 - 数组不可变

    题目: 给定一个整数数组  nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= rig ...

  5. C练题笔记之:Leetcode-662. 二叉树最大宽度

    题目: 给你一棵二叉树的根节点 root ,返回树的 最大宽度 . 树的 最大宽度 是所有层中最大的 宽度 . 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度.将这个二叉树 ...

  6. C练题笔记之:Leetcode-793. 阶乘函数后 K 个零

    题目: f(x) 是 x! 末尾是 0 的数量.回想一下 x! = 1 * 2 * 3 * ... * x,且 0! = 1 . 例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 :而 ...

  7. C练题笔记之:Leetcode-654. 最大二叉树

    题目: 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在最大值 左边 的 子数组前缀上 构建左子 ...

  8. C练题笔记之:Leetcode-1455. 检查单词是否为句中其他单词的前缀

    题目: 给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成.请你检查检索词 searchWord 是否为句子 sentence ...

  9. C练题笔记之:Leetcode-1184. 公交站间的距离

    题目: 环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号.我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i + 1) % n 的车站之 ...

最新文章

  1. 纯数学教程 Page 203 例XLI (1)
  2. python使用方法-python-tkinter使用方法——转载(一)
  3. 客户信贷应收总额相关
  4. python以追加方式打开文件 线程安全吗,Python的open函数文件读写线程不安全,logging模型文件读写线程安全!...
  5. 怎么作非线性拟合_值得收藏ansys非线性收敛总结
  6. 认识软件性能测试10大误区
  7. 中如何刷新当前路由_企业装修和家庭改造中,路由器及接收器如何安放
  8. 原生开发什么意思_原生开发才是王道
  9. 虚拟机VMware16安装教程
  10. 51单片机之红外通信
  11. 专用集成电路 -- 运算电路 (加法器,乘法器,移位器)
  12. 口袋妖怪金心银魂详细图文攻略(下)及游戏下载
  13. 重温归一化(MinMaxScaler)和标准化(StandardScaler)
  14. 应用宝 android 平板,应用宝HD2.0个性化推荐最优安卓平板软件
  15. 破解Navicat Premium数据库账号密码
  16. java中文件加锁机制
  17. 【经验】CV or NLP研究生如何学才能毕业找到一份好工作?
  18. 《黑客帝国》用python实现中文代码雨
  19. SpringBoot+vue仿网易云音乐网站(二)-数据库设计
  20. kill -kill 20071125 20080101

热门文章

  1. linux加解密指令,[Centos8] linux 上的Base64加解密指令
  2. 给未来的你-李开复在2011级大学新生学习规划讲座上的演讲
  3. 上海网络教育统考计算机题库,计算机应用基础网络教育统考试题库(2018年真题)...
  4. Qt6.2 LTS实战 | 女生美声为你报时,为你读诗
  5. powerpc 和arm的寄存器都相同吗
  6. 服务器运维系统哪个好用,可以说宝塔是史上最好用的服务器运维控制面板
  7. dede织梦栏目页和文章页中获取当前栏目名称方法
  8. 如何在线制作思维导图?(普通制作流程)
  9. unity打包的安卓无法解析_我是UNITY3D 打包成APK ,安装到手机上就直接报无法解析程序包。...
  10. python海龟绘图画玫瑰花_python学习(二)之turtle库绘图