leetcode-1004. 最大连续1的个数 III

119 阅读1分钟

题目要求:

给定一个二进制数组 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

链接leetcode.cn/problems/ma…

解题思路

使用滑动窗口,如果窗口中的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
}