leetcodeT926
问题描述
如果一个由 '0'
和 '1'
组成的字符串,是以一些 '0'
(可能没有 '0'
)后面跟着一些 '1'
(也可能没有 '1'
)的形式组成的,那么该字符串是 单调递增 的。
我们给出一个由字符 '0'
和 '1'
组成的字符串 s,我们可以将任何 '0'
翻转为 '1'
或者将 '1'
翻转为 '0'
。
返回使 s 单调递增 的最小翻转次数。
示例1:
1 | 输入:s = "00110" |
示例2:
1 | 输入:s = "010110" |
示例3:
1 | 输入:s = "00011000" |
解题思路
对于一个字符串分析,最终的反转结果必然是:[0,i)--->0 and [i,s.length())---->1
的结果,所以我们可以使用一个计数器记录全部的0
,记录完成后进行遍历:
我们每次遍历一个字符,计算处在此字符下需要反转的次数
- 下面对于几个遍历量的解释:
n0
: 未遍历到的0
;n1
:已经遍历到的1
;n1+n0
:表示遍历到当前字符的时候需要的反转次数min
: 记录遍历到当前字符时所需要的最小反转次数
解释为什么
n0+n1
是当前遍历到字符的反转次数:就是对于上述最终的情况中的
i
进行枚举,$i \in [0,s.length()-1]$ ,从这个区间中逐个枚举,n0
表示第二部分中0
的个数,n1
表示第一部分中1
的个数,实际要求,第一部分全部为0
,第二部分全部为1
,所以反转的总次数为n0+n1
代码
1 | public static int minFlipsMonoIncr(String s) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mirclea's blog!