python求最大连续子数组
寻找最大子数组问题:
给定数组A:寻找A中的和最大的非空连续子数组。我们称这样的连续子数组为最大子数组(maximum subarray)
1、暴力求解:两个循环,时间复杂度为O(n^2)
2、用分治策略的求解方法:
假定我们要寻找子数组A[low...high]的最大子数组。使用分治技术意味着我们要将子数组划分为两个规模尽量相等的子数组。也就是,找到子数组的中央位置,比如mid,然后考虑求解两个子数组A[low...mid]和A[mid+1...high]。A[low...high]的任何连续子数组A[i ...j]所处的位置必然是一下三种情况之一:
1.完全位于子数组A[low...mid]中,因此low<=i<=j<=mid
2.完全位于子数组A[mid+1...high]中,因此mid<i<=j<=high
3.跨越了中点,因此low<=i<=mid<j<=high
我们可以递归地求解A[low...mid]和A[mid+1...high]的最大子数组。剩下的全部工作就是寻找跨越中点的最大子数组,然后在三种情况中选取最大者。
时间复杂度为O(n)。
分治法python求解如下:
def max_cross_subarray(low, mid, high, array):max_low, max_high = low, highleft_sum = float("-inf")sum = 0for i in range(mid, low-1, -1):sum += array[i]if sum > left_sum:left_sum = summax_low = iright_sum = float("-inf")sum = 0for j in range(mid+1, high + 1):sum += array[j]if sum > right_sum:right_sum = summax_high = jmax_sum = left_sum + right_sumreturn(max_low, max_high, max_sum)
def max_subarray(array, low, high):mid = (low + high)//2if low == high:return(low, high, array[low])else:#完全位于子数组A[low...mid]中(left_low, left_high, left_max) = max_subarray(array, low, mid)#完全位于子数组A[mid+1...high]中(right_low, right_high, right_max) = max_subarray(array, mid+1, high)#跨越了中点(mid_low, mid_high, mid_max) = max_cross_subarray(low, mid, high, array)#比较三种情况的最大值,求整体最大值if left_max > right_max and left_max > mid_max:max_sum = left_maxsub_low = left_lowsub_high = left_highelif right_max > left_max and right_max > mid_max:max_sum = right_maxsub_low = right_lowsub_high = left_highelse:max_sum = mid_maxsub_low = mid_lowsub_high = mid_highreturn(sub_low, sub_high, max_sum)
#test
if __name__ == '__main__':array = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7,]max = max_subarray(array, 0, len(array)-1)print(max)
#output
#(7,10,43)
python求最大连续子数组相关推荐
- sscanf 连续相同编辑符_基于单调栈的滑动窗口法求解“和至少为 K 的最短连续子数组”...
题目解读 题目要求我们给出一个最短的连续子数组,且这个子数组的和要大于等于 K.乍一看,除了暴力,似乎没什么思路.由于数组规模为 50000,暴力肯定会超时的.但是,我们还是要先暴力一把,看看有什么灵 ...
- 查找数组连成环形的和最大的连续子数组
思路: 把每一种起点情况下的最大子数组之和S求出,存入S[]数组中,最后比较S[]中的最大值(i为数组的长度)存为MaxSum.而此时的起点-finalStart和终点-finalEnd也同样可以在求 ...
- 算法学习-零子数组,最大连续子数组
题目 对于长度为N的数组A,求连续子数组的和最接近0的值. 如: 数组A:1,-2,3,10,-4,7,2,-5 它是所有子数组中,和最接近0的是哪个? 算法流程 申请比A长1的空间sum[-1,0, ...
- 牛客网:乘积为正数的最长连续子数组
1.非环形 注意审题!! 这里是求连续最长乘积为正数的长度是多少,我们维护两个长度,一个pos一个neg,pos代表到当前这个数为止的最长正数乘积,neg代表到当前这个数为止的最长负数乘积,我们对每个 ...
- LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)
581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...
- 581. 最短无序连续子数组
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 请你找出符合题意的 最短 子数组,并输出它的长度. 示例 1: 输入:nums ...
- 数组中最大连续子数组和,最大连续子数组积,最大递增子序列
最大连续子数组和: 递推式:curmax=max(a[i],curmax) 其中curmax是以i为结尾(意思必须取到a[i])和的最大值,其中每次循环比较curmax和已经保存最大值 最大连续 ...
- 【LeetCode】【HOT】581. 最短无序连续子数组
[LeetCode][HOT]581. 最短无序连续子数组 文章目录 [LeetCode][HOT]581. 最短无序连续子数组 package hot;public class Solution58 ...
- Leetcode 581.最短无序连续子数组
最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, ...
最新文章
- linux驱动:音频驱动(四)ASoc之machine设备
- opengl 粒子按轨迹运动_袁讲经典4:一个粒子在电场中的运动轨迹相关问题
- apache代理时java获取IP的问题
- 一个web项目在myeclipse中add deployment时无法被识别出来的原因
- python字典dragonloot_Python 字典与列表使用实例
- Spring Security使用出现 Encoded password does not look like BCrypt异常的解决以及Spring Securit加密方式的学习
- python怎么创建函数_Python创建与调用函数
- mvn本地库导入jar包
- 个元素前面 个元素放在第i 链表将第j_彻底理解链表中为何使用二级指针或者一级指针的引用...
- Python存储和读取数据
- mysql 横向分表_mysql横向和纵向的数据库分表
- 关于Spring MVC 文件大小超过限制后浏览器无响应解决方案
- s7epaapi.dll 64位下载 附找不到文件的修复教程
- requireJS 加载css、less文件
- 初识ElasticSearch(5) -批量操作之bulk | 条件查询 | 其它查询
- 基于S32K148快速调试TJA1101
- 华硕a43s遇到的问题总结
- 犀牛视频下载器丨钜惠惊喜不断
- Properties类的load方法
- 大乐透号码生成器python_python随机生成 双色球 大乐透