35 lines
1.3 KiB
Ruby
35 lines
1.3 KiB
Ruby
|
#Given an array of integers(both positive and negative),find the subarray with maximum product.
|
|||
|
# Time Complexity: O(n),Auxiliary Space: O(1)
|
|||
|
|
|||
|
#Note: It doesn’t work for arrays like {0, 0, -20, 0}, {0, 0, 0}.. etc
|
|||
|
|
|||
|
def max_product(a)
|
|||
|
len=a.length
|
|||
|
max_ending_here=min_ending_here=max_so_far=1
|
|||
|
for i in 0...len
|
|||
|
# If this element is +ve, update max_ending_here.
|
|||
|
# Update minEndingHere only if minEndingHere is negative
|
|||
|
if a[i]>0
|
|||
|
max_ending_here=max_ending_here*a[i]
|
|||
|
min_ending_here = [min_ending_here*a[i],1].min
|
|||
|
|
|||
|
# If this element is 0, then the maximum product
|
|||
|
# cannot end here, make both maxEndingHere and minEndingHere 0
|
|||
|
# Assumption: Output is alway greater than or equal to 1.
|
|||
|
elsif a[i]==0
|
|||
|
max_ending_here=min_ending_here=1
|
|||
|
|
|||
|
# If this element is -ve,min_ending here is previous max_ending_here*current
|
|||
|
#max_ending_here is min of previous min_ending_here*current and 1
|
|||
|
else
|
|||
|
temp=max_ending_here
|
|||
|
max_ending_here=[min_ending_here*a[i],1].max
|
|||
|
min_ending_here=temp*a[i]
|
|||
|
end
|
|||
|
|
|||
|
max_so_far=max_ending_here if max_so_far<max_ending_here
|
|||
|
end
|
|||
|
return max_so_far
|
|||
|
end
|
|||
|
|
|||
|
max_product([-2, -3, 0, -2, -40]) # => 80
|