leetcode53.最大连续子串---使用分治算法(出现设计问题左右子串不连续也相加与原来与更深层次递归结果比较)

采用递归的方式分治算法:设计有问题需要改:
出现设计问题左右子串不连续也相加与原来与耿深层次递归结果比较
#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值