Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

53. 最大子序和

https://leetcode-cn.com/problems/maximum-subarray/

题目描述

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

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

解题思路

动态规划

1、构造问题过程?

引理1: 以负数开头的子序列不会是最大子序列。 (如果数组所有字段均为负值时, 取最大负数作为结果)

引理2:对子序列 {ai, ..., aj} , 如果该子序列满足两个条件: 如果对x取 [i, j) 中的任意整数(包含i,不包含j) sum{ai, ..., ax} >0. sum{ai, ..., aj}<0. 则以该子序列中的任何元素ap开头的以aj为终结的任意子序列的和必定小于0。 (例如1,2,-1,3,-100000)

2、思考过程的最后一个步骤,看看有哪些选择情况。 以题目例子,[-2,1,-3,4,-1,2,1,-5,4] ai...an, i = 0, n = 9

定义maxNum(i)函数,返回截止索引i的最大子序列和 maxNum(n-1)的结果, 是maxNum(n-1)+a[n]与maxNum(n-1)的较大者 即 maxNum(i) = max(maxNum(i - 1) + a[i], maxNum(i - 1)), i >=1

从左往右推导 maxNum(0) = -2 maxNum(1) = max(-2 + 1, 1) = 1 maxNum(2) = max(1 - 3, -3) = -2 maxNum(3) = max(-2 + 4, 4) = 4 maxNum(4) = max(-1 + 4, -1) = 3 maxNum(5) = max(2 + 3, 2) = 5 maxNum(6) = max(1 + 5, 1) = 6 maxNum(7) = max(6 - 5, -5) = 1 maxNum(8) = max(1 + 4, 4) = 5