leetcode 152.Maximum Product Subarray( 乘积最大子序列)

题目要求

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
在这里插入图片描述

解题思路

和求连续最大子数组的和一样leetcode 53 Maximum Subarray (求最大子数组的和),用Kadanes的思想,(算是一种动态规划算法) 它需要两个变量,一个用来存储局部最优值,一个用来比较全局最优值。唯一不同的是,在乘法运算中,可能会有负数和正数相乘的情况,原本这个正数是目前最大的元素,乘一个负数后,就变成最小的了。所以,我们要同时记录到当前位置的最大值和最小值。如果遇到一个负数,那么我们就交换当前的最大和最小值,保证在进行和负数的乘法时也可以得到我们相应的最大,最小值。代码挺简单的,和一起食用效果会更好哦。

主要代码python

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
        max_, imax, imin = float("-inf"), 1, 1
        for i in range(len(nums)):
        # 遇到负数就交换
            if nums[i]<0:
                imax, imin = imin, imax
            imax = max(nums[i]*imax, nums[i])
            imin = min(nums[i]*imin, nums[i])
            max_ = max(imax, max_)
        return max_

相似题目:
leetcode 53 Maximum Subarray (求最大子数组的和)

原题链接 https://leetcode-cn.com/problems/maximum-product-subarray/submissions/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值