此题可以使用一种巧妙的解法:

首先0是一个分界点,如果在遍历数组过程中遇到0,那么最大乘积需要重新计算

此外此题的nums中会出现负数,如果出现负数只有两种情况:

  1. 有偶数个负数:

    在这种情况下最大乘积即为所有数的乘积(除去0的情况)

  2. 有奇数个负数:

    在这种情况下某一个未知的负数会成为分界点,将整个数组分成左右两个部分,最大乘积可能同时在左边或者右边部分出现。我们只需要同时求解左右两边乘积最大值即为所求

时间复杂度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