题目描述:

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

要完成的函数:

int maxSubArray(vector<int>& nums)

说明:

1、这是一道动态规划的题目。如果我们不使用动态规划,可能就要找出所有的子数组,然后一一判断,这是一件很恐怖的事情。

2、我们先说一下这道题要怎么做,最后再来总结动态规划的本质。

我们要选一个sum最大的子数组,我们碰到一个新的数字,比如处理完-2之后现在碰到1这个新的数字,我们有两种选择:

一是,把1加入到旧有的子数组中,“延续”下来,现在新的sum为-2+1=-1。

二是,废弃掉旧有的子数组,重新开始,以1为第一个元素,现在新的sum为1。

那很明显,我们处理完元素-2现在在处理元素1,我们更想要重新开始,无论之后还有什么元素,重新开始都比加入之前旧有子数组的结果要好。

这是一个局部最优解。

之后我们继续处理下一个元素-3,我们同样有两种选择:

一是,-3加入旧有子数组,现在新的sum为1-3=-2。

二是,重新开始,-3作为第一个元素,现在新的sum为-3。

很明显,我们更想要一的做法,“延续”旧有的子数组。

我们依然得到了当前状态的最优解……

后续照这种做法去做就好了。

代码如下:

    int maxSubArray(vector<int>& nums)
{
int local=nums[];//存储每一个阶段的最优解
int global=nums[];//存储整个过程能得到的最大sum
for(int i=;i<nums.size();i++)//从i=1开始
{
local=max(local+nums[i],nums[i]);//选择要“延续”还是“重新开始”
global=max(global,local);
}
return global; }

上述代码实测13ms,beats 61.40% of cpp submissions。

对整个过程还不清晰的同学,不妨照着题目给的例子,自己写一遍程序运行结果,对整个过程会有更加清楚的认识。

3、动态规划的特性。

笔者也没有做过很多关于动态规划的题目,之前也只是接触过类似于viterbi这样的算法,这道题是第一次正儿八经的动态规划题。但我们仍可以管中窥豹,从中总结出动态规划的一些特性。

动态规划是单重循环,只需要从头到尾做一次遍历。

我们把一个过程分为多个阶段,比如题目给的例子,我们要处理的元素1是一个阶段,要处理的元素-3是一个阶段,要处理的元素4是一个阶段……

每个阶段可以由多个状态组成,比如我们要处理的元素1,第一个状态是加入到旧有的子数组,第二个状态是重新开始新的子数组。每个阶段都要选择一个新的状态,构成局部最优解。

我们从头到尾遍历了一遍,每一次都选择了每个阶段的局部最优解,最后我们得到的结果自然也是全局最优解。

关于时间复杂度和空间复杂度,动态规划远远优于“找到所有子数组,然后一一计算”的暴力解法。

假设我们有9个阶段,每个阶段2种状态。(题目给的例子)

使用动态规划算法,时间复杂度可以粗略认为是2+2+……+2+2=2*9=18;空间复杂度,每次只需要保存上一个阶段的局部最优解和当前全局最优解两个参数。

使用暴力解法,时间复杂度,必然要找出所有子数组,单个数字就有9种可能,2个数字的有8种可能,3个数字的有7种可能……已经远远超过动归的做法;空间复杂度方面也会超过动归的做法。

动态规划真是个有趣的算法……

leetcode-53-Maximum Subarray(动态规划详解)的更多相关文章

  1. 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略

    原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...

  2. [array] leetcode - 53. Maximum Subarray - Easy

    leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...

  3. Leetcode#53.Maximum Subarray(最大子序和)

    题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大. 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] ...

  4. LN : leetcode 53 Maximum Subarray

    lc 53 Maximum Subarray 53 Maximum Subarray Find the contiguous subarray within an array (containing ...

  5. leetcode 53. Maximum Subarray 、152. Maximum Product Subarray

    53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...

  6. 41. leetcode 53. Maximum Subarray

    53. Maximum Subarray Find the contiguous subarray within an array (containing at least one number) w ...

  7. leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法

    Maximum Subarray  Find the contiguous subarray within an array (containing at least one number) whic ...

  8. LeetCode 53. Maximum Subarray(最大的子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  10. C#解leetcode 53.Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

随机推荐

  1. is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

    出现此日志的原因: https://blog.csdn.net/m0_37962779/article/details/78605478 上面的博客中可能解决了他的问题,可我的项目是spring bo ...

  2. 2.Java英文缩写详解

    1.JVM 2.JDK JRE 3.Java SE EE ME 4.OO OOP 5.IOC 6.SQL 7.POJO 1.JVM:Java Virtual Machine(Java虚拟机)的缩写. ...

  3. UpdateServer事务实现机制

    UpdateServer(UPS) 是OceanBase的写入单点,一个集群中只有一台UPS服务器,所有的写都写入到这台机器.OceanBase采用基于静动态数据分离的机制,静态数据存储在静态数据服务 ...

  4. SQL点点滴滴_聪明的小写法(持续更新中)

    1.生成序列号 SELECT number + 1 ,number FROM master..spt_values WHERE type = 'P' ORDER BY number 说明: maste ...

  5. node环境和浏览器的区别

    一.全局环境下this的指向 在node中this指向global而在浏览器中this指向window,这就是为什么underscore中一上来就定义了一 root: 1 var root = typ ...

  6. sql标量函数与表值函数

    标量函数 ),)) returns int as begin return (select UserID from UserInfo where UserName=@UserName and User ...

  7. November 10th 2016 Week 46th Thursday

    Live like you were dying, love because you do. 生如将逝,爱自本心. When faced with our darkest hour, hope is ...

  8. Elementary Sorts

    初级排序 rules of the game 排序是很常见的需求,把数字从小到大排,把字符串按字典序排等等,目标是能对任何类型的数据进行排序,这可以通过回调(callback)实现: Java 用接口 ...

  9. 自定义ClassLoader

    自定义classloader MapleClassLoader package com.maple; import java.io.*; public class MapleClassLoader e ...

  10. 【转】Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...