码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 53. Maximum Subarray 解题思路

时间:2017-01-13 01:02:28      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:for   over   cto   连续   within   ping   class   ini   最大的   

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.

问题: 给定一个元素有正有负的数组,求最大连续子数组的和。

 

思路:

设辅助数组 v, v[i] 表示以 nums[i] 为右端元素的最大连续子数组的和。v[i], v[i-1] 以及 nums[i] 的关系如下。

v[i] = max( nums[i], nums[i] + v[i-1] )

数组 v 中的最大值,则是整个数组的最大连续子数组的和。

 

class Solution {
public:
    /**
     * 求一维数组的最大值元素的值
     *
     */
    int maxElement(vector<int>& v){
    
        if(v.size() == 0){
            return 0;
        }
    
        int max = v[0];
        for (int i = 0 ; i < v.size(); i++) {
            if (v[i] > max) {
                max = v[i];
            }
        }
        
        return max;
    }
    
    
    int maxSubArray(vector<int>& nums) {
    
        bool hasPositive = false;
        
        vector<int> v(nums.size(), 0);
        
        if (nums[0] >= 0 ) {
            hasPositive = true;
            v[0] = nums[0];
        }else{
            v[0] = 0;
        }
        
        
        for (int i = 1 ; i < nums.size(); i++) {
            if (v[i-1] + nums[i] >= 0) {
                hasPositive = true;
                v[i] = v[i-1] + nums[i];
            }
        }
        
    //     print_vector(v);
        
        int res;
        if (hasPositive == false) {
            res = maxElement(nums);
        }else{
            res = maxElement(v);
        }
        
        return res;
    }
};

 

本题目是一年前做的,在这里记录下解题思路。补充几点理解:

1. 从上面数组 v 的公式中,可以看出本问题满足 DP 的两个主要性质 overlapping substructure & optimal substructure 。

2. 由于只需要求出最大的连续子数组之和,上面算法可以不用辅助数组,节省空间。有辅助数组,方便查看校对中间结果。

3. 本题的解题思路,也可以理解为是一个滑动窗口算法,通过滑动窗口的左右两端 l 和 r, 求得所有元素分别为右端的最大连续子数组,其中的最大值即为题目的姐。

 

[LeetCode] 53. Maximum Subarray 解题思路

标签:for   over   cto   连续   within   ping   class   ini   最大的   

原文地址:http://www.cnblogs.com/TonyYPZhang/p/6280202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!