如果乙個由'0'
和'1'
組成的字串,是以一些'0'
(可能沒有'0'
)後面跟著一些'1'
(也可能沒有'1'
)的形式組成的,那麼該字串是單調遞增的。我們給出乙個由字元
'0'
和'1'
組成的字串s
,我們可以將任何'0'
翻轉為'1'
或者將'1'
翻轉為'0'
。返回使
s
單調遞增的最小翻轉次數。示例 1:
輸入:"00110"輸出:1解釋:我們翻轉最後一位得到 00111.
思路:1、首先從首部開始尋找最先出現的『1』位置l,從尾部尋找最後出現的『0』的位置h
2、 對字串的翻轉出現在[l,h]區間中
3、以gap為分割點從l到h每次+1遞增,判斷gap左邊『1』的個數,判斷gap右邊『0』的個數,相加求和,比較每個gap分割點的和的最小值,如果不做優化,會超時
4、建立rdp[i]儲存以i為分割點左邊的為'1'的個數,ldp[i]儲存以i為分割點右邊的'0'的個數,那麼求rdp[gap]判斷上乙個點為'1',那麼rdp[gap]=rdp[gap-1]+1,求ldp[gap]判斷上乙個節點為'0',那麼ldp[gap] =ldp[gap-1]-1
class solution
int l=-1;int h=-1;
int cmin=integer.max_value;
rdp = new int[nums.length+1];
ldp = new int[nums.length+1];
for(int i=0;i=0;i--)
}if(l==-1||h==-1||l>=h)
for(int i=l;i<=h+1;i++)
return cmin;
}public int countmin(int l,int h,int gap,char nums)else
}elseelse
}else
}ldp[gap]=count;
}" "+ldp[gap]);
return rdp[gap]+ldp[gap];
}}
LeetCode 將字串翻轉到單調遞增
如果乙個由 0 和 1 組成的字串,是以一些 0 可能沒有 0 後面跟著一些 1 也可能沒有 1 的形式組成的,那麼該字串是單調遞增的。我們給出乙個由字元 0 和 1 組成的字串 s,我們可以將任何 0 翻轉為 1 或者將 1 翻轉為 0 返回使 s 單調遞增的最小翻轉次數。示例 1 輸入 0011...
LeetCode 926 將字串翻轉到單調遞增
基本思路就是 在這個字串中,存在某乙個點,在這個點之前所有的字元均為0,後面的字元均為1,那麼我們就可以遍歷這個字串來找到這個點。首先遍歷整個字串,找到將字串全部變為 1 所需要的次數one num,然後再從頭開始遍歷字串,每找到乙個 0 那麼就將one num減一,每找到乙個 1 就將zero n...
leetcode 926 將字串翻轉到單調遞增
如果乙個由 0 和 1 組成的字串,是以一些 0 可能沒有 0 後面跟著一些 1 也可能沒有 1 的形式組成的,那麼該字串是單調遞增的。我們給出乙個由字元 0 和 1 組成的字串 s,我們可以將任何 0 翻轉為 1 或者將 1 翻轉為 0 返回使 s 單調遞增的最小翻轉次數。示例 1 輸入 0011...