方格染色

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

一、题目描述:


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


如样例所示: s = RGRGR

我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。


示例:

示例 1:

输入: s = RRRR

输出:0


示例 2:

输入: s = RRGR

输出:1


示例 3:

输入: s = RGRG

输出:1---->将第二个R涂成G,从第一个R后面分割


二、思路分析:


使用两个变量分别记录分割线左右两边出现的R和G的次数。定义lCount记录分割线左边出现的G的次数,定义rCount记录分割线右边出现的R。

网络异常,图片无法展示
|

当我们获取到这两个值时,在循环时,只需要取这两个值和的最小值即可。

大体考虑之后,我们还需要考虑边界情况:


  • 当全是G时,我们需要把所有的R换成G,即rCount的值;
  • 当全书R时,将全部的R换成G,即分割线在最后一个R的后面。结果应该就为lCount的值。


优化


使用一次循环记录R出现的次数(lCount),将此时的rCount结果记录为右边都是'GGGG'的结果。

在记录G出现次数时可以和记录涂改个数放到同一个循环中。最后再求一下左半边为 'RRRR'的情况。


三、AC 代码:


function squareStaining(s) {
  let lCount = 0,
    rCount = 0
  let n = s.length
  for (let i = 0; i < n; i++) {
    rCount += s[i] === 'R' ? 1 : 0
  }
  let res = rCount // 整个s为右边 GGGG
  for (let i = 0; i < n - 1; i++) {
    lCount += s[i] === 'G' ? 1 : 0
    rCount -= s[i] === 'R' ? 1 : 0
    res = Math.min(res, lCount + rCount)
  }
  // 整个s为左半边 RRRR
  res = Math.min(res, lCount)
  return res
}


四、总结:


一开始可能会想到使用两个数组分别存放R和G出现的次数,但是为了简化操作,我们可以将出现的次数都是用两个变量来保存,通过循环,使各自增加或减少。


作者:ClyingDeng

链接:https://juejin.cn/post/6952678617327337480

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
4月前
leetcode-1035:不相交的线
leetcode-1035:不相交的线
19 0
|
6天前
6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)
6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)
|
3月前
|
测试技术
【深度优先搜索】【组合数学】【动态规划】1467.两个盒子中球的颜色数相同的概率
【深度优先搜索】【组合数学】【动态规划】1467.两个盒子中球的颜色数相同的概率
|
3月前
|
算法 Java 测试技术
【广度优先搜索】【网格】【割点】1263. 推箱子
【广度优先搜索】【网格】【割点】1263. 推箱子
|
4月前
树上染色(树形dp)
树上染色(树形dp)
15 0
|
9月前
|
人工智能 算法 BI
【线段树】找最长“白色”线段
【线段树】找最长“白色”线段
42 0
leetcode 1035 不相交的线
leetcode 1035 不相交的线
51 0
leetcode 1035 不相交的线
|
算法 Java
不相交的线(LeetCode 1035)
不相交的线(LeetCode 1035)
52 0
33.矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
34 0
不相交的线(LeetCode-1035)
不相交的线(LeetCode-1035)
117 0
不相交的线(LeetCode-1035)