美文网首页
Maximum Subarray 和 Maximum Produ

Maximum Subarray 和 Maximum Produ

作者: 今天训练明天验证 | 来源:发表于2018-11-17 13:28 被阅读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
    

    相关文章

      网友评论

          本文标题:Maximum Subarray 和 Maximum Produ

          本文链接:https://www.haomeiwen.com/subject/aoubfqtx.html