1. 程式人生 > 其它 >[動態規劃] LeetCode 2055. 蠟燭之間的盤子

[動態規劃] 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;
    }