2055. 蜡烛之间的盘子题解
每日一题:2055. 蜡烛之间的盘子
2022.03.08 每日一题
每日一题专栏地址:LeetCode 每日一题题解更新中❤️💕
首先祝各位今天节日快乐喔!
今天的题目也是一道前缀和题目,与前天的抢银行很相似,
分别统计每个盘子左右最近的蜡烛,以及统计各个蜡烛的和,最后做差即可得到相应的答案
class Solution {
public:
vector<int> platesBetweenCandles(string s, vector<vector<int>> &queries) {
// 获取字符串的长度以及询问数组的长度
int len = s.length(), n = queries.size();
// 创建结果数组
// 创建 left、right 数组遍历统计每个位置左右最近的蜡烛
vector<int> res(n), left(len), right(len), sum(len + 1);
// left 表示盘子左侧最近的蜡烛
// right 表示盘子右侧最近的蜡烛
for (int i = 0, j = len - 1, p = -1, q = -1; i < len; i++, j--) {
if (s[i] == '|') p = i;
if (s[j] == '|') q = j;
left[i] = p;
right[j] = q;
// 统计前方一共有多少 盘子
sum[i + 1] = sum[i] + (s[i] == '*' ? 1 : 0);
}
for (int i = 0; i < n; i++) {
int a = queries[i][0], b = queries[i][1];
// 记录左侧边界最靠近边界的蜡烛
// 记录右侧边界最靠近边界的蜡烛
int c = right[a], d = left[b];
// 如果满足以下的条件就可以使用 sum 数组进行做差来求得结果
if (c != -1 && c <= d) res[i] = sum[d + 1] - sum[c];
}
return res;
}
}
class Solution {
public int[] platesBetweenCandles(String s, int[][] queries) {
// 获取字符串的长度以及询问数组的长度
int len = s.length(), n = queries.length;
// 创建结果数组
int[] res = new int[n];
// 创建 left、right 数组遍历统计每个位置左右最近的蜡烛
int[] left = new int[len], right = new int[len];
int[] sum = new int[len + 1];
// left 表示盘子左侧最近的蜡烛
// right 表示盘子右侧最近的蜡烛
for (int i = 0, j = len - 1, p = -1, q = -1; i < len; i++, j--) {
if (s.charAt(i) == '|') p = i;
if (s.charAt(j) == '|') q = j;
left[i] = p;
right[j] = q;
// 统计前方一共有多少 盘子
sum[i + 1] = sum[i] + (s.charAt(i) == '*' ? 1 : 0);
}
for (int i = 0; i < n; i++) {
int a = queries[i][0], b = queries[i][1];
// 记录左侧边界最靠近边界的蜡烛
// 记录右侧边界最靠近边界的蜡烛
int c = right[a], d = left[b];
// 如果满足以下的条件就可以使用 sum 数组进行做差来求得结果
if (c != -1 && c <= d) res[i] = sum[d + 1] - sum[c];
}
return res;
}
}