日常学习:(算法)
最⼤连续 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。
算法思想--->动态窗口
求数组中⼀段最⻓的连续区间,要求这段区间内 0 的个数不超过 k 个。
- 初始化⼀个⼤⼩为 2 的数组就可以当做哈希表 hash 了;初始化⼀些变量 left = 0 ,
right = 0 , ret = 0 ; - 当 right ⼩于数组⼤⼩的时候,⼀直下列循环:
- 让当前元素进⼊窗⼝,顺便统计到哈希表中;
- 检查 0 的个数是否超标:
- 如果超标,依次让左侧元素滑出窗⼝,顺便更新哈希表的值,直到 0 的个数恢复正
常;
- 如果超标,依次让左侧元素滑出窗⼝,顺便更新哈希表的值,直到 0 的个数恢复正
- right++ ,处理下⼀个元素;
代码实现:
java
class Solution {
public int longestOnes(int[] nums, int k) {
int ret=0,n=nums.length;
for(int left=0,right=0,zero=0;right<n;right++){
if(nums[right]==0){
zero++;//进窗口
}
while(zero>k){//判断
if(nums[left++]==0){
zero--;//出窗口
}
}
ret=Math.max(ret,right-left+1);
}
return ret;
}
}