非定长滑动窗口(持续更新)
1493. 删掉一个元素以后全为 1 的最长子数组
题目来源:1493. 删掉一个元素以后全为 1 的最长子数组 - 力扣(LeetCode)
分析:
- 因为要求删掉一个元素后的子数组最大长度,所以窗口内允许存在至多一个0(非1元素)
- 可以使用字典来存储0元素个数
- 如果0元素个数大于 1 ,那么滑动窗口直至窗口内0元素数量等于1
- 子数组长度应该 right - left 而不再 +1 因为删掉了其中一个元素0
我的答案:
class Solution:def longestSubarray(self, nums: List[int]) -> int:res = left = 0dic = defaultdict(int)for right,element in enumerate(nums):if element != 1:dic[element] += 1while dic[element] > 1:dic[nums[left]] -= 1left += 1res = max(res,right - left)return res
标准题解:
class Solution:def longestSubarray(self, nums: List[int]) -> int:ans = cnt0 = left = 0for right, x in enumerate(nums):# 1. 入,nums[right] 进入窗口cnt0 += 1 - x # 维护窗口中的 0 的个数while cnt0 > 1: # 不符合题目要求# 2. 出,nums[left] 离开窗口cnt0 -= 1 - nums[left] # 维护窗口中的 0 的个数left += 1# 3. 更新答案,注意不是 right-left+1,因为我们要删掉一个数ans = max(ans, right - left)return ans