LeetCode-P53题解【动态规划】
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/
题目出处:
https://leetcode.com/problems/maximum-subarray/description
题目描述:
找出连续子区间最大和,至少包含一个数
例如:[-2,1,-3,4,-1,2,1,-5,4],则子区间[4,-1,2,1]有最大和为6
输入:
[-2,1,-3,4,-1,2,1,-5,4]
思路分析:
解法一:
如上图P1.1:
最优解一定为一段连续的区间,则可以有O(n*n)的解法,即遍历所有的区间找出最大值
设sum[i]为区间[1,i]的和,初始化处理
最优解=max(sum[i]-sum[j]), (0<=i,j<n)
解法二:
假设最大区间和为上图红色区域,可以看出,点i一定是该区间最右边节点;
图P1.2
设f[i]为以i结尾的最大连续区间和
为什么一定要以i结尾?
因为f[i]为一维数组,不加这个条件,则f[i]无法表示出前面的状态,只知道前i个节点的最优解,但不知道最优解从哪里开始
如果已经求出i个节点的最大区间和,则增加一个节点i+1时,前i+1个节点的最优解只有两种情况
1)i+1不在最优解区间中,这种情况和只有i个节点是一样的
2)i+1在最优解区间中, 这和情况i+1一定是最优解的最右边节点,又分两种情况
2-1) 前i个节点的最优解为负数,则舍弃前面的和,因为加上前面的和会更小
f[i+1]=f[i]+line[i+1]
2-2) 前i个节点的最优解为正数,则加上前面的和,因为加上前面的和会更大
f[i+1]=line[i+1]
最优解=max(f[i]), (0<=i<n)
注:每一个节点i只与之前的一个节点i-1相关,所以用滚动变量,空间复杂度为O(1)
C++源码如下:
github: https://github.com/Kyle-Wilson1/Leetcode/tree/master/P53
class Solution {
public: Solution() = default; static int maxOfTwo(int a, int b) {
return a > b ? a : b;
} int maxSubArray(vector<int> &nums) {
int pre = 0, now = 0, maxAnswer = -2147483647;
for (int num : nums) { if (pre > 0)
now = pre + num;
else
now = num;
maxAnswer = maxOfTwo(maxAnswer, now);
pre = now;
}
return maxAnswer;
}
};
LeetCode-P53题解【动态规划】的更多相关文章
- LeetCode OJ 题解
博客搬至blog.csgrandeur.com,cnblogs不再更新. 新的题解会更新在新博客:http://blog.csgrandeur.com/2014/01/15/LeetCode-OJ-S ...
- LeetCode总结 -- 一维动态规划篇
这篇文章的主题是动态规划, 主要介绍LeetCode中一维动态规划的题目, 列表如下: Climbing StairsDecode WaysUnique Binary Search TreesMaxi ...
- Leetcode 简略题解 - 共567题
Leetcode 简略题解 - 共567题 写在开头:我作为一个老实人,一向非常反感骗赞.收智商税两种行为.前几天看到不止两三位用户说自己辛苦写了干货,结果收藏数是点赞数的三倍有余,感觉自己的 ...
- LeetCode初级算法--动态规划01:爬楼梯
LeetCode初级算法--动态规划01:爬楼梯 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
- LeetCode 算法题解 js 版 (001 Two Sum)
LeetCode 算法题解 js 版 (001 Two Sum) 两数之和 https://leetcode.com/problems/two-sum/submissions/ https://lee ...
- [LeetCode]Longest Palindromic Substring题解(动态规划)
Longest Palindromic Substring: Given a string s, find the longest palindromic substring in s. You ma ...
- leetcode & lintcode 题解
刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...
- LeetCode一句话题解
深度优先搜索 人生经验 1. 需要输出所有解.并由于元素集有重复元素,要求返回的结果需要去重的情况,可考虑使用值对应数量的map,然后分别考虑依次取不同数量该值的可能. LeetCode39 题目:给 ...
- [leetcode] 位操作题解
子集 题目[78]:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [ ...
- LeetCode 中等题解(1)
16 最接近的三数之和 Question 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和. ...
随机推荐
- Another MySQL daemon already running with the same unix socket. & ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
mysql 断电后启动失败解决 应该是mysql.sock文件还存在. 把这个文件删掉就可以了. mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.s ...
- 图解Janusgraph系列-图数据底层序列化源码分析(Data Serialize)
图解Janusgraph系列-图数据底层序列化源码分析(Data Serialize) 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步 ...
- 5. 穿过拥挤的人潮,Spring已为你制作好高级赛道
目录 ✍前言 版本约定 ✍正文 默认转换器注册情况 StreamConverter 代码示例 使用场景 兜底转换器 ObjectToObjectConverter part1:快速返回流程 part2 ...
- AndroidSDK安装选项说明
前言:本文的目的在于了解AndroidSDK相关安装选项,正确根据自身需要选择性安装,避免安装过多无用的东西导致硬盘爆满. 1. AndroidSDK安装选项说明,如上图. 2. 实际游戏打包使用到A ...
- list转long[]数组
//list转long数组List<Long> list = new ArrayList<>(); Long[] skuIds = list.toArray(new Long[ ...
- 如何把 Next.js 项目部署到服务器?
Next.js 是什么? Next.js 是一个用于 生产环境的 React 框架.Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验:包括静态及服务器端融合渲染. 支持 TypeScr ...
- GraduateDesign-给APP添加获取位置信息和天气预报的功能(json)
首先,我的app需要通过网络来获取当前所在的位置.这里我找到了一个json来获取本地位置信息. http://int.dpool.sina.com.cn/iplookup/iplookup.php?f ...
- CentOS 搭建 SVN 服务器 及使用教程
服务器与客户端 1.搭建SVN服务器 ① CentOS安装SVN 命令: yum -y install subversion 检查是否安装成功 命令: svn --version 如果显示如下内容说明 ...
- Io流阶段大总结
字节流结构 输入流: ObjectInputStream:从文件中读取对象 FileInputStream:从文件中输入(读)字节 BufferedInputStream:底层有缓冲数组,在不定义数组 ...
- 设计模式之SOLID原则
介绍 设计模式中的SOLID原则,分别是单一原则.开闭原则.里氏替换原则.接口隔离原则.依赖倒置原则.前辈们总结出来的,遵循五大原则可以使程序解决紧耦合,更加健壮. SRP 单一责任原则 OCP 开放 ...