[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;    }};
原创粉丝点击