问题介绍
最大子数组问题:
给定一个整数数组nums,找到具有最大总和并返回其总和的连续子数组(包含至少一个数字)。
例:
123 输入: [ -2,1,-3,4,-1,2,1,-5,4],输出: 6说明: [4,-1,2,1]的最大和= 6。
思考
思路1:暴力解法:
两层遍历,外层遍历定位每个数字,内层遍历依次从本数字往后,计算sum,并与max_sum进行比较,如果sum > max_sum,则替换,并记下下标值。
思路2:分治法:
把原数组分解成左右两部分,一直递归下去,所以存在3种答案情况:
- 最大子数组在左侧
- 最大子数组在右侧
- 最大子数组横跨中间值(最小规模即2个数,即左右两数相加)
结果集数据结构
|
|
FIND_MAX_CROSSING_SUBARRAY
算法导论中将计算横跨左右的最大子数组算法单独列出来了:
FIND_MAX_SUBARRAY
分别查找数组左部,右部,横跨部分的最大子数组下标,以及总数,合并操作:
测试结果
|
|
|
|
递归过程
以上述实例为例: