赞
踩
目录
1004. 最大连续1的个数 III - 力扣(LeetCode)
难度 中等
给定一个二进制数组 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 <= 10^5
nums[i]
不是 0
就是 1
0 <= k <= nums.length
- class Solution {
- public:
- int longestOnes(vector<int>& nums, int k) {
-
- }
- };
此题可以转化为找出最长子数组,0的个数不超过K个,就和前两篇滑动窗口的题目一样了。
设置计数器,计算0的个数
首先数组不能越界,所以最外层循环进入条件为right<n(数组长度)
滑动窗口四步走:
- 进窗口,遇到0计数器++,否则忽略( ps:滑动窗口的进窗口操作是载入数据,而不是单纯的移动right指针,如果只移动了right而没有对数据进行处理,则不算进窗口。)
- 判断,0个数是否大于 题目中的k (不是等于而是大于,这是因为如果在计数器的0个数等于k时就停止进窗口,并更新状态,那么就会漏情况。比如k为2 那么数组 1 1 0 0 1 1 1 1 这个数组中最长子串的长度就是8,如果是在0等于2个时就停下,那么更新的结果就会是4。)
- 出窗口,left移动,遇到0时计数器--,直到计数器的0个数等于k个,符合题目要求为止。
- 更新结果,无论是否出窗口都更新状态。只要用个max函数来判断此时的子串是否是最大长度即可。
- class Solution {
- public:
- int longestOnes(vector<int>& nums, int k) {
- // 时间O(N), 空间O(1)
- int n = nums.size(), ret = 0, left = 0, right = 0, zero = 0;
- while(right < n)
- {
- if(nums[right] == 0)
- {
- zero++; // 进窗⼝
- }
- while(zero > k) // 判断
- {
- if(nums[left++] == 0)
- {
- zero--; // 出窗⼝
- }
- }
- ret = max(ret, right - left + 1); // 更新结果
- ++right;
- }
- return ret;
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。