以前刷leetcode都没记录过,感觉效果不大,因此在这里记录一下我的思路,希望能加深印象
题目如下:
给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
比较典型的动态规划问题吧。我的想法就是从头到尾扫一遍数组,在扫的过程中,记录下以当前这个位置的数结尾的连续子数组的最大乘积,然后和到从开始到当前这个位置的数组的最大连续子序列乘积比较,如果前者比较大,就更新最大连续子序列乘积。
不过在这个过程中,有一个问题就是符号问题,很可能会出现一个绝对值很大的负数,因为乘上一个负数,变成列一个很大打正数。为了解决这个问题,我选择记录下以当前位置结尾的连续子序列的最大乘积和最小乘积,然后下一个位置的最大乘积和最小乘积就可以根据上一个位置的最大乘积和最小乘积得到:
这样就可以得到最终的结果了。
最后附上代码,运行时间64ms。
class Solution:
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if(len(nums)==0):
return 0
min_product=nums[0]
max_product=nums[0]
max_res=nums[0]
for i in range(1,len(nums)):
tem_list=[min_product*nums[i],max_product*nums[i],nums[i]]
min_product=min(tem_list)
max_product=max(tem_list)
if(max_res<max_product):
max_res=max_product
return max_res