我正在解决的问题:
给定一个二进制数组 nums,您应该从中删除一个元素。 返回结果数组中仅包含 1 的最长非空子数组的大小。如果不存在这样的子数组,则返回 0。 问题链接:https://leetcode.com/problems/longest-subarray-of-1s-after-deleting-one-element
思考过程:
应用滑动窗口机制,i和j位于数组的开头
如果 array[j] 不为 0,我们会继续递增 j,因为它是安全的
如果 array[j] 为 0 并且第一次为 0,我们会保持递增 j,因为它可以安全地递增 count0
如果 array[j] 为 0 并且第二次为 0 如果 array[i] 为 0 那么我们减少计数并增加 i
如果 array[j] 为 0 并且第二次为 0 如果 array[i] 不为 0 那么我们只需增加 i \
我的代码
https://codeshare.io/w9nxOJ
https://imgur.com/a/kF3pu72
class Solution:
def longestSubarrayOf1s(self, array):
i,j = 0,0
N = len(array)
toReturn,count0,curr_count=0,0,0
while j < N:
if array[j] == 1:
j+=1
else:
if count0 == 0:
j+=1
count0+=1
else:
if array[i] == 0:
i+=1
count0-=1
else:
i+=1
print('i am updating my max answer to ', j-i, 'in the window of ', i, j)
toReturn = max(toReturn, j-i)
return toReturn
测试数组
[1,1,1] #expected 2
[1,1,0,1] #expected 3
[0,1,1,1,0,1,1,0,1] #expected 5
你的算法很好,但挑战要求你应该返回结果数组中的大小(仅包含1的最长非空子数组)。您已返回其在 original 数组中的大小。由于需要在找到的子数组中删除一项,因此您应该比当前少返回一项:
toReturn = max(toReturn, j-i - 1) # One less!