# LeetCode算法学习之- 滑动窗口-[1004. 最大连续1的个数 III]

127 阅读1分钟

题目

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k0 ,则返回 数组中连续 1 的最大个数

分析

\1. 最大子串 =》 动态滑动窗口

\2. 可以最多翻转k个0 =》 使用map 来收集0 和1

解法:滑动窗口


思路
1. 数组中连续 1 的最大个数 
 1. 最大子串 =》 动态滑动窗口 => 满足条件 left++
 2. 可以最多翻转k个0 =》 当 i-j+1-map[1]>k的时候需要左收敛
 3. 最大个数=》 不断更新max 
*/
// @lc code=start
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var longestOnes = function (nums, k) {
  //   初始化Map
  const map = {
    1: 0,
    0: 0,
  };
  let max = 0;
  //   左指针
  let j = 0;
  for (let i = 0; i < nums.length; i++) {
    map[nums[i]]++;
    while (i - j + 1 - map[1] > k) {
      map[nums[j]]--;
      j++;
    }
    max = Math.max(max, i - j + 1);
  }

  return max;
};

//时间复杂度:O(n)
//空间复杂度:O(1)

总结

今天这道题是主要是练习如何使用 动态的滑动窗口 来求最大连续子字符串的题目

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com

\