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 }
(题解的解法,自己重写了一遍)