版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Oscar6280868/article/details/89598963
这道题目是给定一个整数数组,返回乘积最大的连续子序列,题目如下所示:
拿到题目我们肯定会想到的是暴力解法,通过两层循环遍历数组中所有的元素,记录每一次循环之后的全局乘积最小值,直到循环结束,我们就可以得到乘积最大的连续子序列,显然这样的解法时间复杂度达到了
。
除了暴力的解法,我们可以想一下是否可以用动态规划DP的方法来解决此问题,那么如何DP呢?我们来看以下的这个流程:
以题目中的例子为例,我们来看看这个案例的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
我们只需要将本轮的数据同上一轮的数据进行动态对话,那么就可以很容易解决这个问题,谢谢。