题目描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
限制
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
Leetcode链接:剑指offer面试题42:连续子数组的最大和
算法分析
动态规划解决本题
- 划分子问题:nums中连续子数组的最大和可以拆分成以nums[i]结尾的子数组的和的最大值。为了保证子数组的连续性,每次必须以nums[i]结尾,所以通过比较以nums[i-1]结尾的子数组的和是否大于0来判断dp[i-1]中的值是否应该舍弃,从而进行状态转移。
- 状态转移方程:dp[i] = max(dp[i-1], 0) + nums[i]
- 由于dp[i]只与dp[i-1]和nums[i]有关,所以dp[i]和dp[i-1]可以用两个变量来保存,这样可以将空间复杂度由O(n)降到O(1)。
复杂度分析
问题规模为数组中元素的个数n。
- 时间复杂度:O(