class Solution:
def getMaxLen(self, A: List[int]) -> int:
"""tc O(N) sc O(1)
avoid 0 => 0 split A into subarray
record first neg pos
main idea: for each non-zero number, check current accumutive neg cnt to decide if we need to reduce possible max subarray length by 1
each time we see a 0, reset first negtive number position and update last zero position to reculate current valid range its max length
"""
first_neg,last_zero = -1,-1
cur_len = max_len =0
for i,a in enumerate(A):
if a < 0:
cur_len += 1
if first_neg == -1:
first_neg = i
if a == 0:
last_zero = i
first_neg = -1
cur_len = 0
else:
# even number of negtive
if cur_len%2 == 0:
max_len = max(i - last_zero,max_len)
else:
max_len = max(i-first_neg,max_len)
return max_len