删掉一个元素以后全为 1 的最长子数组

114 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

1493. 删掉一个元素以后全为 1 的最长子数组 - 力扣(LeetCode)

给你一个二进制数组 nums ,你需要从中删掉一个元素。

请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。

如果不存在这样的子数组,请返回 0 。

提示 1:

输入: nums = [1,1,0,1]
输出: 3
解释: 删掉位置 2 的数后,[1,1,1] 包含 3 个 1 。

示例 2:

输入: nums = [0,1,1,1,0,1,1,0,1]
输出: 5
解释: 删掉位置 4 的数字后,[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1] 。

示例 3:

输入: nums = [1,1,1]
输出: 2
解释: 你必须要删除一个元素。

提示:

  • 1 <= nums.length <= 10^5
  • nums[i] 要么是 0 要么是 1

解题

/**
 * @param {number[]} nums
 * @return {number}
 */
var longestSubarray = function (nums) {
  let idx1 = 0;
  let oneCount = 0;
  let zeroCount = 0;
  let longest = 0;
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] === 1) {
      oneCount++;
      if (zeroCount > 0) {
        idx1 = i;
        zeroCount = 0;
      }
    } else {
      longest = Math.max(longest, oneCount);
      zeroCount++;
      if (zeroCount === 1) {
        oneCount = i - idx1;
      } else {
        oneCount = 0;
      }
    }
  }
  longest = Math.max(longest, oneCount);
  return longest === nums.length ? longest - 1 : longest;
};