[动态规划] LeetCode 2055. 蜡烛之间的盘子

LeetCode 2055 蜡烛之间的盘子


前言:

这个题做的时间略长了,开始的时候打算先定位两个端点的蜡烛,之后在遍历其中的盘子,结果不言而喻,必time limit了,之后就预处理了前x的蜡烛间盘子和前x存在的蜡烛,结果在最后处理数据时不能定位其中的蜡烛,然后就去看题解,结果是预处理分为左右情况(就是我之前没有有效定位需要选中的蜡烛的原因)


题目

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

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

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

思路

求出i之前所有盘子,预处理盘子数,求出左右区间蜡烛(因为query为左右两个端点,所以当左侧端点在盘子上的时候需要找到其最右侧蜡烛即为有效蜡烛右侧同理)之后直接用预处理的数据带入左右蜡烛位置即可计算出答案。

LeetCode
    public int[] platesBetweenCandles(String s, int[][] queries) {
        int n = s.length();
        int[] dp = new int[n];
        Arrays.fill(dp,0);
        for(int i=0,sum=0;i<n;i++){
            if(s.charAt(i)=='*'){
                sum++;
            }
            dp[i] = sum;
        }
        int[] left = new int[n];
        int[] right = new int[n];
        for(int i=0,l=-1;i<n;i++){
            if(s.charAt(i)=='|'){
                l = i;
            }
            left[i] = l;
        }
        for(int i=n-1,r=-1;i>=0;i--){
            if(s.charAt(i)=='|'){
                r = i;
            }
            right[i] = r;
        }
        int[] ans = new int[queries.length];
        for(int i=0;i< queries.length;i++){
            int[] query = queries[i];
            int x = right[query[0]],y=left[query[1]];
            ans[i] = x==-1||y==-1||x>=y?0:dp[y] - dp[x];
        }
        return ans;
    }
posted @   什么塞瓦定理啊  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示