Leetcode # 1567. Maximum Length of Subarray With Positive Product
- 2021.12.27
- LeetCode
https://leetcode.com/problems/maximum-length-of-subarray-with-positive-product/
Solution
把 nums 以 0 分割為 part[0], part[1], …
- 如果 len(part[i]) % 2 為 0
(負數有偶數個,則其積為正)
part[i] 的 Maximum Length of Subarray With Positive Product 為 len(part[i]) - 如果 len(part[i]) % 2 不為 0 :
- 起始為正數,結束也為正數,即
\begin{align}
& part[i][j] > 0, \forall j \in [0, x] \land part[i][x + 1]<0 \\
& part[i][j] > 0, \forall j \in [y, \text{len}(part[i]) – 1] \land part[i][y – 1]<0
\end{align}
則其 Maximum Length of Subarray With Positive Product
為 len(part[i]) – min(x + 1, len(part[i]) – y) – 1
(拿掉頭尾的連續正數較短之其一及一個負數) - 起始或結束有其一為負數
則其 Maximum Length of Subarray With Positive Product 為 len(part[i]) – 1
(拿掉頭或尾的一個負數)
- 起始為正數,結束也為正數,即
class Solution: def getMaxLen(self, nums: List[int]) -> int: last_sign = 0 same_signs_n = 1 record_about_signs = [] # length of this non-zero numbers sequence, # length of positive numbers sequence at first, # length of negative numbers sequence at first # number of negative numbers for i, num in enumerate(nums): sign = 0 if num == 0 else (1 if num > 0 else -1) # when sign is changed from 0 to non-zero number, # append new part into record_about_signs # when first time sign is changed and last_sign is 1, # write record_about_signs[-1][1] if sign != last_sign: if last_sign == 0: record_about_signs.append([0, -1, 0, 0]) elif record_about_signs[-1][1] == -1: record_about_signs[-1][1] = same_signs_n if last_sign == 1 else 0 # when num is changed from positive number to 0 or num is last element, # write record_about_signs[-1][2] if (last_sign == 1 and num == 0) or (sign == 1 and i == len(nums) - 1): record_about_signs[-1][2] = (same_signs_n if last_sign == 1 else 0) \ + (1 if sign == 1 else 0) if num != 0: record_about_signs[-1][0] += 0 if num == 0 else 1 record_about_signs[-1][3] += 1 if sign == -1 else 0 same_signs_n = (same_signs_n + 1) if sign == last_sign else 1 last_sign = sign # print(record_about_signs) ans = 0 for record_about_sign in record_about_signs: if record_about_sign[3] % 2 == 0: ans = max(ans, record_about_sign[0]) elif record_about_sign[1] > 0 and record_about_sign[2] > 0: ans = max(ans, record_about_sign[0] \ - min(record_about_sign[1], record_about_sign[2]) - 1) else: ans = max(ans, record_about_sign[0] - 1) return ans
Last Updated on 2023/08/16 by A1go