本文为Python算法题集之一的代码示例
题目53:最大子数组和
说明:给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
-
1 <= nums.length <= 105
-
-104 <= nums[i] <= 104
- 问题分析
- 本题为求数组中的子数组的最大和
- 主要的计算为2个,1子数组遍历,2子数组求和
- 基本的遍历为双层循环,双层循环遍历子数组,每个子数组求和一次,所以基本的时间算法复杂度为(On2)
- 优化思路
-
减少循环层次
-
减少计算类别
-
通过动态规划分析最优路径
- 前缀和之差(第1到第n的累加为前缀和,前缀和之间的差为两个元素之间子数组的和)
- 递归思路,第n个元素为止的最大和,为之前的最大和max_n与包含元素n的子数组最大和【max(premax+元素n、元素n)】中最大者
CheckFuncPerf
是我写的函数用时和内存占用模块,地址在这里:Python算法题集_检测函数用时和内存占用的模块【自搓】- 测试的超时测试用例文件是官网的,已上传到CSDN,地址在这里:力扣算法题:最大子数组和测试用例,用于测试超时,数组长度21808(估计是2月1日过审)
-
标准求解,双层循环,超时失败
import CheckFuncPerf as cfp def maxSubArray_base(nums): if len(nums) == 1: return nums[0] imaxsum, ileftsum = nums[0], nums[0] for iIdx in range(len(nums)-1): ileftsum += nums[iIdx] irightsum = 0 for jIdx in range(iIdx+1, len(nums)): irightsum += nums[jIdx] if ileftsum > 0: if ileftsum+irightsum > imaxsum: imaxsum = ileftsum+irightsum else: if irightsum > imaxsum: imaxsum = irightsum return imaxsum testcase_big = open(r'testcase/hot13_big.txt', mode='r', encoding='utf-8').read().replace('[', '').replace(']',