926. Flip String to Monotone Increasing
阿新 • • 發佈:2018-12-16
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'
'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; } } };