LeetCode152.乘積最大子數列
題目
分析
題目中有幾個關鍵點:
- 整數數組:意味着沒有小數,不考慮0的情況下相乘的的絕對值肯定是變大或者不變的。
但是由於存在負數,導致最大值可能從正的產生也可能從負的產生,所以就需要在遍歷的時候都進行記錄。
- 動態規劃:
- 這個問題需要我們遍歷數組時計算當前的最大值,並不斷更新
- 由於上面的分析我們可以得知最大值肯定是前面的值乘以當前值或者就是當前值
- 可以得知這樣的狀態轉移方程:
- imax=max(imax*nums[i],nums[i])
- 當負數出現時imax和imin進行交換再進行下一步操作。
代碼實現
public static int maxProduct(int[] nums) {
int max=Integer.MIN_VALUE;
int imax=1,imin = 1;
for(int i=0;i<nums.length;i++){
// 不借助第三方進行交換
if(nums[i]<0){
imax=imax+imin;
imin=imax-imin;
imax=imax-imin;
}
imax=Math.max(imax*nums[i],nums[i]);
imin=Math.min(imin*nums[i],nums[i]);
max=Math.max(max,imax);
}
return max;
}