1. 程式人生 > >leetcode | 152. Maximum Product Subarray

leetcode | 152. Maximum Product Subarray

題目

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example 1:

Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.

Example 2:

Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [
-2,-1] is not a subarray.

思路與解法

這道題讓我們從陣列中尋找一個連續子序列使得其累乘所得的積最大。這道題與最大連續子數列和十分相似(最大連續子數列和的狀態轉移方程為dp[i]=max(num[i], dp[i-1]+num[i],其中狀態 dp[i] 表示以 num[i] 作為末尾的連續子數列的最大和))。
所以,我們可以採用同樣的想法,使用dp[i]表示以num[i]作為末尾的連續子數列的最大積。由於在乘法中,兩個負數相乘結果為正,所以可能存在一個很小的負數積在以num[i]為末尾時此子數列得到一個更大的積。所以我們既需要維護最大積,也需要維護最小積。可以分別用dp[i][0]

或者dp[i][1]來表示。

程式碼實現(Go)

const INT_MAX = int(^uint(0) >> 1)
const INT_MIN = ^INT_MAX
// 自定義max函式
func max(nums ...int) (maxx int) {
    maxx = INT_MIN
    for _, num := range(nums) {
        if maxx < num {
            maxx = num
        }
    }
    return
}
// 自定義min函式
func min(nums ...int)
(minn int) { minn = INT_MAX for _, num := range(nums) { if minn > num { minn = num } } return } func maxProduct(nums []int) int { lenNums := len(nums) // 並沒有使用陣列來儲存狀態 localMin := nums[0] localMax := nums[0] // res儲存最大值 res := nums[0] for i:=1; i<lenNums; i++ { tempMax := localMax // 以num[i]為結尾的子數列的最大值為localMax*nums[i]、localMin*nums[i]、nums[i]三者中的一個 localMax = max(localMax * nums[i], localMin * nums[i], nums[i]) // 以num[i]為結尾的子數列的最小值為tempMax *nums[i]、localMin*nums[i]、nums[i]三者中的一個 localMin = min(tempMax * nums[i], localMin * nums[i], nums[i]) // 更新res res = max(localMax, res) } return res }

執行結果

在這裡插入圖片描述