本篇文章总结了LeetCode题目53 最大子序列和中使用的分治算法
分治 动态规划
分治算法:
实现方式:循环递归
注意事项:
对于本题来讲,分治的情况如下:
整个分治过程如下:
也可以参照下图:
本题的分治解法可参考链接:https://www.bilibili.com/video/BV19t411k7jR?from=search&seid=2021815922201083386
int Max( int val1, int val2 )
{
return val1 > val2 ? val1 : val2;
}
int maxSubSum( int *nums, int left, int right )
{
int leftMaxSum, rightMaxSum, crossMaxSum;
int mid, i;
//边界条件
if( left == right )
return nums[left];
//分解并递归解决
mid = (left + right) / 2;
leftMaxSum = maxSubSum( nums, left, mid );
rightMaxSum = maxSubSum( nums, mid + 1, right );
int leftCrossSum = 0, leftCrossSumMax = INT_MIN;
for( i = mid; i >= left; --i )
{
leftCrossSum += nums[i];
if( leftCrossSum > leftCrossSumMax )
leftCrossSumMax = leftCrossSum;
}
int rightCrossSum = 0, rightCrossSumMax = INT_MIN;
for( i = mid + 1; i <= right; ++i )
{
rightCrossSum += nums[i];
if( rightCrossSum > rightCrossSumMax )
rightCrossSumMax = rightCrossSum;
}
crossMaxSum = leftCrossSumMax + rightCrossSumMax;
//合并
return Max( Max( leftMaxSum, rightMaxSum ), crossMaxSum );
}
int maxSubArray( int *nums, int numsSize )
{
return maxSubSum( nums, 0, numsSize - 1 );
}
原文:https://www.cnblogs.com/uestcliming666/p/12877334.html