分治法求解最大子数组和问题

leetcode 53
53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

#define max(a,b) ((a)>(b)?(a):(b))
int maxSubArray_div(int* nums,int low,int high){
    if(low==high){
        return nums[low];
    }
    int mid=(low+high)/2;
    int left_max=maxSubArray_div(nums,low,mid);
    int right_max=maxSubArray_div(nums,mid+1,high);
    // int lr_max=nums[mid]+nums[mid+1];
    int l_max=nums[mid],l_tmp=nums[mid];
    for(int i=mid-1;i>=low;--i){
        l_tmp+=nums[i];
        l_max=max(l_max,l_tmp);
    }
    int r_max=nums[mid+1],r_tmp=nums[mid+1];
    for(int i=mid+2;i<=high;++i){
        r_tmp+=nums[i];
        r_max=max(r_max,r_tmp);
    }
    return max(max(left_max,right_max),r_max+l_max);
}
int maxSubArray(int* nums, int numsSize) {
    return maxSubArray_div(nums,0,numsSize-1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值