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 [ ]:
def max_product(nums):
n = len(nums)
result = nums[0]
for i in range(n):
product =nums[i]
result = max(result,product)
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):
n = len(nums)
result = nums[0]
max_ending_here = nums[0]
min_ending_here = nums[0]
for i in range(1,n):
# save the previous values
prev_max = max_ending_here
prev_min = min_ending_here
max_ending_here = max(nums[i],nums[i]*prev_max,nums[i]* prev_min)
min_ending_here = min(nums[i],nums[i]*prev_max,nums[i]* prev_min)
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]))