开启我的LeetCode刷题日记:2055. 蜡烛之间的盘子

185 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目: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
}



总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹