Lecture 3 : Hard problems on array¶
Maximum Product Subarray in an Array¶
Nums = [1,2,3,4,5,0]
Output: 120
Explaination : 1×2×3×4×5
Nums = [1,2,-3,0,-4,-5]
Output : 20
Explaination : -5 x -4
Brute Force¶
- multiply all continuous combinations
- result = max(all)
In [1]:
def max_product(nums):
n = len(nums)
result = nums[0]
for i in range(n):
product =1
for j in range(i+1,n):
product *= nums[j]
result = max(result,product)
return result
print(max_product([1,2,3,4,5,0]))
print(max_product([1,2,-3,0,-4,-5]))
120 20
Complexity¶
- O(N^2) : N = len(nums)
- O(1)
Two pass product¶
- Canculate running product in forward pass and backward pass
- Keep track of 0 ,
- max(prod)
In [11]:
def max_product(nums):
n = len(nums)
result = nums[0]
# forward pass
prod = 1
for i in range(n):
prod *= nums[i]
result = max(result,prod)
if nums[i] ==0:
prod = 1
result = max(result,0)
# backward pass
prod = 1
for i in range(n-1,-1,-1):
prod *= nums[i]
result = max(result,prod)
if nums[i] ==0:
prod = 1
result = max(result,0)
return result
print(max_product([1,2,3,4,5,0]))
print(max_product([1,2,-3,0,-4,-5]))
120 20
Complexity¶
O(N) : N = len(nums)
O(1)
Approach 3 (Kadane's Algorithm) MOST CLEANEST¶
Track min and max prod ending at each position because a negative can turn a minimum to maximum
In [ ]:
def max_product(nums):
result = nums[0]
max_ending_here = nums[0]
min_ending_here = nums[0]
for num in nums[1:]:
max_p,min_p = max_ending_here,min_ending_here
max_ending_here = max(num,num*max_p,num* min_p)
min_ending_here = min(num,num*max_p,num* min_p)
result = max(result,max_ending_here)
return result
print(max_product([1,2,3,4,5,0]))
print(max_product([1,2,-3,0,-4,-5]))
print(max_product([-4,-3,-2]))
120 20 12