def max_product_subarray(nums):
    if not nums:
        return None
    high = low = best = nums[0]
    for i in range(1, len(nums)):
        value = nums[i]
        candidates = (value, high * value, low * value)
        high, low = max(candidates), min(candidates)
        best = max(best, high)
    return best
