此题可以使用一种巧妙的解法:
首先0是一个分界点,如果在遍历数组过程中遇到0,那么最大乘积需要重新计算
此外此题的nums中会出现负数,如果出现负数只有两种情况:
-
有偶数个负数:
在这种情况下最大乘积即为所有数的乘积(除去0的情况)
-
有奇数个负数:
在这种情况下某一个未知的负数会成为分界点,将整个数组分成左右两个部分,最大乘积可能同时在左边或者右边部分出现。我们只需要同时求解左右两边乘积最大值即为所求
时间复杂度O(N),空间O(1),该算法为最优解
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0
n = len(nums)
left = 0
right = 0
max_product = float("-inf")
for i in range(0, n):
if left == 0:
left = nums[i]
else:
left *= nums[i]
if right == 0:
right = nums[n - 1 - i]
else:
right *= nums[n - 1 - i]
max_product = max(max_product, max(left, right))
return max_product