1.動態規劃陣列
dp[i][j] 代表的意思是 必須以nums[i]結尾的子陣列的值,j只有兩個值0和1dp[i][0]代表以nums[i]結尾的子陣列的最大值
dp[i][1]代表以nums[i]結尾的子陣列的最小值
這個題之所以不能像之前的求連續陣列的最大和,就是因為 dp[i][j]和最大值最小值有關係,
正數和負數相乘後,可能直接導致最大值和最小值之間的轉換,故期間有狀態轉移關係
接下來,就是推導狀態轉移方程2.優化這裡要分為正數和負數兩種情況
如果nums[i]>=0 dp[i][0]=math.max(nums[i],dp[i-1][0]*nums[i]);
dp[i][1]=math.min(nums[i],dp[i-1][1]*nums[i]);
如果nums[i-1]為正數,自然是越乘越大,如果nums[i-1]為負數,自然是選擇nums[i]最大
如果nums[i-1]為負數,自然是越乘越這個數越負,越小,如果nums[i-1]為正數,自然是選擇nums[i]最小
如果nums[i]<0 dp[i][0]=math.max(nums[i],dp[i-1][1]*nums[i]);
dp[i][1]=math.min(nums[i],dp[i-1][0]*nums[i]);
如果nums[i-1]為正數,自然是越乘越這個數越負,越小,選擇nums[i],如果nums[i-1]為負數,自然是越乘越大,負負得正
如果nums[i-1]為負數,自然是越乘越大,選擇nums[i],如果nums[i-1]為正數,自然是選擇相乘最小
認真觀察沒有優化之前的**,可以看出來,主要變數集中在 dp[i-1][0],dp[i-1][1],幾乎沒有用到動態方程中的其他變數,除了最後遍歷的時候需要遍歷取最大值,但是其實這個迴圈也可以放在第乙個迴圈進行,用premax,premin來代替dp[i-1][0],dp[i-1][1],在每次得到premax後與max比大小,去最大值
除了nums[i]<0處,premax需要乙個temp臨時變數先儲存一下值
Leetcode 152 乘積最大子串行
原題描述 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 例如,給定序列 2,3,2,4 其中乘積最大的子串行為 2,3 其乘積為6。解答 1.暴力搜尋 o n 2 沒有ac 超時 class solution return max 2.動態規劃思想,max min 每有乙個新的數字加入,...
Leetcode 152 乘積最大子串行
給定乙個整數陣列nums,找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0解釋 結果不能為 2,因為 2,1 不是子陣列。這裡用動態規化的方法,即dp i 為以i結尾乘積最大連...
leetcode152 乘積最大子串行
給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。用三個變數分別記錄最大值,到之前乙個數的最大值和...