Maximum Subarray 和 Maximum Produ

2018-11-17  本文已影响0人  今天训练明天验证

题目1链接
题目2链接

题意
  1. 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
  2. 给定一个整数数组 nums ,找到一个具有最大乘积的连续子数组(子数组最少包含一个元素),返回其最大乘积。
注意点

如何以\Theta(n)的复杂度求解它们?

解答

两个问题的题干相似,且都是动态规划问题,但具体过程很不一样。

Maximum Subarray

dp[x]:以元素nums[x]为开头的连续子数组的最大和;只要选出了最佳的x使得dp[x]最大,问题也就解决了。
dp[y]=dp[x]+\sum_{i=x}^{y-1} \ nums[i],如果等式右边第二项大于或等于零,则y比x更优。
实现细节
 设置变量start = 0,它代表我们最初选定的开头;temp = nums[0];index从1遍历到 len(nums)-1,这是寻找最优开头的过程;temp代表dp[index]-dp[start],如果 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
上一篇下一篇

猜你喜欢

热点阅读