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
python
动态规划
def maxSubArray(nums):
n = len(nums)
if n == 0:
return 0 # 空数组的最大子数组和为0
dp = [0] * n # 创建一个长度为n的数组来保存动态规划的状态
dp[0] = nums[0] # 第一个元素作为初始值
for i in range(1, n):
dp[i] = max(nums[i], nums[i] + dp[i - 1])#计算以索引 i 结尾的子数组的最大和,即 dp[i]。这个值可以通过比较当前元素 nums[i] 和当前元素与前一个子数组的和 nums[i] + dp[i - 1] 的大小,取较大值作为 dp[i] 的值。
res = float('-inf') # 初始化结果为负无穷
for i in range(n):
res = max(res, dp[i]) # 更新最大和的结果
return res
优化
def maxSubArray(nums):
n = len(nums)
if n == 0:
return 0 # 空数组的最大子数组和为0
dp_0 = nums[0] # 初始化动态规划的状态,第一个元素作为初始值
dp_1 = 0
res = dp_0
for i in range(1, n):
# dp[i] = max(nums[i], nums[i] + dp[i-1])
dp_1 = max(nums[i], nums[i] + dp_0)
dp_0 = dp_1
# 同时计算最大的结果
res = max(res, dp_1)
return res
JavaScript
前缀和+暴力
- 思想:算出每个元素的前缀和,遍历所有可能的子数组,取最大
var maxSubArray = function(nums) {
// 初始化最大子数组和为负无穷,以便处理所有元素为负的情况
let max = -Infinity;
// 创建前缀和数组,长度比 nums 长 1,以便处理从头开始的子数组
let pre = new Array(nums.length + 1).fill(0);
// 计算前缀和
for (let i = 0; i < nums.length; i++) {
pre[i + 1] = pre[i] + nums[i]; // pre[i + 1] 表示前 i 个元素的和
}
// 遍历所有可能的子数组
for (let i = 1; i <= nums.length; i++) { // i 从 1 开始到 nums.length
for (let j = 0; j < i; j++) { // j 从 0 到 i - 1
// 计算当前子数组和 pre[i] - pre[j],并更新最大值
max = Math.max(max, pre[i] - pre[j]);
}
}
return max; // 返回找到的最大子数组和
};
- 超出时间限制
动态规划
var maxSubArray = function(nums) {
// 初始化当前子数组和 pre 为 0
let pre = 0;
// 初始化最大子数组和 maxAns 为数组的第一个元素
let maxAns = nums[0];
// 使用 for 循环遍历数组中的每个元素
for (let i = 0; i < nums.length; i++) {
// 更新当前子数组和 pre
// 如果 pre + nums[i] 小于 nums[i],则从 nums[i] 开始新的子数组
pre = Math.max(pre + nums[i], nums[i]);
// 更新最大子数组和
maxAns = Math.max(maxAns, pre);
}
// 返回找到的最大子数组和
return maxAns;
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了