Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目:2055. 蜡烛之间的盘子
给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 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
我的思路
用了哈希表的思想来求解,利用数组candle[i]来存储第i根蜡烛所在s数组中的位置,比如candle[2]=13表示第2根蜡烛在s[13]上。因此[left,right]距离中两根距离最远的蜡烛(假设存在)i,j之间的盘子数目就可以表示成为candle[j]-candle[i]-(j-i),因此该题简化成了求解[left,right]距离中两根距离最远的蜡烛。具体代码可见下方。
代码实现
/**
* @param {string} s
* @param {number[][]} queries
* @return {number[]}
*/
var platesBetweenCandles = function(s, queries) {
const plate = [] //存储盘子数目的返回结果数组
const candle = [] //存储蜡烛所在的位置,比如candle[0] = 3表示第一根蜡烛在s[3]的位置上
//遍历一遍s数组填充candle
for(var i =0;i<s.length;i++){
if(s[i] == '|'){
candle.push(i)
}
}
//其中为了找到右侧蜡烛的最大位置,假设在s的右边还有一根蜡烛
candle.push(s.length)
var candleNumber = candle.length
//开始进行结果遍历
queries.forEach((x)=>{
//用来存储该段数据中距离最远的两根蜡烛分别是第几根
const tmp_plate = []
for(var i =0;i<candleNumber;i++){
//找到最左边的蜡烛位置
if(x[0]<=candle[i]) {
for(var j = i;j<candleNumber;j++){
//找到最右边的蜡烛位置
if(x[1]<candle[j]){
//设置限定条件,只有当最右边蜡烛位置在最左边蜡烛的右边才可以
if(j-1>i){
//其中最右边的蜡烛是第j-1根
tmp_plate.push(i,j-1)
//console.log(tmp_plate)
break
}
//如果找到了第一根蜡烛或者找到的第一根蜡烛不满足条件,立刻退出循环
break
}
}
//只要找到第一根最左边蜡烛立刻退出循环
break
}
}
//如果存在最左边和最右边两根蜡烛,开始计算范围内的盘子数目
if(tmp_plate.length == 2){
//由于存储过第几根,因此只需要将两根蜡烛的实际位置距离求出,并减去中间的蜡烛数目(j-i-1),便可以求得蜡烛之间盘子的数目
plate.push(candle[j-1]-candle[i]-(j-1-i))
}
//如果不存在,那么盘子数目为0
else plate.push(0)
})
return plate
}
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹