leetcode 926. 将字符串翻转到单调递增

如果一个由 '0' 和 '1' 组成的字符串,是以一些 '0'(可能没有 '0')后面跟着一些 '1'(也可能没有 '1')的形式组成的,那么该字符串是单调递增的。

我们给出一个由字符 '0' 和 '1' 组成的字符串 S,我们可以将任何 '0' 翻转为 '1' 或者将 '1' 翻转为 '0'。

返回使 S 单调递增的最小翻转次数。

 

示例 1:

输入:"00110"
输出:1
解释:我们翻转最后一位得到 00111.
示例 2:

输入:"010110"
输出:2
解释:我们翻转得到 011111,或者是 000111。
示例 3:

输入:"00011000"
输出:2
解释:我们翻转得到 00000000。
 

提示:

1 <= S.length <= 20000
S 中只包含字符 '0' 和 '1'

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flip-string-to-monotone-increasing
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

用数组来记录1出现的位置。之后遍历数组,计算以当前值为为分界线时,需要改变的位数,求出最小值。

    public int minFlipsMonoIncr(String s) {
        int length = s.length();
        int[] arr = new int[length];

        int l = 0;
        char[] chars = s.toCharArray();
        for (int i = 0; i < length; i++) {
            if (chars[i] == '1') {
                arr[l++] = i;
            }
        }
        if (l == 0 || l == length) {
            return 0;
        }
        int len = length - l;
        int min = l;
        for (int i = 0; i < l; i++) {
            min = Math.min(min, len - arr[i] + (i << 1));
        }
        return min;
    }

posted @ 2021-06-23 16:23  旺仔古李  阅读(61)  评论(0编辑  收藏  举报