最大子列和问题

将一个问题的算法复杂度O(n^3)干道O(n^2)到O(nlog2n)到O(n)的过程是多么的feel at easy。

算法的魅力,解决同一大数量级问题的快与慢,明显体现,请撸码体验

测试源码:https://github.com/linrenyao/Algorithm/blob/master/MaxSumSubList.cpp

 //穷举 O(n^3) 
  int algorithm1(int list[],int n) {
      int MaxSum = 0,TempSum = 0;
      for (int i = 0; i < n; i++) {
          for (int j = i; j < n; j++) {
              TempSum = 0;
              for (int k = j; k < n; k++) {
                  TempSum += list[k];
                  if (TempSum > MaxSum) MaxSum = TempSum;
              }
          }
      }
      return MaxSum;
  }
  //优化后的穷举,去除不必要的重复累加 O(n^2)
  int algorithm2(int list[], int n) {
      int MaxSum = 0, TempSum = 0;
      for (int i = 0; i < n; i++) {
          TempSum = 0;
          for (int j = i; j < n; j++) {
              TempSum += list[j];
              if (TempSum > MaxSum) MaxSum = TempSum;
          }
      }
      return MaxSum;
  }

 

  //分治算法(分儿治之,先分后治)    0(nlog2n)
  int algorithm3(int *list,int start,int end) {
      int mid = (end + start) / 2;
      int num = (end - start) / 2;
      if (num >= 1) {
          int leftMaxSubListSum, RightMaxSubListSum;
          //递归左半部
          leftMaxSubListSum = algorithm3(list, start, mid);
          //递归右半部
          RightMaxSubListSum = algorithm3(list, mid, end);
          //求左右两部分的最大子序列和
          int MaxSubListSum = 0, TempSubListSum = 0;
          int i = 0;
          while (num--) {
              TempSubListSum += list[mid-1-i];
              if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
              TempSubListSum += list[mid+i];
              if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
              i++;
          }
          //比较三个序列和
          int maxSum = max(leftMaxSubListSum, RightMaxSubListSum) > MaxSubListSum ? max(leftMaxSubListSum, RightMaxSubListSum) : MaxSubListSum;
          return maxSum;
      }
      else{
          //当序列中只有一个元素则返回,当前序列的唯一和,startindx 和endindx 差1
          int MaxSubListSum = 0, TempSubListSum = 0;
          for (int i = start; i < end; i++) {
              TempSubListSum += list[i];
              if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
          }
          return MaxSubListSum;
      }
  }

在线算法:选择当前相对解。 

  //在线处理算法 O(n)
  int algorithm4(int list[], int n) {
      int MaxSum = 0, TempSum = 0;
      for (int i = 0; i < n; i++) {
          TempSum += list[i];
          if (TempSum > MaxSum) MaxSum = TempSum;
          else if(TempSum < 0) TempSum = 0;
      }
      return MaxSum;
  }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值