【每日一題-leetcode】152.乘積最大子數組

152.乘積最大子數組

  1. 乘積最大子數組

難度中等580

給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),並返回該子數組所對應的乘積。

示例 1:

輸入: [2,3,-2,4]
輸出: 6
解釋: 子數組 [2,3] 有最大乘積 6。

示例 2:

輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能爲 2, 因爲 [-2,-1] 不是子數組。

dp

動態規劃:
1.找到重複子問題
2.dp狀態
3.dp方程

  1.重複子問題  求乘積最大子數組,那麼子問題的劃分就是求上一個子問題的最大乘積和現在的值相乘。
  2.直接用一維的可以嗎  首先一維的只能記錄當前的最大值。
    但是還有一個隱晦的條件,子問題如果是一個負數,那麼最大的值乘以負數 就會成爲最小的值。
    所以不行、所以我們可以採用常量 來記錄當前的最大值和最小值。
    a.minValue = 記錄當前最小值  maxValue = 記錄當前最大值
    b.如果遇到一個最大值,那麼直接Math.(maxValue,a[i]) 比較
      如果遇到一個負數 -最大值會成爲最小值 最小值會成爲最大值。所以交換最大值和最小值
  時間複雜度:O(n)  空間複雜度O(1)
/***
     動態規劃:
      1.找到重複子問題
      2.dp狀態
      3.dp方程

      1.重複子問題  求乘積最大子數組,那麼子問題的劃分就是求上一個子問題的最大乘積和現在的值相乘。
      2.直接用一維的可以嗎  首先一維的只能記錄當前的最大值。
        但是還有一個隱晦的條件,子問題如果是一個負數,那麼最大的值乘以負數 就會成爲最小的值。
        所以不行、所以我們可以採用常量 來記錄當前的最大值和最小值。
        a.minValue = 記錄當前最小值  maxValue = 記錄當前最大值
        b.如果遇到一個最大值,那麼直接Math.(maxValue,a[i]) 比較
          如果遇到一個負數 -最大值會成爲最小值 最小值會成爲最大值。所以交換最大值和最小值
      時間複雜度:O(n)  空間複雜度O(1)

    */
    public int maxProduct(int[] nums) {
        int maxValue = 1, minValue = 1,max = Integer.MIN_VALUE;
        for(int num : nums){
            if(num<0){
                int temp = minValue;
                minValue = maxValue;
                maxValue = temp;
            }
            maxValue = Math.max(maxValue*num,num);
            minValue = Math.min(minValue*num,num);
            
            max = Math.max(maxValue,max);
        }
        return max;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章