前言
- 最近开始在leetcode上接触算法题,印象中的算法题大都是用cpp或者java解的,而这个网站支持javascript解题提交。因为大学也没学过算法,数据结构也只是稍微了解,所以解题目标也是选简单经典的题。下面开始讲解这道题–53.Maximum Subarray.题目地址
题目描述
- 给出一个由数字组成(含负数)的数组,找出它的一个每项相加之和最大的子数组,返回这个最大和数字。举例:给出一个数组
[-2,1,-3,4,-1,2,1,-5,4]
, 每项和最大的子数组为[4,-1,2,1]
,返回最大和数字6。解题思路
- 首先抛出一个名词动态规划算法,概念理解起来较为抽象,我个人的理解是求最优解的题基本都可以用动态规划作为解题思路。
- 首先可以确定解题的复杂度,这里其实只要遍历一次数组即可,时间复杂度为O(n),而需要维护的状态变量有两个,全局最大值和局部最大值。就是随着从第一项开始往后推进,你需要确定从第一项到第n项时已经出现的元素组成的最大和,这个状态变量就是全局最大值;而局部最大值是遍历到第n项时,包含第n项的情况下的最大值。全局最大值是由局部最大值推导出的,下面是具体代码:123456789101112131415/*** @param {number[]} nums* @return {number}*/var maxSubArray = function(nums) {if(!nums.length)return 0let local = nums[0]let global = nums[0]for (let i = 1; i < nums.length; i++) {local = Math.max(nums[i], local + nums[i]) // 包含第n项的情况下的最大值global = Math.max(local, global) // 全局最大值}return global};