美文网首页
每天一道算法题8

每天一道算法题8

作者: 雨打空城 | 来源:发表于2022-01-20 10:42 被阅读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; 
        }
    }
    

    相关文章

      网友评论

          本文标题:每天一道算法题8

          本文链接:https://www.haomeiwen.com/subject/beldhrtx.html