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

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);
}

你可能感兴趣的:(算法,数据结构,c语言)