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

猜你喜欢

转载自blog.csdn.net/Dby_freedom/article/details/84710199
今日推荐