每天一道算法题8
2022-01-20 本文已影响0人
雨打空城
【预处理数组-RRRGGG】
有一些排成一行的正方形,每个正方形已经被染成红色或者绿色,现在可以选择任意一个正方形然后用这两种颜色的任意一种进染色。这个正方形的颜色将会被覆盖,目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。返回最少需要涂染几个正方形。
如样例所示,s = RGRGR, 涂染之后变成RRRGG满足要求了。涂染的个数为2. 没有比这更好的涂染方案了。
解答:
这道题的意思就是最少涂染几个,可以让左边的都是R,右边的都是G。可以这么想,分别从0开始遍历,以第i个为分割点,则右边有几个R,左边有几个G需要涂染满足条件。则两个加起来最小的值就是答案。所以可以预处理为2个一维数组,R[], G[], R[] 表示每个位置右边总共有几个R,G[] 表示每个位置左边总共有几个G。
public class ColorDraw {
public static int colorDraw(String s) {
if (s == null || s.length < 1) {
return 0;
}
char[] str = s.toCharArray();
int N = str.length;
int[] right = new int[N];
right[N - 1] = str[N - 1] == 'R' ? 1 : 0;
for (int i = N - 2; i >= 0; i--) {
right[i] = str[i+1] + (str[i] == 'R' ? 1: 0);
}
int ans = right[0];
int left = 0;
for (int i = 0; i < N - 1; i++) {
left += str[i] == 'G' ? 1:0;
ans = Math.min(ans, left + right[i+1]);
}
ans = Math.min(ans, left + (str[N - 1] == 'G‘ ? 1:0));
return ans;
}
}