Flip String to Monotone Increasing LT926
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 <= S.length <= 20000Sonly 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的更多相关文章
- 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), ...
- [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), ...
- 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), ...
- [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), ...
- 【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 ...
- 【LeetCode】926. Flip String to Monotone Increasing 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Prefix计算 动态规划 参考资料 日期 题目地址 ...
- [LeetCode] Monotone Increasing Digits 单调递增数字
Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...
- [Swift]LeetCode738. 单调递增的数字 | Monotone Increasing Digits
Given a non-negative integer N, find the largest number that is less than or equal to Nwith monotone ...
- 738. Monotone Increasing Digits 单调递增的最接近数字
[抄题]: Given a non-negative integer N, find the largest number that is less than or equal to N with m ...
随机推荐
- 渐进反馈式搜索技术助力运维工程师——Linux命令高效检索
日常生活工作中,我们通过搜索引擎查询相关资料时,经常遇到不知如何指定准确关键词的情况,仅仅根据指定大概范围的关键词时,搜索结果往往不能尽如人意. <信息导航>APP最新版本(Ver 1.1 ...
- MongoDB(3)--Java 操作 MongoDB 的 API
引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...
- JS sort() 方法
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. array.s ...
- idea中git常见使用场景
工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...
- 【STM32】临界区进入退出宏 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()
宏函数展开为: #define OS_CRITICAL_METHOD 3 #if OS_CRITICAL_METHOD == 3 #define OS_ENTER_CRITICAL() {cpu_sr ...
- The Ultimate Productivity Hack is Saying No
The Ultimate Productivity Hack is Saying No By James ClearRead this on JamesClear.com The ultimate p ...
- (英文版)VScode一键生成.vue模板
1. 安装vscode,官网地址 2.安装一个插件,识别vue文件 插件库中搜索Vetur,下图中的第一个,点击安装(Install) 3.新建代码片段 点击Code(代码)-Preferences( ...
- 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 ...
- Linux 标准输入输出、错误输出、重定向标准输出
再来看看 >& 操作符: 重定向操作符 描述 > 将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄. < 从文件而不是从键盘或句柄读入命令输入. >& ...
- centos7.4重置root密码
1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...