采用递归的方式分治算法:设计有问题需要改:
出现设计问题左右子串不连续也相加与原来与耿深层次递归结果比较
#include <stdio.h>
#include <math.h>
extern int divide_and_conquer_algorithm(int *num, int l, int r);
extern int max(int x, int y);
void main()
{
int num[9] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int result = divide_and_conquer_algorithm(num, 0, 8);
printf("==========%d", result);
}
int divide_and_conquer_algorithm(int *num, int l, int r)
{
int tmp, left, right, maxreslut;
//分治算法第一步 (只有一个元素)递归结束
if (l >= r)
{
return num[l];
}
//分治算法第二步:将区间划分成为两个大小接近的区间
tmp = l + (r - l) / 2,
left = tmp;
right = tmp + 1;
maxreslut = max(divide_and_conquer_algorithm(num, l, left), divide_and_conquer_algorithm(num, right, r));
//分治算法第三步:
//(1)合并---从分界点开始向左边遍历最大连续子串
int L = num[left], R = num[right];
int maxleft = 0;
int leftsign = 0;
int rightsign = 0; //标示是否是连续新找到的的子串大于原来的子串
for (int i = left; i >= l; i--)
{
//这个结果是遍历完整个截取的区间的
if ((maxleft + num[i]) >= L)
{
leftsign = 1;
printf("%d====LM=====num[%d] ===%d\n", L,i, num[i]);
}
L = max(L, maxleft + num[i]);
printf("%d你是%d\n",L,maxleft + num[i]);
}
//(2)合并---从分界点开始向右边遍历最大的连续子串
int maxright = 0;
for (int i = right; i <= r; i++)
{
if ((maxright + num[i]) >= R)
{
rightsign = 1;
}
R = max(R, maxright + num[i]);
printf("%d====RM=====num[%d]====%d\n", R,i, num[i]);
}
if (rightsign && leftsign)
{
int k = max(maxreslut, L + R);
printf("%d 连续 %d\n",k, L + R);
return (max(maxreslut, L + R));
}
return (max(max(maxreslut, R), max(maxreslut, L)));
}
//定义一下max函数
int max(int x, int y)
{
if (x > y)
{
return x;
}
else
{
return y;
}
}
错误输出:
li@hp:~/projects/helloworld$ cd "/home/li/projects/helloworld/home/li/projects/helloworld/" && gcc leetcode最大子序数和.c -o leetcode最大子序数和 && "/home/li/projects/helloworld/home/li/projects/helloworld/"leetcode最大子序数和
-5====LM=====num[7] ===-5
-5你是-5
4====RM=====num[8]====4
4 连续 -1
2====LM=====num[5] ===2
2你是2
1====RM=====num[6]====1
3 连续 3
1====LM=====num[6] ===1
1你是1
1====LM=====num[5] ===2
2你是2
-5====RM=====num[7]====-5
4====RM=====num[8]====4
6 连续 6
4====LM=====num[3] ===4
4你是4
-1====RM=====num[4]====-1
4 连续 3
-2====LM=====num[0] ===-2
-2你是-2
1====RM=====num[1]====1
1 连续 -1
1====LM=====num[1] ===1
1你是1
1你是-2
-3====RM=====num[2]====-3
1 连续 -2
-3====LM=====num[2] ===-3
-3你是-3
-3====LM=====num[1] ===1
1你是1
1你是-2
4====RM=====num[3]====4
4====RM=====num[4]====-1
5 连续 5
-1====LM=====num[4] ===-1
-1你是-1
-1====LM=====num[3] ===4
4你是4
4你是-3
4你是1
4你是-2
2====RM=====num[5]====2
2====RM=====num[6]====1
2====RM=====num[7]====-5
4====RM=====num[8]====4
8 连续 8