이전의 다른 문제들과 달리 단순히 윈도우만 이동시켜서 되는 문제는 아니다.
0을 k수만큼 flip할 수 있기 때문에 이것을 기준으로 봐야 함.
순회하면서, right == 0이면 zero 수를 ++시키고
만일 zero 수가 k를 넘어갔다면 left를 땡겨줘야 한다.
이 때, right == 0일 때 zero 수를 증가시켜줬었으므로 left또한 0이라면 zero 수를 다시 감소시킨다.
(원본 배열을 수정하지 않고 zero 수 기준으로만 탐색하기 때문)
그리고 right - left + 1
로 연속 최대 길이를 구하면 된다.
class Solution {
public int longestOnes(int[] nums, int k) {
int zeros = 0;
int left = 0;
int max = 0;
for (int right=0; right<nums.length; right++) {
if (nums[right] == 0) {
zeros++;
}
while (zeros > k) {
if (nums[left] == 0) {
zeros--;
}
left++;
}
max = Math.max(max, right - left + 1);
}
return max;
}
}