mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
|
def max_product_subarray(numbers: list[int]) -> int:
|
||
|
"""
|
||
|
Returns the maximum product that can be obtained by multiplying a
|
||
|
contiguous subarray of the given integer list `nums`.
|
||
|
|
||
|
Example:
|
||
|
>>> max_product_subarray([2, 3, -2, 4])
|
||
|
6
|
||
|
>>> max_product_subarray((-2, 0, -1))
|
||
|
0
|
||
|
>>> max_product_subarray([2, 3, -2, 4, -1])
|
||
|
48
|
||
|
>>> max_product_subarray([-1])
|
||
|
-1
|
||
|
>>> max_product_subarray([0])
|
||
|
0
|
||
|
>>> max_product_subarray([])
|
||
|
0
|
||
|
>>> max_product_subarray("")
|
||
|
0
|
||
|
>>> max_product_subarray(None)
|
||
|
0
|
||
|
>>> max_product_subarray([2, 3, -2, 4.5, -1])
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: numbers must be an iterable of integers
|
||
|
>>> max_product_subarray("ABC")
|
||
|
Traceback (most recent call last):
|
||
|
...
|
||
|
ValueError: numbers must be an iterable of integers
|
||
|
"""
|
||
|
if not numbers:
|
||
|
return 0
|
||
|
|
||
|
if not isinstance(numbers, (list, tuple)) or not all(
|
||
|
isinstance(number, int) for number in numbers
|
||
|
):
|
||
|
raise ValueError("numbers must be an iterable of integers")
|
||
|
|
||
|
max_till_now = min_till_now = max_prod = numbers[0]
|
||
|
|
||
|
for i in range(1, len(numbers)):
|
||
|
# update the maximum and minimum subarray products
|
||
|
number = numbers[i]
|
||
|
if number < 0:
|
||
|
max_till_now, min_till_now = min_till_now, max_till_now
|
||
|
max_till_now = max(number, max_till_now * number)
|
||
|
min_till_now = min(number, min_till_now * number)
|
||
|
|
||
|
# update the maximum product found till now
|
||
|
max_prod = max(max_prod, max_till_now)
|
||
|
|
||
|
return max_prod
|