Maximum Product Subarray

描述

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 6.

分析

这题跟“最大连续子序列和”非常类似,只不过变成了“最大连续子序列积”,所以解决思路也很类似。

仅仅有一个小细节需要注意,就是负负得正,两个负数的乘积是正数,因此我们不仅要跟踪最大值,还要跟踪最小值。

动规

  1. // maximum-product-subarray
  2. // 时间复杂度O(n),空间复杂度O(1)
  3. public class Solution {
  4. public int maxProduct(int[] nums) {
  5. int maxLocal = nums[0];
  6. int minLocal = nums[0];
  7. int global = nums[0];
  8. for(int i = 1; i < nums.length; i++){
  9. int temp = maxLocal;
  10. maxLocal = Math.max(Math.max(nums[i] * maxLocal, nums[i]), nums[i] * minLocal);
  11. minLocal = Math.min(Math.min(nums[i] * temp, nums[i]), nums[i] * minLocal);
  12. global = Math.max(global, maxLocal);
  13. }
  14. return global;
  15. }
  16. }

相关题目

原文: https://soulmachine.gitbooks.io/algorithm-essentials/content/java/dp/maximum-product-subarray.html