1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public int minFlipsMonoIncr(String s) {
int[] postCount = new int[s.length()];
int zeroCount = 0;
for (int i = postCount.length - 1; i >= 0; i--) {
zeroCount += s.charAt(i) == '0' ? 1 : 0;
postCount[i] = zeroCount;
}
int minFlips = Integer.MAX_VALUE, flipToZeroCount = 0;
for (int i = 0; i < s.length(); i++) {
char letter = s.charAt(i);
minFlips = Math.min(minFlips, postCount[i] + flipToZeroCount);
if (letter == '1') {
flipToZeroCount += 1;
}
}
return Math.min(minFlips, flipToZeroCount);
}
}

我们假设从某个位置开始, 之后全是1(包括该位置). 那么我们需要从头开始往后遍历. 到达一个位置后, 我们需要知道把它之前的char全变为0需要多少flips, 把从自己到之后所有的char变为1需要多少flips, 加在一起就是从当前位置是1的mono increasing string的flips数目. 我们遍历完所有位置取最小. 同时不要忘了还可以所有的位置都是0. 因此再把这个情况和我们之前得到的最小值取小即可.

因此我们需要在每个位置之前1的个数以及之后(包括该位置)0的个数. 我们用一个postCount来记录各个位置之后(包括该位置)0的个数. 然后再从头开始往后遍历, 用一个变量记录当当前位置之前1的个数即可.

时间复杂度: O(n)
空间复杂度: O(n)