Max Consecutive Ones III
Question:
思路:
可以用同样的 sliding window pattern 和 longest substring 一样的做法. 但这样就不是最快的解题法。
因为这道题只有0 和 1, 而且只翻0, 找最长的1。 我们可以拥有更快速的解法.
对于此题, main idea就是维持一个最长的1的长度的 一个window. sliding window右边每遇上一个0, 就需要减少flip 次数( 说明window里多了一个0,需要filp 才能保证有最多的1) move winodw 左边的是0的时候, 说明window里少了一个需要flip的0, 就可以增加flip的次数 k
然后呢在我们移动这个window的的时候, 我们是可以保证我们的window长度是永远最长的. 因为只有当flip次数不足够的时候 我们才会挪动window的左边界. 如果flip 次数足够,就说明window右边界可以继续增加, 最长的repeating1 还可以继续增加长度.这样的话当到达某一个点, windows就可以保证最长长度. 然后左边边界和右边界同时一起往前前进. 直到loop 的结束, 我们得到了最长repeating 1.
code
class Solution {
public int longestOnes(int[] nums, int k) {
int leftPtr = 0;
int rightPtr = 0;
while(rightPtr < nums.length){
if(nums[rightPtr] == 0){
k--;
}
if(k < 0){
if(nums[leftPtr] == 0){
k++;
}
leftPtr++;
}
rightPtr++;
}
return rightPtr-leftPtr;
}
}