Maximum Subarray 和 Maximum Produ
2018-11-17 本文已影响0人
今天训练明天验证
题意
- 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
- 给定一个整数数组 nums ,找到一个具有最大乘积的连续子数组(子数组最少包含一个元素),返回其最大乘积。
注意点
如何以的复杂度求解它们?
解答
两个问题的题干相似,且都是动态规划问题,但具体过程很不一样。
Maximum Subarray
设以元素nums[x]为开头的连续子数组的最大和;只要选出了最佳的使得最大,问题也就解决了。
,如果等式右边第二项大于或等于零,则y比x更优。
实现细节:
设置变量start = 0,它代表我们最初选定的开头;temp = nums[0];index从1遍历到 len(nums)-1,这是寻找最优开头的过程;temp代表,如果 temp 小于零,说明index作为开头比start更优秀,应将 start 改为 index,temp置为nums[index],否则说明 index 不如 start:temp加上nums[index],跳过index,寻找下一个潜在的更优的开头。当然别忘了保存循环中最大的 temp 值,这就是连续子序列的最大和。
Maximum Product Subarray
假设有这样一个函数 fun(start),返回2个值:以start为开头的连续子数组的最大积(必须大于零,不存在则设为None)和最小积(必须小于零,不存在则设置为None)。
如果我们已经有了 fun(x+1) 的返回值,那求解fun(x)岂不是很容易?按照nums[x] 的正负情况分 3 类讨论即可,须注意的是如果nums[x]为0,则fun(x)返回[1,None]。
找到 t 使 fun(t) 的第一个返回值最大,那个值即为所求。
Python代码
1
class Solution:
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = nums[0]
idx = 1
#start = None
te = nums[0]
while idx < len(nums):
if te < 0:
te = 0
te += nums[idx]
res = max(res, te)
idx += 1
return res
2
class Solution:
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
temp1 = 1
temp2 = None
res = nums[-1]
for idx in range(len(nums)-1,-1,-1):
if nums[idx] != 0:
if temp1 and temp2:
t1 = max(temp1*nums[idx], temp2*nums[idx])
t2 = min(temp1*nums[idx], temp2*nums[idx])
temp1,temp2 = t1,t2
elif temp1 and not temp2:
if nums[idx] > 0:
temp1 *= nums[idx]
else:
temp2 = temp1*nums[idx]
temp1 = None
elif not temp1 and temp2:
if nums[idx] > 0:
temp2 *= nums[idx]
temp1 = nums[idx]
else:
temp1 = temp2*nums[idx]
temp2 = nums[idx]
else:
temp1 = 1
temp2 = None
res = max(0,res)
continue
if temp1:
res = max(res, temp1)
return res