152.乘積最大子數組
- 乘積最大子數組
難度中等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;
}