[Java] 前缀和 & 空间优化
解法一:前缀和
利用前缀和,后缀和统计N,Y的数字即可,最后计算出最小的答案。
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
class Solution {
public int bestClosingTime(String cus) {
int n = cus.length(), maxv = 100005, ans = 0;
char[] arr = cus.toCharArray();
int[] left = new int[n + 5], right = new int[n + 5];
for (int i = 1; i <= n; i++) left[i] += left[i - 1] + (arr[i - 1] == 'N' ? 1 : 0);
for (int i = n; i >= 1; i--) right[i] += right[i + 1] + (arr[i - 1] == 'Y' ? 1 : 0);
for (int i = 1; i <= n + 1; i++) {
if (left[i - 1] + right[i] < maxv) {
maxv = left[i - 1] + right[i];
ans = i - 1;
}
}
return ans;
}
}
解法二:空间优化
先统计所有Y的个数,然后对于当前字符计算代价即可,最后更新总代价。
class Solution {
public int bestClosingTime(String cus) {
int n = cus.length(), maxv = 100005, ans = 0;
char[] arr = cus.toCharArray();
int left_right = 0;
for (int i = n; i >= 1; i--) left_right += (arr[i - 1] == 'Y' ? 1 : 0);
for (int i = 1; i <= n + 1; i++) {
if (left_right < maxv) {
maxv = left_right;
ans = i - 1;
}
if (i <= n && arr[i - 1] == 'Y') left_right--;
else left_right++;
}
return ans;
}
}
- 时间复杂度:$O(n)$
- 空间复杂度:$O(1)$
如果有问题,欢迎评论区交流, 如果有帮助到你,请给题解点个赞和收藏哈~~~