A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), followed by some number of '1's (also possibly 0.)

We are given a string S of '0's and '1's, and we may flip any '0' to a '1' or a '1' to a '0'.

Return the minimum number of flips to make S monotone increasing.

Example 1:

Input: "00110"
Output: 1
Explanation: We flip the last digit to get 00111.

Example 2:

Input: "010110"
Output: 2
Explanation: We flip to get 011111, or alternatively 000111.

Example 3:

Input: "00011000"
Output: 2
Explanation: We flip to get 00000000.

Note:

  1. 1 <= S.length <= 20000
  2. S only consists of '0' and '1' characters.

Idea 1. 由结果推算,if monotonic increasing string is composed of x zeros and (n-x) ones, based on the number of ones on the left and right side of str[x], the number of flips can be calculated as ones[x] + (n-x - (ones[n] - ones[x])), another example to use prefix sum to caculate ones.

flip from '1' -> '0' on the left: ones[x]

flip from '0' -> '1' on the right: n - x - (ones[n] - ones[x]) or scan the array from right to left

仔细corner case, 全部都是'0' or '1' monotonic increasing string.

Time complexity: O(n)

Space complexity: O(n)

 class Solution {
public int minFlipsMonoIncr(String S) {
int n = S.length();
int[] ones = new int[n+1];
for(int i = 1; i <=n; ++i) {
ones[i] = ones[i-1] + S.charAt(i-1) - '0';
} int result = Integer.MAX_VALUE;
for(int i = 0; i <= n; ++i) {
result = Math.min(result, ones[i] + (n - i) - (ones[n] - ones[i]));
} return result;
}
}

Idea 1.b No need to build ones array, the number of ones can be computed while looping the array, just need the total number of ones in advance

Time complexity: O(n)

Space complexity: O(1)

 class Solution {
public int minFlipsMonoIncr(String S) {
int n = S.length();
int totalOnes = 0;
for(int i = 0; i < S.length(); ++i) {
totalOnes += S.charAt(i) - '0';
}
int ones = 0; int result = Integer.MAX_VALUE;
for(int i = 0; i <= n; ++i) {
if(i >= 1) {
ones += S.charAt(i-1) - '0';
}
result = Math.min(result, ones + (n - i) - (totalOnes - ones));
} return result;
}
}

稍微简洁一点,把全身1的情况做初始值

 class Solution {
public int minFlipsMonoIncr(String S) {
int n = S.length();
int totalOnes = 0;
for(int i = 0; i < S.length(); ++i) {
totalOnes += S.charAt(i) - '0';
}
int ones = 0; int result = n - totalOnes;
for(int i = 1; i <= n; ++i) {
ones += S.charAt(i-1) - '0';
result = Math.min(result, ones + (n - i) - (totalOnes - ones));
} return result;
}
}

Idea 2. Dynamic programming, 网上看到的更赞的方法, let dp[i-1] be the minimum number of flips to make S.substring(0, i) is monotonic increasing, how to extend the solution for S.charAt(i)?

dp[i] = dp[i-1] if S.charAt(i) == '1', nothing needed, as it still satisfy monotonic increasing string.

dp[i] = Math.min(ones[i-1], dp[i-1] + 1), if S.chart(i) == '0' either flip all the previous ones to 0; or flip the current '0' to '1' since S.substring(0, i) is monotonice, add '1' still satisfies the conidtion.

Time complexity: O(n)

Space complexity: O(n)

 class Solution {
public int minFlipsMonoIncr(String S) {
int n = S.length();
int[] dp = new int[n+1];
int ones = 0;
for(int i = 1; i <= n; ++i) {
if(S.charAt(i-1) == '1') {
dp[i] = dp[i-1];
++ones;
}
else {
dp[i] = Math.min(dp[i-1] + 1, ones);
}
} return dp[n];
}
}

Idea 2.b the above formula shows the current dp depends only on the previous number, the array dp[] is not needed

Time complexity: O(n)

Space complexity: O(1)

 class Solution {
public int minFlipsMonoIncr(String S) {
int n = S.length();
int dp = 0;
int ones = 0;
for(int i = 1; i <= n; ++i) {
if(S.charAt(i-1) == '1') {
++ones;
}
else {
dp = Math.min(dp + 1, ones);
}
} return dp;
}
}

Flip String to Monotone Increasing LT926的更多相关文章

  1. LC 926. Flip String to Monotone Increasing

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  2. [Swift]LeetCode926. 将字符串翻转到单调递增 | Flip String to Monotone Increasing

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  3. 926. Flip String to Monotone Increasing

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  4. [LeetCode] 926. Flip String to Monotone Increasing 翻转字符串到单调递增

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  5. 【leetcode】926.Flip String to Monotone Increasing

    题目如下: A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possib ...

  6. 【LeetCode】926. Flip String to Monotone Increasing 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Prefix计算 动态规划 参考资料 日期 题目地址 ...

  7. [LeetCode] Monotone Increasing Digits 单调递增数字

    Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...

  8. [Swift]LeetCode738. 单调递增的数字 | Monotone Increasing Digits

    Given a non-negative integer N, find the largest number that is less than or equal to Nwith monotone ...

  9. 738. Monotone Increasing Digits 单调递增的最接近数字

    [抄题]: Given a non-negative integer N, find the largest number that is less than or equal to N with m ...

随机推荐

  1. loadrunner-关联

    1.什么是关联? 将服务器动态返回的值,保存成一个参数,供后面需要使用到 此参数的地方使用 PS:1.一定是服务器返回的 2.动态变化的,静态不需要关联 3.服务器需要校验的 4.保存成一个参数 5. ...

  2. C++使用指针的优点

    使用指针可以带来如下的好处: (1)可以提高程序的编译效率和执行速度,使程序更加简洁. (2)通过指针被调用函数可以向调用函数处返回除正常的返回值之外的其他数据,从而实现两者间的双向通信. (3)利用 ...

  3. python学习(一)--python解释器

    python学习模式,每篇都会有一些总结,然后根据总结去查一查,学一学,基础就会很扎实的 python解释器 1.python版本和安装 python2.x和python3.x https://www ...

  4. sys模块学习记录

    import sys s = sys.argv #命令行参数List,第一个元素是程序本身路径 #sys.exit() #退出程序,正常退出时exit(0) s = sys.version #获取Py ...

  5. V-REP Remote API(C++)实现简单的关节转动

    基础内容参考:https://www.cnblogs.com/eternalmoonbeam/p/10753149.html V-REP客户端设置: 在V-REP场景文件中需要添加三个实体,包括两个形 ...

  6. java委托

    上文讲过观察者模式,尽管已经用了依赖倒转原则,但是"抽象通知者"还是依赖"抽象观察者",也就是说万一没有了抽象观察者这样的接口,通知的功能就完不成了.另一方面, ...

  7. 2017-11-11 Sa Oct Is it online

    2017-11-11 Sa Oct Is it online 9:07 AM After breakfast I tried connecting to the course selection sy ...

  8. django-rest-framework配置json web token

    安装jwt库,简单快速的生成我们所需要的token 1.安装djangorestframe pip install djangorestframe 2.在settings.py的INSTALLED_A ...

  9. 上位机与三菱FX3U通过FX-232-BD通信

    PLC侧设置: 和校验+协议4 读D200单字: 05 30 30 46 46 57 52 30 44 30 32 30 30 30 31     返回“201”:02 30 30 46 46 30 ...

  10. Vue-Router导航守卫:

    有的时候,我们需要通过路由来进行一些操作,比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录. 为此我们有很多种方法可以植入路由的导航过程:全局的, 单 ...