分治连续和最大字串


/*
Copyright personal all reversed
Author   Steven
Date   2011-06-28
description:
            input :
          number array(positive and negative) in any sequence.
   output
          the sum of the longest subArray which the sequence  must be continue .

Algorithm description:
                     use the thought of the recursion(准确说是分治). The longest sequence must in only left part or in right side
      or both side.
                     if we use non-algorithm. we may enum all the possibilities. Enum the start point and the end point Cn2 = n*(n-1) +n
                     Calculate the result need n. we need O(n3)
      分治每次可以二分,复杂度降低到logn 计算复杂度还是N 故总体复杂度n*logn
*/
#include <stdio.h>
#include <stdlib.h>
//[a,b)
int  RecursionSum(int* pArray,int start,int end)
{
 int sum = 0;                         
 if(end - start == 1)                                           // single point can return directly

  return pArray[start];
 int middleNum = (end + start)/2;                             // calculate the middle point
  int left   = RecursionSum(pArray, start, middleNum) ;      // longest subArray in left part
 int right  = RecursionSum(pArray, middleNum, end);
 if(left > right)
  sum = left;
    else
  sum = right;
 int leftSum = pArray[middleNum-1];
 int tempSum = 0;
 //================ longest subArray is  both in left part and right part==========================//
 //left side
 for(int index = middleNum-1; index >= start; index--)
 {
  tempSum = tempSum + pArray[index];
  
  if(leftSum <= tempSum)
  {
   leftSum = tempSum;
  }
 }
 int righttSum = pArray[middleNum];
 tempSum = 0;
 // right side
 for(index = middleNum; index < end;index++)
 {
  tempSum = tempSum + pArray[index];
  if(righttSum <= tempSum)
  {
   righttSum = tempSum;
  }
 }
 
    int LrSum = leftSum + righttSum;
 if(LrSum  >  sum)
 {
  return LrSum;
 }
 else
  return sum;
}
int main()
{
 int nArray[11]={0,1,2,3,-100,5,6,7,8,9};
 int sum = RecursionSum(nArray,0,10);
 printf("%d",sum);
 system("pause");
 return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值