Leetcode 53.Maximum Subarray

Leetcode 53.Maximum Subarray

source url

题目描述

输入:一个数组
输出:该数组中,最大连续子序列和
如:

Input:[-2,1,-3,4,-1,2,1,-5,4]
Output:6 //[4,-1,2,1]

代码

int max = 0;//for saving the max sum of sub array
bool init = false;

//recursion for computing sum of sub array
//from left to right
int maxSubArr(int* nums, int l, int r){
    //return only on object
    if(l==r){
        if(!init){
            max = nums[l];
            init = true;
        }
        return nums[l];
    }else{
    //compare sum of the right subArr and current item
    //if larger return current item and right subArr
    //else return current item
        int sumr = maxSubArr(nums,l+1,r);
        max = sumr>max?sumr:max;

        if(sumr>0){
            int sum =nums[l]+sumr;
            max = sum>max?sum:max;
            return nums[l]+sumr;
        }else{
            max = nums[l]>max?nums[l]:max;
            return nums[l];
        }
    }


}

int maxSubArray(int* nums, int numsSize) {
    init = false;
    max = 0;
    maxSubArr(nums,0,numsSize-1);
    return max;
}

算法描述

采用递归的方式计算从下标为0到数组尾部各子序列的和,同时利用全局变量max存储最大子序列的和。
网上solution里面,都是根据当前子序列sum进行判断,若sum<0,则重设子序列。进行迭代。

2. DP

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum = 0;
        int maxsum = nums[0];

        for(int i = 0;i<nums.size();i++){
            maxsum = max(sum+nums[i],maxsum);
            if((sum+nums[i])<0){
                sum = max(0,nums[i]);
            }else{
                sum +=nums[i];
            }

        }

        return maxsum;
    }
};

算法描述

采用动态规划的方式,sum表示到当前下标的最大子序列和;maxsum表示当前各个下标中最大的子子序列和。其中,状态转移方程如下:

sum={sum+num[i]max(num[i],0) if sum+num[i]>0 if sum+num[i]<0

复杂度 O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值