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.

Reference Answer

思路分析

主要需要考慮負負得正這種情況,比如之前的最小值是一個負數,再乘以一個負數就有可能成為一個很大的正數。

這道題相對於最大和子序列多了正負號情況,即不能再簡單隻保留最大值,因為兩個負數的乘積為正。

Code

class Solution:
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 1:
            return
nums[0] res = max_temp = min_temp = nums[0] for count in nums[1:]: pre_max, pre_min = max_temp, min_temp max_temp = max(pre_max*count, count, pre_min*count) min_temp = min(pre_max*count, count, pre_min*count) res = max(res, max_temp)
return res

C++版本:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        if (nums.size() == 1){
            return nums[0];
        }
        int res = nums[0], min_temp = nums[0], max_temp = nums[0];
        for (int i=1; i<nums.size(); ++i){
            int pre_max = max_temp;
            int pre_min = min_temp;
            max_temp = max(max(pre_max*nums[i], nums[i]), pre_min*nums[i]);
            min_temp = min(min(pre_max*nums[i], nums[i]), pre_min*nums[i]);
            res = max(max_temp, res);
                
        }
        return res;
    }
};

Note:

  • 這道題一個很容易出錯的地方是max_temp = max(pre_max*count, count, pre_min*count),若是改為直接用max_temp = max(max_temp *count, count, pre_min*count),則結果錯誤,必須先把上次的值重新儲存為一個新變數pre_max,後面用pre_max做乘積運算!
  • 注意C++版本的max, min函式只能處理兩個輸入的比較,對於三個數的比較只能曲線救國:max_temp = max(max(pre_max*nums[i], nums[i]), pre_min*nums[i]);

參考資料

[1] https://www.cnblogs.com/zuoyuan/p/4019326.html
[2] https://blog.csdn.net/fuxuemingzhu/article/details/83211451