leetcode 152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

 

题解:

1.一个整数数组 nums

2.找乘积最大的连续子数组

3.结果返回该子数组乘积

4.注意负数对乘积的影响

 

示例 1:

输入: [2,3,-2,4]

输出: 6

解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1]

输出: 0

解释: 结果不能为 2, 因为 [-2,-1] 不是子数组

 

解题思路:

大致思路可以参考53. 最大子序和

  • f(i-1)*nums[i]和nums[i]值比较大小

  • f(i-1)的最大值和f(i)的最大值比较大小

  • 对有可能出现负负得正变成大和正负得负变小分别记录一个最大值和最小值,找最大值时,比较max*nums[i],nums[i]和min*nums[i](考虑max(f(i-1))>0,nums[i]>0和max(f(i-1))<0,nums[i]<0),同样记录最小值

  • 最后max(f(i-1))和max(f(i))比较得出最终结果

C/C++题解:

class Solution {

public:

    int maxProduct(vector& nums) {

        int maxv = nums[0], minv = nums[0], res = nums[0];

        for (int i = 1; i < nums.size(); ++i) {

            //与53.最大子序和相似比较f(i-1)*nums[i],nums[i]和f(i-1)

            int mx = maxv, mn = minv;//注意负数影响

            int min_i = max(nums[i], mn * nums[i])//f(i-1)*nums[i],nums[i]比较

            //如果f(i-1)是负,nums[i]负,因负负得正变大可以记录

            maxv = max(mx * nums[i], min_i);

            int max_i = min(nums[i], mx * nums[i])//f(i-1)*nums[i],nums[i]比较

            //如果f(i-1)是正,nums[i]负,f(i-1)最大值此时变负,但考虑后续会再有负数出现

            minv = min(mn * nums[i], max_i);

            res = max(maxv, res );}//f(i-1)与f(i)比较

 

        return res ;}};

Debug结果:

leetcode 152. 乘积最大子数组_第1张图片

Java题解:

class Solution {

    public int maxProduct(int[] nums) {

        int maxv = nums[0], minv = nums[0], res = nums[0];

        for (int i = 1; i < nums.length; i++) {

            //与53.最大子序和相似比较f(i-1)*nums[i],nums[i]和f(i-1)

            int mx = maxv, mn = minv;//注意负数影响

            int min_i = Math.max(nums[i], mn * nums[i]);//f(i-1)*nums[i],nums[i]比较

            //如果f(i-1)是负,nums[i]负,因负负得正变大可以记录

            maxv = Math.max(mx * nums[i], min_i);

            int max_i = Math.min(nums[i], mx * nums[i]);//f(i-1)*nums[i],nums[i]比较

            //如果f(i-1)是正,nums[i]负,f(i-1)最大值此时变负,但考虑后续会再有负数出现

            minv = Math.min(mn * nums[i], max_i);

            res = Math.max(maxv, res);}//f(i-1)与f(i)比较

        return res;}}

Debug结果:

leetcode 152. 乘积最大子数组_第2张图片

Python题解:

class Solution(object):

    def maxProduct(self, nums):

        """:type nums: List[int]:rtype: int"""

        maxv, minv, res = nums[0], nums[0], nums[0]

        for i in range(1, len(nums)):

            #与53.最大子序和相似比较f(i-1)*nums[i],nums[i]和f(i-1)

            mx, mn  = maxv, minv #注意负数影响

            min_i = max(nums[i], mn * nums[i])#f(i-1)*nums[i],nums[i]比较

            #如果f(i-1)是负,nums[i]负,因负负得正变大可以记录

            maxv = max(mx * nums[i], min_i)

            max_i = min(nums[i], mx * nums[i])#f(i-1)*nums[i],nums[i]比较

            #如果f(i-1)是正,nums[i]负,f(i-1)最大值此时变负,但考虑后续会再有负数出现

            minv = min(mn * nums[i], max_i)

            res = max(maxv, res)#f(i-1)与f(i)比较

        return res

Debug结果:

leetcode 152. 乘积最大子数组_第3张图片

更多题解移步公众号免费获取

leetcode 152. 乘积最大子数组_第4张图片

你可能感兴趣的:(leetcode 152. 乘积最大子数组)