[LeetCode] Maximum Subarray
来源:互联网 发布:曲面电视优缺点知乎 编辑:程序博客网 时间:2024/06/04 23:25
题干:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.
题目解析:
这道题目是要找出给定数组中连续子序列最大的和,是一道典型的动态规划问题。首先考虑这个问题的子问题,我们可以考虑如何从n-1个数组中最大的和得到n个数的数组中最大的和。从题目得知,我们要求的是连续子序列中最大的和,因此,当n-1个数组中加入了第n个数字以后会存在两种情况,一是最大的和包含了这第n个数,二是最大的和并没有包含着第n个数。因此我们可以从这方面入手,求出包含了这第n个数的最大子序列的和,以及不包含第n个数的最大子序列的和,两者中的最大者即为n个数的数组的最大子序列的和。
首先考虑包含了第n个数的最大子序列的和:
这时候又有两种情况,若这个子序列长度为1,则最大子序列的和就是这第n个数,即num[n - 1],若长度大于1,由于是连续子序列则必然包含了第n-1个数,那必然是包含了第n-1个数的最大子序列的和加上第n个数,因此这个数的取值是两者中的最大者,即max{num[n-1], local_sum[n - 2] + num[n - 1]};
然后考虑不包含第n个数的最大子序列的和:
既然不包含第n个数,那么最大子序列的和即n-1个数的最大子序列的和,为global_sum[n - 1];
因此n个数的最大子序列的和即为max{global_sum[n - 1], max{num[n-1], local_sum[n - 2] + num[n - 1]}}
因此,通过这样的划分,我们可以从1个数开始不断的计算local_sum和global_sum,最终得到的global_sum[n - 1]即是我们所求的最大子序列的和。具体实现代码如下:
class Solution {public: int maxSubArray(vector<int>& nums) { int size = nums.size(); if (size == 0) return 0; int global, local; global = nums[0]; local = nums[0]; for (int i = 1; i < size; i ++) { local = max(nums[i], local + nums[i]); global = max(global, local); } return global; }};
- 【LeetCode】Maximum Subarray 和 Maximum Product Subarray
- LeetCode: Maximum Subarray
- LeetCode Maximum Subarray
- [Leetcode] Maximum Subarray
- LeetCode: Maximum Subarray
- leetcode 25: Maximum Subarray
- [LeetCode] Maximum Subarray
- [Leetcode] Maximum Subarray
- [LeetCode]Maximum Subarray
- [leetcode]Maximum Subarray
- LeetCode-Maximum Subarray
- [leetcode] Maximum Subarray
- LeetCode 45: Maximum Subarray
- LeetCode - Maximum Subarray
- LeetCode:Maximum Subarray
- LeetCode 53: Maximum Subarray
- 【leetcode】Maximum Subarray
- Leetcode Maximum Subarray
- ABP官方文档(四十一)【ASP.NET Core】
- Leetcode 303
- Centos7 配置 JDK8
- 【LintCode-93】平衡二叉树(Java实现-递归算法)
- ABP官方文档(四十二)【CSRF和XSRF保护】
- [LeetCode] Maximum Subarray
- hadoop源码阅读之mapreduce再理解
- react native 的赋值比较,空字符串以及undefined
- memcpy(b,a,sizeof(a))
- Android 淡入淡出动画
- Java模拟鼠标键盘输入事件 --- Robot 类
- 判断是否能构成三角形并计算面积
- 【备忘】年薪50万2017年最新Spark2.0从入门到精通教程
- PHP二维数组按照指定的字段排序的函数