• 求数值数组中连续和最大的子数组


    1.分析

      首先,这样的数组一定是有正负数组成的,这样问题才有意义。要求解这个问题,可以使用分治思想将所求问题的规模变小,通过求解子问题的解来最终得到所求问题的解,显然每个子问题和原问题相同,可以用递归来进行求解。

    我们知道,通过将数组一分为二后,最大子数组有以下三种位置:

    • 存在于左子数组中
    • 存在于右子数组中
    • 跨越中点,存在于左右两个子数组中

    2.使用递归进行求解

     1 def findMaxCrossSubarray(L,low,mid,high):
     2     left_sum = -float("inf")
     3     Sum = 0
     4     for i in range(mid,low -1,-1):
     5         Sum = Sum + L[i]
     6         if Sum > left_sum:
     7             left_sum = Sum
     8             left_max = i
     9 
    10     right_sum = -float("inf")
    11     Sum = 0
    12     for j in range(mid+1,high+1):
    13         Sum = Sum + L[j]
    14         if Sum > right_sum:
    15             right_sum = Sum
    16             right_max = j
    17 
    18     return (left_max,right_max,left_sum + right_sum)
    19 
    20 
    21 
    22 def findMaxSubarray(L,low,high):
    23     if low == high:
    24         return (low,high,L[low])
    25     else:
    26         mid = (low + high) / 2
    27         (left_i,left_j,left_sum) = findMaxSubarray(L,low,mid)
    28         (right_i,right_j,right_sum) = findMaxSubarray(L,mid+1,high)
    29         (cross_i,cross_j,cross_sum) = findMaxCrossSubarray(L,low,mid,high)
    30 
    31         if left_sum >= right_sum and left_sum >= cross_sum:
    32             return (left_i,left_j,left_sum)
    33         elif right_sum >= left_sum and right_sum >= cross_sum:
    34             return (right_i,right_j,right_sum)
    35         else:
    36             return (cross_i,cross_j,cross_sum)
    37 
    38 if __name__ == "__main__":
    39     L = [3,-2,8,-3,-5,3]
    40     low = 0
    41     high = len(L) - 1
    42     print findMaxSubarray(L,low,high)

    参考:算法导论(p40)



    3. 最优解法

      要求最大连续和最大的子数组和,我们的第一个元素必须要大于0

    def FindMaxSubarray(L):
        lenght = len(L)
        Max_subarray_value = 0
        current = 0
        for item in L:
            current += item
            if current > 0:
    
                if current > Max_subarray_value:
    
                    Max_subarray_value = current
            else:
                current = 0
    
        return Max_subarray_value
    
    if __name__ == "__main__":
        L = [-1,2,-1,3]
        print FindMaxSubarray(L)
  • 相关阅读:
    【JBPM4】创建流程实例
    【JBPM4】流程部署
    Table上下滚动
    oracle 导入dmp文件
    Win7下安装Oracle 10g
    【Hibernate3.3复习知识点二】
    通过IP地址和子网掩码计算主机数
    vue.js知识总结
    vue生产环境部署总结
    移动端上遇到的各种坑与相对解决方案
  • 原文地址:https://www.cnblogs.com/lpworkstudyspace1992/p/7743405.html
Copyright © 2020-2023  润新知