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

79 阅读1分钟

题目

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

分析

\1. 连续子数组=》 动态滑动窗口

\2. 最大个数 =》 不停更新 max

解法:滑动窗口


思路
1. 续 1 的
 1. 连续1的个数=》 子数组=》 动态滑动窗口  
2. 可以更改一个0 
 1. map 收集字符
 2. 当 0超过一个的时候 左边收敛 j++
3. 最大个数
 1.max => Math.max(i-j+1)
*/

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMaxConsecutiveOnes = function (nums) {
  // 初始化条件
  const map = {
    0: 0,
    1: 0,
  };
  let max = 0;
  // 左指针
  let j = 0;

  for (let i = 0; i < nums.length; i++) {
    map[nums[i]] += 1;
    // i - j + 1 - map[1]相当于0 的个数,当0 的个数大于1的时候左收敛
    while (i - j + 1 - map[1] > 1) {
      map[nums[j]] -= 1;
      j++;
    }
    // 不断更新最大长度
    max = Math.max(max, i - j + 1);
  }
  return max 
};

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


总结

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

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

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

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

\