
[Easy] 53. Maximum Subarray
当i == 2时,nums[2] = -3。若dp[i-1]为正,nums[i]为负,此时应该令dp[i] = dp[i-1] + nums[i],所以此时最大子列和为-2。
综上,dp[i]的取值有两种情况: 1.如果dp[i-1] > 0:dp[i] = dp[i-1] + nums[i] 2.如果dp[i-1] < 0:dp[i] = nums[i] 翻译成代码为
发布日期:2021-05-07 18:21:07
浏览次数:24
分类:技术文章
本文共 1757 字,大约阅读时间需要 5 分钟。
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: 6Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
Solution
Brute Force
1712 ms 13.3 MB
遍历所有子列,找出最大值class Solution { public: int maxSubArray(vector & nums) { int ans = nums[0]; for(int i = 0; i < nums.size(); i++) { int sum = nums[i]; for(int j = i ; j < nums.size(); j++) { if(i == j) ans = max(ans,sum); else { sum+=nums[j]; ans = max(ans,sum); } } } return ans; }};
这种情况下时间复杂度为O(n2)。
DP
动态规划=解决子问题+利用子问题的结果。
这个问题的子问题就是求解:最大子列和。 我们利用一个数组dp[ ] 来记录以当前index为结尾的子列的最大和。下面逐步推导一下这个过程:
令dp[0] = nums[0],当i == 1时,nums[1] = 1。若dp[i-1]为负,nums[i]为正,此时应该令dp[i] = nums[i],所以此时最大子列和为1。

同理可得dp:

dp[i] = (dp[i - 1] > 0 ? (dp[i - 1] + nums[i]) : nums[i] )
class Solution { public: int maxSubArray(vector & nums) { int n = nums.size(); int* dp = new int[n]; dp[0] = nums[0]; int ans = dp[0]; for(int i = 1; i < n; i++){ dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0); ans = max(ans, dp[i]); } return ans; }};
可以发现使用DP后,时间复杂度降为O(n)
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月29日 10时29分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
redis 内存溢出_从数据存储的角度告诉你Redis为什么这么快!
2019-03-05
java gradle 目录_拆分Gradle中的所有输出目录
2019-03-05
http+flv+java,制作一个全功能的FLV播放器
2019-03-05
php寻找文本,寻找文本 · Leing中文PHP框架 · 看云
2019-03-05
实例分析Facebook激励视频广告接入
2019-03-05
实例:使用OKGO下载网络压缩包资源,然后解压缩放在本地使用
2019-03-05
实例:Gson解析泛型对象
2019-03-05
Android主题和样式精炼详解
2019-03-05
Shell脚本-KVM虚拟机添加(删除)硬件
2019-03-05
HDFS Missing Block诊断信息的改进
2019-03-05
解决mybatis嵌套查询使用PageHelper分页不准确
2019-03-05
关掉SpringBoot中的debug日志
2019-03-05
Redis源码分析(七)--- zipmap压缩图
2019-03-05
大规模集群自动化部署工具--Chef的安装部署
2019-03-05
一致性哈希算法
2019-03-05
HDFS源码分析(一)-----INode文件节点
2019-03-05
HDFS源码分析(六)-----租约
2019-03-05
自定义Hive Sql Job分析工具
2019-03-05
聊聊HDFS RBF第二阶段的主要改进
2019-03-05
公司如何使用开源软件
2019-03-05