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

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)

 

转载于:https://www.cnblogs.com/lpworkstudyspace1992/p/7743405.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值