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 <= 20000
S
only consists of'0'
and'1'
characters.
此题不难,但翻转数字以及判断数字翻转条件处很有意思。
class Solution {
public:
int minFlipsMonoIncr(string s) {
int len=s.size();
int maxx=0;
int n0=0,n1=0;
int k=-1;
int right=len-1,left=0;
while(s[right]=='1')
--right;
while(s[left]=='0')
++left;
for(int i=0;i<=right;++i)
{
if(s[i]=='0')
++n0;
else
++n1;
if(n0-n1>maxx)
{
maxx=n0-n1;
k=i;
}
}
if(k<=left)
{
n0=0;
n1=0;
for(int i=0;i<len;++i)
{
if(s[i]=='0')
n0++;
else
n1++;
}
int c=len-1;
int d=0;
while(s[c]=='1')
{
--c;
++d;
}
return min(n0-left,n1-d);
}
else
{
int count=0;
for(int i=0;i<=k;++i)
if(s[i]=='1')
count++;
for(int i=k+1;i<len;++i)
if(s[i]=='0')
count++;
return count;
}
}
};