LeetCode_2055

题目如下

 

 

 这题也是需要使用到前缀和

这几天的题有好几道都涉及到这个知识点

普通的的解法会超时,如下

 1 class Solution {
 2     public int[] platesBetweenCandles(String s, int[][] queries) {
 3         int len = queries.length;
 4         int[] ans = new int[len];
 5         for(int i = 0; i < len; i++){
 6             int left = queries[i][0];
 7             int right = queries[i][1];
 8             while(left < right){
 9                 char chLeft = s.charAt(left);
10                 char chRight = s.charAt(right);
11                 if(chLeft == '|' && chRight == '|'){
12                     break;
13                 }
14                 if(chLeft != '|'){
15                     left++;
16                 }
17                 if(chRight != '|'){
18                     right--;
19                 }
20             }
21             int sum = 0;
22             for(int j = left; j < right; j++){
23                 char ch = s.charAt(j);
24                 if(ch == '*'){
25                     sum++;
26                 }
27             }
28             ans[i] = sum;
29         }
30         return ans;
31     }
32 }

时间复杂度约O(n*q),n为queries.length,q为queries数组的每个一维数组的长度

这个时间复杂度太高

使用前缀和可降低时间复杂度

 1 class Solution {
 2     public int[] platesBetweenCandles(String s, int[][] queries) {
 3         int sLen = s.length();
 4         int qLen = queries.length;
 5         int[] preSum = new int[sLen];
 6         int sum = 0;
 7         int[] ans = new int[qLen];
 8         int[] left = new int[sLen];
 9         int[] right = new int[sLen];
10         for(int i = 0; i < sLen; i++){
11             if(s.charAt(i) == '*'){
12                 sum++;
13             }
14             preSum[i] = sum;
15         }
16         for(int i = 0,l = -1; i < sLen; i++){
17             if(s.charAt(i) == '|'){
18                 l = i;
19             }
20             left[i] = l;
21         }
22         for(int i = sLen - 1,r = -1; i > -1; i--){
23             if(s.charAt(i) == '|'){
24                 r = i;
25             }
26             right[i] = r;
27         }
28         for(int i = 0; i < qLen; i++){
29             int x = queries[i][0];
30             int y = queries[i][1];
31             int l = right[x];
32             int r = left[y];
33             ans[i] = l == -1 || r == -1 || l > r ? 0 : preSum[r] - preSum[l];
34         }
35         return ans;
36     }
37 }

(题解的解法,自己重写了一遍)

posted @ 2022-03-08 17:08  雨下_整夜  阅读(18)  评论(0编辑  收藏  举报