题目
- Maximum Length of Subarray With Positive Product
解法1:动态规划
键要能想到正数和负数的个数是相互转化的,比如之前是正的序列,加上个正数还是正,加上负数就变负数了,所以需要同时记录当前的正数序列的长度和负数序列的长度
class Solution:
def getMaxLen(self, nums: List[int]) -> int:
posi = [0] * len(nums)
nega = [0] * len(nums)
if nums[0] > 0:
posi[0] = 1
if nums[0] < 0:
nega[0] = 1
for i in range(1,len(nums)):
if nums[i] < 0:
posi[i] = nega[i-1] + 1 if nega[i-1] > 0 else 0
nega[i] = posi[i-1] + 1
elif nums[i] > 0:
nega[i] = nega[i-1] + 1 if nega[i-1] > 0 else 0
posi[i] = posi[i-1] + 1
return max(posi)
解法2:压缩版动态规划
class Solution:
def getMaxLen(self, nums: List[int]) -> int:
posi_len = 0
nega_len = 0
ans = 0
for num in nums:
if num == 0:
posi_len = nega_len = 0
elif num < 0:
posi_len,nega_len = nega_len,posi_len
nega_len += 1
if posi_len > 0:
posi_len += 1
else:
posi_len += 1
if nega_len > 0:
nega_len += 1
ans = max(ans,posi_len)
return ans