首页 > 其他分享 >红绿正方形染色问题

红绿正方形染色问题

时间:2022-09-25 18:44:25浏览次数:68  
标签:rightR min int 染色 正方形 leftG 红绿

红绿正方形染色问题

作者:Grey

原文地址:

博客园:红绿正方形染色问题

CSDN:红绿正方形染色问题

题目描述

有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。目标是在完成染色之后,每个红色 R 都比每个绿色 G 距离最左侧近。 返回最少需要涂染几个正方形,示例: s = RGRGR,我们涂染之后变成 RRRGG 满足要求了,涂染的个数为 2, 没有比这个更好的涂染方案。

题目链接见:牛客:红和绿

思路

要满足染色后,每个红色 R 都比每个绿色 G 距离最左侧近,只有可能是下述三种情况:

  1. R 都在左边,G 都在右边;

  2. 全 G;

  3. 全 R。

定义两个数组

        
int[] leftG = new int[N];

leftG[i]表示 i 位置的左边包括 i 在内有几个 G。

通过从右往左遍历一次数组可以预处理得到leftG数组。

int[] rightR = new int[N];

rightR[i]表示 i 位置右边包括 i 在内有几个 R。

通过从左往右遍历一次数组可以预处理得到rightR数组

如果rightR[0] == N || leftG[N - 1] == N,说明数组全为 R 或者全为 G,此时无需染色,直接返回 0。

如果是普遍情况,那就直接判断每个位置为分割点,左侧都变为 R,右侧都变为 G,需要的最小染色次数是多少,即:leftG[i] + rightR[i] - 1,之所以要减 1 是因为重复算了 i 位置的情况。

完整代码见

import java.util.Scanner;
// R都在左边,G都在右边,或者全G,全R
public class Main {
    
    // 两个预处理数组
    // TODO 空间方面可以优化
    public static int minColors(String str) {
        if (str == null || str.length() <= 1) {
            return 0;
        }
        char[] strs = str.toCharArray();
        int N = strs.length;
        // leftG[i]表示左边包括i在内有几个G
        int[] leftG = new int[N];
        // rightR[i]表示右边包括i在内有几个R
        int[] rightR = new int[N];
        for (int i = 0; i < N; i++) {
            if (strs[i] == 'G') {
                if (i == 0) {
                    leftG[i]++;
                } else {
                    leftG[i] = leftG[i - 1] + 1;
                }
            } else {
                if (i != 0) {
                    leftG[i] = leftG[i - 1];
                }
            }
        }
        for (int i = N - 1; i >= 0; i--) {
            if (strs[i] == 'R') {
                if (i == N - 1) {
                    rightR[i]++;
                } else {
                    rightR[i] = rightR[i + 1] + 1;
                }
            } else {
                if (i != N - 1) {
                    rightR[i] = rightR[i + 1];
                }
            }
        }

        // 全R或者全G的情况
        if (rightR[0] == N || leftG[N - 1] == N ) {
            return 0;
        }

        int min = N;
        for (int i = 0; i < N; i++) {
            // 之所以要-1是因为重复算了i位置的处理情况
            min = Math.min(leftG[i] + rightR[i] - 1, min);
        }
        return min;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String colors = in.nextLine();
        System.out.println(minColors(colors));
        in.close();
    }
}

空间复杂度O(N),时间复杂度O(N)

更多

算法和数据结构笔记

标签:rightR,min,int,染色,正方形,leftG,红绿
From: https://www.cnblogs.com/greyzeng/p/16728462.html

相关文章

  • 理想的正方形
    原题链接题目描述给定一个n*m的矩w,在所有边长为k的子矩阵中,找到该子矩阵的最大值与最小值之差最小的矩阵,输出该差分析直接做不好做,分两步对每行做一遍滑动窗口,找到......
  • T1056点和正方形的关系 (信息学一本通C++)
     目录 [题目描述]有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。如果......
  • 2019ACM-ICPC 西安邀请赛 D.Miku and Generals——二分图染色+01背包
    目录题意思路代码目录题意将n个将军卡片分成两份,要求两份卡片之间的差值尽可能小,求最大的那一份卡片的和,这里有m组卡片是不能放在同一份的思路对有矛盾的组我们建图进......
  • 染色法二分图
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10,M=1e5+10,INF=0x3f3f3f3f;intn,m,h[N],e[M<<1],ne[M<<1],idx,color[N];vo......
  • 最大正方形
    问题:在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。   输入:matrix=[["1","0","1","0","0"],["1","0","1","1","1"],["1&q......
  • Vue 3-150行代码实现新国标红绿灯效果案例
    昨天刷视频,都是关于新国标红绿灯的,看大家议论纷纷,下班就用150行代码通过Vue组件实践红绿模拟演示,视频也跟大家展示过了。今天接着更新图文版本,大家跟着优雅哥通过该案例实......
  • NC19996 [HAOI2015]树上染色
    题目链接题目题目描述有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色。将所有点染色后,你会......
  • LeetCode 593. 有效的正方形(向量做法)
    题目题目链接:593.有效的正方形题意:给出二维平面上四个点的坐标,判断这四个点是否能构成一个正方形,四个点的输入顺序不做任何保证。思路通过向量运算可以很轻松地解决这......
  • 瑞零科技|染色体分散仪-给您想要的分散效果
    染色体分散仪为细胞遗传实验室专门研发的染色体分散仪,用于细胞遗传实验室染色体滴片,得到理想的染色体分散效果。适用于原位培养和非原位培养的收获制片过程,可以处理外......
  • 瑞零科技|全自动染色体滴片(制片)仪-解放你的双手,让工作更简单!
    全自动染色体滴片(制片)仪为细胞遗传实验室专门研发的全自动染色体滴片(制片)仪,用于自动将收获的中期分裂相细胞滴于玻片,同时完成染色体分散,制成可供显微镜阅片标准玻片。......