Skip to content

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

题目链接:https://leetcode.cn/problems/longest-subarray-of-1s-after-deleting-one-element/

代码

ts
/**
 * 1493. 删掉一个元素以后全为 1 的最长子数组
 * https://leetcode.cn/problems/longest-subarray-of-1s-after-deleting-one-element/
 */

function longestSubarray(nums: number[]): number {
    let z = -1; // 最近0位置
    let left = 0; // 左指针
    let res = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] === 0) {
            if (z >= left && z !== -1) {
                left = z + 1;
            }
            z = i;
        }
        res = Math.max(res, i - left + 1);
    }
    return res - 1;
}

思路

  • 使用滑动窗口,允许窗口内最多包含一个 0,表示可以删掉的那个元素。
  • 右指针向右移动,当窗口内 0 的数量大于 1 时,就移动左指针缩小窗口,直到窗口内最多只剩一个 0
  • 在整个过程中维护窗口长度的最大值,最后答案是最大窗口长度减 1(因为必须删除一个元素)。
  • 时间复杂度 O(n),空间复杂度 O(1)