【LeetCode】Maximum Subarray(最大子序和)
这道题是LeetCode里的第53道题。
题目描述:
给定一个整数数组
nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
简单的动态规划题,如果之前接触过动态规划的话很容易得出答案,没有的话估计得想一阵子。
不多废话,我先介绍一下什么是动态规划吧:动态规划(Dynamic Programming)是一种分阶段求解决策问题的数学思想。总的来说就是“大事化小,小事化了”。
动态规划中包含的三个重要概念:
- 最优子结构
- 边界
- 状态转移方程
就拿这道题目来说,假设输入[-2,1,-3,4,-1,2,1]数组,要求其连续子数组的最大和。那它的最优子结构是什么?注意到题目要求的是连续子数组最大和。既然这样,那么求[-2,1,-3,4,-1,2,1]的连续子数组的最大和,去掉其最后一位,就可以转为求[-2,1,-3,4,-1,2]的连续子数组的最大和,因为这样可以保证它是连续的。而求[-2,1,-3,4,-1,2]的连续子数组的最大和,又是求[-2,1,-3,4,-1]的连续子数组的最大和。这样一步一步简化它。边界就是问题的范围,不可能是无穷大。这个题目的边界就是原数组的长度7。而状态转移方程呢?这是最难找的。在这里我们假设res变量保存结果即最大和,sum变量保存子结构的连续和。就拿这个例子来说。
第一步:sum<0,sum=1,sum>res→res=sum=1(sum初值为-2,res初值为0)
第二步:sum>0,sum=sum+(-3)=-2,sum<res→res=res=1
第三步:sum<0,sum=4,sum>res→res=sum=4
第四步:sum>0,sum=sum+(-1)=3,sum<res→res=res=4
第五步:sum>0,sum=sum+2=5,sum>res→res=sum=5
第六步:sum>0,sum=sum+1=6,sum>res→res=sum=6
到达边界结束
代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = nums[0];
int sum = 0;
for(int num : nums){
if(sum > 0)sum += num;
else sum = num;
res = res>sum?res:sum;
}
return res;
}
};
第六行的代码是一个迭代器遍历,对于数组来说,等同于
for(int i=0;i<nums.length;i++){
int num=nums[i];
......
}
运行结果:
个人总结:
第一次正式接触动态规划题目,感觉动态规划题是我的短板,需要多加练习。这次也学到了新语法。
【LeetCode】Maximum Subarray(最大子序和)的更多相关文章
- 【LeetCode】53. Maximum Subarray 最大子序和 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 动态规划 日期 题目地址: https:/ ...
- LeetCode 53. Maximum Subarray最大子序和 (C++)
题目: Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- 53. Maximum Subarray最大子序和
网址:https://leetcode.com/problems/maximum-subarray/submissions/ 很简单的动态规划 我们可以把 dp[i] 表示为index为 i 的位置上 ...
- 053 Maximum Subarray 最大子序和
给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大.例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4],连续子序列 [4,-1,2,1] 的和最大,为 ...
- [LintCode] Maximum Subarray 最大子数组
Given an array of integers, find a contiguous subarray which has the largest sum. Notice The subarra ...
- LEETCODE —— Maximum Subarray [一维DP]
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- LeetCode: Maximum Subarray 解题报告
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- [LeetCode]Maximum Subarray题解
Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) whic ...
随机推荐
- 单线程单元(STA)线程都应使用泵式等待基元
CLR 无法从 COM 上下文 0x20ad98 转换为 COM 上下文 0x20af08,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows ...
- linux增加系统监视器的快捷键
系统命令:gnome-system-monitor 可在终端输入调用 在系统相应的快捷键设置区设置即可
- 2018百度之星初赛(A)2 度度熊学队列
思路: 记录一下c++ stl中的双向链表list的各种用法. https://blog.csdn.net/fanyun_01/article/details/56881515 实现: #includ ...
- cf559C. Gerald and Giant Chess(容斥原理)
题意 $h \times w$的网格,有$n$个障碍点, 每次可以向右或向下移动 求从$(1, 1)$到$(h, w)$不经过障碍点的方案数 Sol 容斥原理 从$(1, 1)$到$(h, w)$不经 ...
- WEB 前端菜鸟,感觉很迷茫,该怎么做?
前几天看到这样的问题 先说问题吧:感觉前端涉及到的东西太多了,自己也很浮躁,看了挺多书,可是代码缺敲得却不多.技术菜,又什么都想学,比如现在纠结要不要先学scss或者php或者angularjs,ba ...
- Java之instanceof
class Base{ int x = 1; static int y = 2; String name(){ return "mother" ...
- 安装 Azure CLI
首先安装node 和 npm 的安装 官方推荐v4.4.4长期支持版 1.下载并解压 node-v4.4.4-linux-x64.tar.xz tar -xJf node-v4.4.4-linux-x ...
- Mybatis Cache 缓存策略
Mybatis Cache 缓存策略 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用 ...
- R文件报错的原因
一般R文件报错,无非是资源文件错误,图片命名错误,但是编译都会报错,可以很快解决.但是前几天,引入一个第三方aar包后,项目编译正确,但是就是R文件报错,找不到R文件,整个项目一片报红. 1)首先编译 ...
- Bootstrap历练实例:基本按钮组
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...