题目
给你一个整数数组
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
进阶:如果你已经实现复杂度为 O(n)
的解法,尝试使用更为精妙的 分治法 求解。
解题思路
法一:动态规划(执行用时:140ms,内存消耗:21.6MB)
动态规划中需要明确dp数组所存储元素的意义,即dp[i]存储的不是从0到 i 这个范围内所得到的最大的连续子数组的和,而是以 nums[i] 为结尾的子数组所能达到的最大的和。
为了节约不必要的空间开销,可以将 nums[i] 看成我们的dp数组。整体思路就是先设定一个初始值 res = nums[0],然后将nums数组从1到 len(nums) 进行迭代,每一步对以前面一个元素为结尾的连续序列的最大值 + 当前元素值 和当前元素值进行比较,将较大的一方记录在当前位置(即nums[i] = max(nums[i