正方形染色

题目

牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可 以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将 会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。 牛牛想知道他最少需要涂染几个正方形。

输入描述:

一行字符串s,由R和G构成,表示正方形的颜色(R为红色,G为绿色)|s|

输出描述:

一个数最少需要涂染几个正方形

示例1

输入

RRGGG

输出

0

示例2

输入

RGGGR

输出

1

说明

修改最后一个


思路分析

  1. 这题意思是R全部在左边,G全部在右边
  2. 首先for一遍得到总的R,
  3. 遍历数组,看看分割线的左边有多少需要改的,分割线的右边有多少需要改的
    1. 左边需要改的是G,右边需要改的是R,
    2. 在遍历是顺便统计左边的R与G,又知道总的R,
    3. 所以左边需要改左G,右边需要改(总R-左R)

另一种思路是先遍历两次,求出left数组(当前索引左边的G有多少),与right数组(当前索引右边的R有多少),从而将r时间复杂度从O(N^2)降到O(N)

代码展示

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
        String str = read.readLine();
        int pos = 0;//移动指针
        int recent_R = 0;//该指针处已经有多少R
        int recent_G = 0;//该指针处有多少G
        int R_num= 0;//R的总数量
        
        for(int i=0;i<str.length();i++){//统计R的数量
            if(str.charAt(i)=='R'){
                R_num++;
            }
        }
        
        int min = R_num;//最多需要该R次,(把R全部转为G)
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)=='R'){
                recent_R ++;
            }else{
                recent_G ++;
            }
            min = Math.min(min,recent_G+R_num-recent_R);
        }
        System.out.println(min);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值