LeetCode 152 乘積最大子陣列

2021-10-25 18:31:33 字數 1448 閱讀 9391

1.動態規劃陣列

dp[i][j] 代表的意思是  必須以nums[i]結尾的子陣列的值,j只有兩個值0和1

dp[i][0]代表以nums[i]結尾的子陣列的最大值

dp[i][1]代表以nums[i]結尾的子陣列的最小值

這個題之所以不能像之前的求連續陣列的最大和,就是因為   dp[i][j]和最大值最小值有關係,

正數和負數相乘後,可能直接導致最大值和最小值之間的轉換,故期間有狀態轉移關係

接下來,就是推導狀態轉移方程

這裡要分為正數和負數兩種情況

如果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]為正數,自然是選擇相乘最小

2.優化

認真觀察沒有優化之前的**,可以看出來,主要變數集中在 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 不是子陣列。用三個變數分別記錄最大值,到之前乙個數的最大值和...