每天一道算法题8

【预处理数组-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; 
    }
}

你可能感兴趣的:(每天一道算法题8)