最大子数组

//基础解法:O(n*n) 
int maxSubSum(int array[],int length)
{
    int i,j,sum=0,temp;
    for(i=0;i<length;i++)
    {
        temp=0;
        for(j=i;j<length;j++)
        {
            temp += array[j];
            if(sum<temp){
                sum = temp;
            }
        }
    }
    return sum;
}
//分治法
int FindMaxCrossSubarray(int array[], int start, int mid, int end)  //跨越
{
     int left_sum = 0;
     int right_sum = 0;
     int sum = 0;
     int i;
     for (i = mid; i >= start; i--)  //左半部的最大子数组
     {
         sum += array[i];
         if (sum >left_sum)
         {
             left_sum = sum;
         }
     }
     sum = 0;
     for (i = mid + 1; i <= end; i++)  //右半部的最大子数组
     {
         sum += array[i];
         if (sum > right_sum)
         {
             right_sum = sum;
         }
     }
     return left_sum + right_sum;
}


int FindMaxSubarray(int array[], int start, int end)
{
     int left_sum, right_sum, cross_sum;
     if (end==start)  //一个元素
     {
         return array[start];
     }
     else
     {
         int mid = (start+ end) / 2; //分治
         left_sum = FindMaxSubarray(array, start, mid);  //前半部
         right_sum = FindMaxSubarray(array, mid + 1, end);  //后半部
         cross_sum = FindMaxCrossSubarray(array, start, mid, end);  //跨越前后
         if (left_sum >= right_sum && left_sum >= cross_sum)  //最大子数组在左边
             return left_sum;
         else if (right_sum >= left_sum && right_sum >= cross_sum)  //右边
             return right_sum;
        else  //跨越
         return cross_sum;
     }
}

//动态规划:O(n) 
int maxSubSum(int array[], int length) {
    int Sum,MaxSum,j;  
    Sum=MaxSum=0;  
    for(j=0;j<length;j++)  
    {  
        Sum+=array[j];  
        if(Sum>MaxSum)  
            MaxSum=Sum;  
        else if(Sum<0)  
            Sum=0;  
    }  
    return MaxSum; 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值