剑指 Offer II 092. 翻转字符

首先读懂题意,要通过翻转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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值