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(因为必须删除一个元素)。
- 时间复杂度
,空间复杂度 。