zoukankan      html  css  js  c++  java
  • 算法导论(第三版) Exercises4.2(求最大和子数组的算法优化过程)

    4.1-1

    如所有元素都为负,则返回所有元素中最大的负数。

    4.1-2(暴力法求最大和子数组)

    struct subarray
    {
        int start, end, sum;
    };
    void bruteFindMaxSubarray(int a[], int left, int right, struct subarray* result)
    {
        int i, j, sum=a[left];
        int tempSum;
        int l = left;
        int r = l;
        for(i=left; i<=right; i++)
        {
            tempSum = a[i];
            for(j=i+1; j<=right; j++)
            {
                tempSum += a[j];
                if(tempSum > sum)
                {
                    l = i;
                    r = j;
                    sum = tempSum;
                }
            }
        }
        result->start = l;
        result->end = r;
        result->sum = sum;
    }
    View Code

    4.1-3(归并算法求最大和子数组)

    int mergeFindSub(int a[], int l, int r, int result[])
    {
        int i, j, k, mid;
        int leftSum = 0;
        int rightSum = 0;
        int crossSum = 0;
        int leftResult[3] = {0};
        int rightResult[3] = {0};
        int crossResult[3] = {0};
        if(l == r)
        {
            result[0] = l;
            result[1] = r;
            result[2] = a[l];
        }
        else
        {
            mid = (l + r) / 2;
            leftSum = mergeFindSub(a, l, mid, leftResult);
            rightSum = mergeFindSub(a, mid+1, r, rightResult);
            crossSum = crossingSub(a, l, mid, r, crossResult);
            if(leftSum >= rightSum && leftSum >= crossSum)
                for(i=0; i<3; i++) result[i] = leftResult[i];
            else if(rightSum >= leftSum && rightSum >= crossSum)
                for(j=0; j<3; j++) result[j] = rightResult[j];
            else
                for(k=0; k<3; k++) result[k] = crossResult[k];
        }
        return result[2];
    }
    
    int crossingSub(int a[], int l, int m, int r, int result[])
    {
        int i, j, leftSum, rightSum, sum;
        int min = -10000;
        rightSum = min;
        leftSum = min;
        sum = 0;
        for(i=m; i>=l; i--)
        {
            sum += a[i];
            if(sum > leftSum)
            {
                result[0] = i;
                leftSum = sum;
            }
        }
        sum = 0;
        for(j=m+1; j<=r; j++)
        {
            sum += a[j];
            if(sum > rightSum)
            {
                result[1] = j;
                rightSum = sum;
            }
        }
        result[2] = leftSum + rightSum;
        return result[2];
    }
    View Code

    4.1-4

    如果允许空串,只要加一句

    if (sum < 0)  return sum=0;

    4.1-5(线性算法求最大和字串)

    void linearFindSub(int a[], int n, int result[])
    {
        int i, l, temp, sum;
        int min = -10000;
        sum = min;
        temp = 0;
        l = 0;
        for(i=0; i<n; i++)
        {
            if(temp < 0)
            {
                temp = a[i];
                l = i;
            }
            else
                temp += a[i];
            if(sum < temp)
            {
                result[0] = l;
                result[1] = i;
                sum = temp;
            }
        }
        result[2] = sum;
    }
    View Code
  • 相关阅读:
    JAVA的向上转型 和 向下转型
    Mobx 常用函数整理
    HTTP错误代码对应
    D3官网上的力导图
    用D3画简单的力导图
    nodejs 爬图片
    nodejs 爬热搜
    canvas 图片旋转 导出下载
    canvas 电子签名
    canvas 音乐跳动效果
  • 原文地址:https://www.cnblogs.com/xuanzhang/p/4752234.html
Copyright © 2011-2022 走看看