Javascript每天一道算法题(十三)——最大子数组和_中等

文章目录


动态规划题三个重要步骤(了解思路)

(1)定义数组元素的含义

用一个数组来保存历史数组。

(2)找出数组元素直接的关系式(状态转移方程)

动态规划的题,就是把一个规模比较大的问题分成几个规模比较小的问题,然后由小的问题推导出大的问题。

常见情况下,如上题中nums[start] 和nums[item] 肯定存在某种关系。我们可以从最后一步、倒数第二步等方面入手分析。

(3)找出初始值

动态规划类似于数学归纳法,我们需要知道初始值,才能不断地推下去。如该题的-2开始。


1、问题

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

2、示例

示例 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

3、解决方法

(1)方法1------动态规划

// 说实话,第一次用动态规划的方法写上面代码有点懵,直接debugger看看

// [-2,1-3]中最大的是1,那么就不会加上-2和-3这两个值,返回的maxArray就是1

// [-2,1-3,4]中最大的是4,而4-3+1大于1,但是比4本身小,返回的maxArray就是4,而不是4-3+1 =2

// [-2,1-3,4,-1]中最大的是4,而4+ -1 小于4,返回的maxArray就还是4

// [-2,1-3,4,-1,2]中最大的是4,而4-1+2大于4,返回的maxArray就是5

// [-2,1-3,4,-1,2,1]中最大的是4,而4-1+2+1大于5,返回的maxArray就是6

// 后面的就都不比当前的值大,就直接返回了6,这么看是不是清晰了点

javascript 复制代码
let nums =  [-2,1,-3,4,-1,2,1,-5,4]
var maxSubArray = function(nums) {
    // 1-1: 定义一个用来维护当前遍历数据的值
    let start = 0;
    // 1-2: 要返回的和最大数组值
    let maxArray = nums[0]
    nums.forEach(item => {
        // 2:将起始值和当前值累加与当前值对比获取最大值给起始值
        start = Math.max(start+item, item)
        // 3: 将起始值和最大值进行对比
        maxArray = Math.max(start, maxArray)
        // 4:遍历后获取n和n+1相加后都是最大的那个值
    });
    // 5:返回数据
    console.log('maxArray', maxArray);
};
maxSubArray(nums);

总结

难度:中等(以前是简单的难度)

重点:了解动态规划的解题思路。

相关推荐
陌夏1 分钟前
快速排序 (Quick Sort)
算法
IronMurphy11 分钟前
【算法二十九】 437. 路径总和 III
算法·深度优先
jinanwuhuaguo12 分钟前
OpenClaw安全使用实践全景深度指南:从“裸奔龙虾”到“可信数字堡垒”的体系化构建
开发语言·php
2501_9083298512 分钟前
C++安全编程指南
开发语言·c++·算法
计算机安禾15 分钟前
【C语言程序设计】第39篇:预处理器与宏定义
c语言·开发语言·c++·vscode·算法·visual studio code·visual studio
巧妹儿16 分钟前
Python 配置管理封神技:pydantic_settings+@lru_cache,支持优先级,安全又高效,杜绝重复加载!
开发语言·python·ai·配置管理
独隅20 分钟前
Python AI 全面使用指南:从数据基石到智能决策
开发语言·人工智能·python
m0_5698814726 分钟前
C++中的装饰器模式变体
开发语言·c++·算法
笒鬼鬼27 分钟前
【API接口】最新可用红果短剧接口
算法·api·笒鬼鬼·红果短剧·接口源码
weixin_4219226928 分钟前
C++与边缘计算
开发语言·c++·算法