在题解里学习到了一个滑动窗口模板,十分有用。
在这个题目里,把问题抽象出来就是要找到一个最多含有K个0的最长子数组。
用left和right标记子数组的左端和右端。
既然子数组里最多K个0,那只要0的个数没有超过K个,子数组的长度就可以继续延伸,right++。
最重要的是当子数组里的0的个数超过了K个,left就向右移动,知道子数组里的0的个数不多于K个。
子数组的最大长度用right-left+1就可得出。
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
if(K == A.size())
return K;
int len = A.size();
int ans = 0;//最大长度
int nums = 0;//0的个数
int left = 0;
int right = 0;
//子数组内只允许最多有k个0,当子数组内0的个数超过K后,left向前找到第一个0再向前
while(right <= len - 1){
if(A[right] == 0){//遇到0就把nums++
nums++;
}
while(nums > K && left < len){
if(A[left] == 1){
left++;
}else{
nums--;
left++;
}
}
ans = max(ans, right - left + 1);
right++;
}
//ans = right - left + 1;
return ans;
}
};