题目要求:
给定一个二进制数组 nums
和一个整数 k
,如果可以翻转最多 k
个 0
,则返回 数组中连续 1
的最大个数 。
示例 1:
输入: nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出: 6
解释: [1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。
示例 2:
输入: nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出: 10
解释: [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。
提示:
1 <= nums.length <= 105
nums[i]
不是0
就是1
0 <= k <= nums.length
解题思路
使用滑动窗口,如果窗口中的0的个数<k,那么窗口右移,那么最大长度就是r-l+1,如果窗口中的0>k,需要窗口左移。
代码:
func longestOnes(nums []int, k int) int {
// 滑动窗口
l, r, zeroCount, maxNum := 0, 0, 0, 0
for r < len(nums) {
if nums[r] == 0 {
zeroCount++
}
for zeroCount > k {
if nums[l] == 0 {
zeroCount--
}
l++
}
maxNum = max(maxNum, r-l+1)
r++
}
return maxNum
}
func max(a, b int) int {
if a > b {
return a
}
return b
}