LeetCode 152.乘积最大子序列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Oscar6280868/article/details/89598963

这道题目是给定一个整数数组,返回乘积最大的连续子序列,题目如下所示:
题目
拿到题目我们肯定会想到的是暴力解法,通过两层循环遍历数组中所有的元素,记录每一次循环之后的全局乘积最小值,直到循环结束,我们就可以得到乘积最大的连续子序列,显然这样的解法时间复杂度达到了 O ( n 2 ) O(n^2)
除了暴力的解法,我们可以想一下是否可以用动态规划DP的方法来解决此问题,那么如何DP呢?我们来看以下的这个流程:
flowchart
以题目中的例子为例,我们来看看这个案例的DP过程,首先因为考虑到数组中可能有负数的缘故,我们可以定义一个二维数组,第二维等于0的时候表示最大值,等于1的时候表示最小值,然后res把每一轮动态规划的最大值记录下来,直到DP结束。所以代码如下所示:

python:
class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if nums is None: 
            return 0
        dp = [[0 for _ in range(2)] for _ in range(2)]
        
        dp[0][0], dp[0][1], res = nums[0], nums[0], nums[0]
        
        for i in range(1, len(nums)):
            x, y = i % 2, (i - 1) % 2
            dp[x][0] = max(dp[y][0] * nums[i], dp[y][1] * nums[i], nums[i])
            dp[x][1] = min(dp[y][0] * nums[i], dp[y][1] * nums[i], nums[i])
            res = max(res, dp[x][0])
            
        return res

除了这种写法,我们可以把代码更加简化:

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if nums is None: 
            return 0
        res, curMin, curMax = nums[0], nums[0], nums[0]
        
        for i in range(1, len(nums)):
            curMin, curMax = curMin * nums[i], curMax * nums[i]
            curMin, curMax = min(curMax, curMin, nums[i]), max(curMax, curMin, nums[i])
            res = curMax if curMax > res else res
        return res

我们只需要将本轮的数据同上一轮的数据进行动态对话,那么就可以很容易解决这个问题,谢谢。

猜你喜欢

转载自blog.csdn.net/Oscar6280868/article/details/89598963
今日推荐