leetcode-53-Maximum Subarray(动态规划详解)
题目描述:
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(动态规划详解)的更多相关文章
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- [array] leetcode - 53. Maximum Subarray - Easy
leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...
- Leetcode#53.Maximum Subarray(最大子序和)
题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大. 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] ...
- LN : leetcode 53 Maximum Subarray
lc 53 Maximum Subarray 53 Maximum Subarray Find the contiguous subarray within an array (containing ...
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
- 41. leetcode 53. Maximum Subarray
53. Maximum Subarray Find the contiguous subarray within an array (containing at least one number) w ...
- leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) whic ...
- LeetCode 53. Maximum Subarray(最大的子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- C#解leetcode 53.Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
随机推荐
- INFO: Font Metrics and the Use of Negative lfHeight
INFO: Font Metrics and the Use of Negative lfHeight Print Email Article translations Article ID ...
- 如何查看Ext自带的API和示例
Ext是一款富客户端开发框架,它基于JavaScript.HTML和CSS开发而成,无须安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 1.下载地址http://www.sencha.com/p ...
- [CENTOS7] [IPTABLES] 卸载Firewall Id安装 IPTABLES及防火墙设置
卸载Firewall ID,重装IPTABLES:先停止服务 systemctl stop firewalldsystemctl mask firewalld yum install iptabl ...
- [VS2008] [.NET 3.5] 如何解决 The imported project "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.CSharp.targets" was not found
重新安装或者修复 NETCFv35PowerToys https://download.microsoft.com/download/f/a/c/fac1342d-044d-4d88-ae97-d27 ...
- [转]CentOS7增加或修改SSH端口号
前言:开启某服务或软件的端口,要从该服务或软件监听的端口(多以修改配置文件为主),SeLinux和防火墙(FireWall)的安全策略下手.如果使用阿里云,腾讯等第三方服务器还需要对管理控制台的安全组 ...
- 如何在C++中动态建立二维数组(转)
http://blog.sina.com.cn/s/blog_7c073a8d0100qp1w.html http://blog.163.com/wujiaxing009@126/blog/stati ...
- Maven实战(八)pom.xml简介
目录 pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件.开发者需要遵循的规则.缺陷管理系统.组织和licenses.项目的url.项目的依赖 ...
- hdu2824 The Euler function(欧拉函数个数)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/36426357 题目链接:h ...
- 使用transient关键字解决ehcache序列化错误
使用Ehcache时发现个不起眼的小问题 在一个Model中有以下代码: public class MyModel implements Serializable { private static f ...
- css自问自答(一)
css自问自答(一) 1.块级元素和行内元素特性与区别? 块级:display:block <div>.<p>.<h1>...<h6>.<ol&g ...