1
+ package com .leetcode .dynamicprogramming ;
2
+
3
+ import static org .junit .jupiter .api .Assertions .assertEquals ;
4
+
5
+ /**
6
+ * Level: Medium
7
+ * Link: https://leetcode.com/problems/maximum-product-subarray/
8
+ * Description:
9
+ * Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which
10
+ * has the largest product.
11
+ * <p>
12
+ * Example 1:
13
+ * Input: [2,3,-2,4]
14
+ * Output: 6
15
+ * Explanation: [2,3] has the largest product 6.
16
+ * <p>
17
+ * Example 2:
18
+ * Input: [-2,0,-1]
19
+ * Output: 0
20
+ * Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
21
+ *
22
+ * @author rampatra
23
+ * @since 2019-08-18
24
+ */
25
+ public class MaximumProductSubArray {
26
+
27
+ /**
28
+ * The approach is similar to {@link MaximumSubArray} where we update maxUntilIndex only if multiplying the current
29
+ * number to the product of of all numbers until index produces a larger product and if not make maxUntilIndex the
30
+ * current number. The only twist here is that we keep two such variables, one for max and one for min, and that's
31
+ * because the product of two negatives gives us a positive number.
32
+ * <p>
33
+ * Runtime: <a href="https://leetcode.com/submissions/detail/252751578/">1 ms</a>.
34
+ *
35
+ * @param nums
36
+ * @return
37
+ */
38
+ public static int maxProduct (int [] nums ) {
39
+ int maxProd = nums [0 ];
40
+ int maxUntilIndex = nums [0 ];
41
+ int minUntilIndex = nums [0 ];
42
+
43
+ for (int i = 1 ; i < nums .length ; i ++) {
44
+ if (nums [i ] >= 0 ) {
45
+ maxUntilIndex = Math .max (nums [i ], maxUntilIndex * nums [i ]);
46
+ minUntilIndex = Math .min (nums [i ], minUntilIndex * nums [i ]);
47
+ } else {
48
+ int prevMaxUntilIndex = maxUntilIndex ;
49
+ maxUntilIndex = Math .max (nums [i ], minUntilIndex * nums [i ]); // when current number is -ve then multiply with minUntilIndex to get the max as product of two negatives is a positive
50
+ minUntilIndex = Math .min (nums [i ], prevMaxUntilIndex * nums [i ]);
51
+ }
52
+
53
+ maxProd = Math .max (maxProd , maxUntilIndex );
54
+ }
55
+
56
+ return maxProd ;
57
+ }
58
+
59
+ public static void main (String [] args ) {
60
+ assertEquals (24 , maxProduct (new int []{-2 , 3 , -4 }));
61
+ }
62
+ }
0 commit comments