Leetcode-Maximum Subarray

本文解析了寻找具有最大和的连续子数组的问题,并提供了一种动态规划解决方案。通过实例说明了如何找到最大子数组和,同时分析了时间与空间复杂度。

Problem

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

具体详见Leetcode

Analysis

首先明确题目要求的是子序列的和的最大值,而在此题的中子序列不能为空,所以如果所有的数都是负数的话,也不能不选。所以分两种情况。第一种情况是所以子元素都是负数,那么最大子序列的和是最大的那个负数的值。第二种情况是至少有一个正数,此时可以采用动态规划的方法来做。
动态规划方程为:
f(n) 为当前的最大子序列的和, a[n] 表示当前的数组元素。
f(n)=max { 0,f(n1)+a[n] }
然后取 f(n) 这个数组中的最大值,可是实时比较当前的max和 f(n) .

Code

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> sumArray;
        int max = nums[0];
        if (nums[0] < 0) sumArray.push_back(0);
        else sumArray.push_back(nums[0]);
        for (int i = 1; i < nums.size(); i++) {
            if (sumArray[i-1] + nums[i] < 0) {
                sumArray.push_back(0);
            }
            else sumArray.push_back(sumArray[i-1] + nums[i]);
            if (max < sumArray[i]) max = sumArray[i];
        }
        bool flags = false;
        int nummax = nums[0];
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0) flags = true;
            if (nums[i]  > nummax) nummax = nums[i];
        }
        if (!flags) max = nummax;
        return max;
    }
};

Complexity

时间复杂度: O(n)
空间复杂度: O(n)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值