首先读懂题意,要通过翻转01把整个序列变为0在前1在后,那么我们可以在序列中找到一个点,这个点之前的1全部翻转为0,这个点之后的0全部翻转为1使得总翻转次数最小。
定义变量pre来记录当前点以前1的个数,ans记录当前最小翻转次数。
从0到n-1遍历整个序列
如果当前位置为1,前面已经递增了,所以不需要继续反转,反转次数ans不变,将前面1的个数pre++更新;
如果当前位置为0,如果要保证递增,一种方法是将前面的1翻转为0;另一种方法是将当前点翻转为1,比较两种方法那种需要的反转次数少,选择少的,即ans=min(pre,ans+1)
- 将前面的1翻转为0: 前面一共pre个1,反转需要的次数也是pre;之前的1都变成0后(变成00…00),和当前0依然是递增的关系,
- 将当前点翻转为1需要的次数:因为默认前面已经是递增的(在反转次数为ans的前提下),如果当前0再翻转为1(变成…1),那总共就是ans+1次反转
class Solution {
public:
int minFlipsMonoIncr(string s) {
int pre=0,ans=0;
for(int i=0;i<s.length();++i){
if(s[i]=='1') pre++;
else{
ans=min(ans+1,pre);
}
}
return ans;
}
};