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;
};
posted @   Frommoon  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示