二、 示例
三、思路与代码
1. 思路:
- 本题采用滑动窗口算法;(可以对比 力扣3 无重复字符的最长子串)
- 关键:本题说可以翻转0为1 k次, 来找最长的连续1的子串, 即可以换种思路:该连续1子串中包括0的个数, 不可以超过k;
- 同样套用滑动窗口算法模板:注意几个关键处理点
- right 指针往右移动扩大窗口;
- 而当窗口中0的个数超过 k 时, 进行窗口的收缩, 不断移动left指针, 直到窗口中 0 的个数不超过k;
- 而当包含连续1子串(即 “窗口”)中的0个数不超过k的时候, 进行子串长度的更新;
2. 代码如下:
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
unordered_map<int, int> windows;
int left = 0;
int right = 0;
int cnt = 0;
int n_len = nums.size();
while (right < n_len) {
int c = nums[right];
right++;
windows[c]++;
while(windows[0] > k){
int d = nums[left];
left++;
if (d == 0) {
windows[d]--;
}
}
cnt = max(right - left, cnt);
}
return cnt;
}
};