题目
给你一个整数数组 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
思路:动态规划
- 用dp数组记录上一次优化的结果
- 每次都
dp[i - 1] + 当前值与当前值(如果是负数就得重来)的最大值
function maxSubArray(nums: number[]): number {
let max = nums[0];
const dp = [max];
for(let i = 1; i < nums.length; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i])
if(max < dp[i]){
max = dp[i]
}
}
return max;
};
复杂度分析
时间复杂度分析:
- 在这段代码中,有一个循环用于遍历数组的元素,所以它的时间复杂度为 O(n),其中 n 是数组的长度。
空间复杂度分析:
- 这段代码使用了一个辅助数组
dp来保存以每个位置结尾的连续子数组的最大和。因此,辅助数组dp的长度与原始数组的长度相同,所以它的空间复杂度也是 O(n)。
综上所述,这段代码的时间复杂度为 O(n),空间复杂度为 O(n)。