leetcode 152 乘積最大子序列

溫酒煮Bug發表於2019-01-24

描述:

給定一個整數陣列 nums ,找出一個序列中乘積最大的連續子序列(該序列至少包含一個數)。

示例 1:

輸入: [2,3,-2,4]
輸出: 6
解釋: 子陣列 [2,3] 有最大乘積 6。
複製程式碼

示例 2:

輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。
複製程式碼

思路:

這道題可以動態規劃的方法解決。

DP定義:min[i] max[i],用來存i位置時,乘積的最大子序列/最小子序列。因為有負數的存在,所以不能只存最大值,還要存最小值。

DP方程:

if(i > 0){
  max[i+1] = max[i]*(i+1);
  min[i+1] = min[i]*(i+1);
}else{
  max[i+1] = min[i]*(i+1);
  min[i+1] = max[i]*(i+1);
}複製程式碼

程式碼:

class Solution {
  public int maxProduct(int[] nums) {
    int[] min = new int[nums.length];
    int[] max = new int[nums.length];
    min[0] = nums[0];
    max[0] = nums[0];
    int res = nums[0];
    for (int i = 1; i < nums.length; i++) {
      min[i] = Math.min(Math.min(min[i - 1] * nums[i], max[i - 1] * nums[i]), nums[i]);
      max[i] = Math.max(Math.max(max[i - 1] * nums[i], min[i - 1] * nums[i]), nums[i]);
      res = Math.max(res,max[i]);
    }
    return res;
  }
}
複製程式碼

結果:

leetcode 152 乘積最大子序列

相關文章