算法原理:
這道題大眼一看是關于翻轉多少個0的問題,但是,如果你按照這種思維去做題,肯定不容易。所以我們要換一種思維去做,這種思維不是一下就能想到的,所以想不到也情有可原。
題目是:給定一個二進制數組 nums 和一個整數 k,如果可以翻轉最多 k 個 0 ,則返回 數組中連續 1 的最大個數 。
我們可以轉換成:我們求一個子數組,該子數組滿足:在一段連續的區間內0的個數不大于k且該數組的長度是所有子數組中最長的
這樣其實就類似于一個滑動窗口的問題了。
如果還沒有看明白,沒關系。詳細解釋一下:對比以前的滑動窗口,以前的判斷條件是求某一段的和最大/求某一段含有不重復的字符最多……,只不過這次的判斷條件是0的個數不能超過k,由于這個條件對我們子區間內還要進行操作,所以可能會使你下不去手,困惑。
但是只要抓住本質,按照那個模版來就能寫對,這還需要平時多練。
暴力解法就不展示了,就是兩個for循環枚舉。
代碼實現
class Solution {//滑動窗口:public int longestOnes(int[] nums, int k) {int ret=0;for(int left =0,right =0,zero =0;right<nums.length;right++){if(nums[right] == 0){zero++;//進窗口}while(zero>k){//判斷if(nums[left++] == 0){zero--;//出窗口}}ret = Math.max(ret,right - left + 1);//更新結果}return ret;}
}