Q31:连续子数组的最大和

publicclass Q31 {
   /**
    * 题目:连续子数组的最大和
    * 题目说明:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)。
    * 举例说明:输入数组{1,-2,3,10,-4,7,2,-5}和的子数组最大的为{3,10,-4,7,2},因此输出18
    * 解题思路:如果利用蛮力去解决该问题则需要枚举出所有子数组的和,若有n个元素,则需要n*(n-1)/2个子数组。这样时间的复杂度至少为O(n^2)级别。显然不符合要求。
    * 我采用的是累加和的形式。当前k个元素的和为负数时,则抛弃前k个元素,从第k+1个元素开始重新求和。、
    * 当下一个元素为负数时,先保存前边元素的和(result)(result有可能是最大的子数组和),继续求和如果和大于result,则将新的和替换result的值。
    */
   publicstatic void main(String[] args) {
      Q31 test = new Q31();
      int[] array = {1,-2,3,10,-4,7,2,-5};
      System.out.println(test.getGreatestSumOfSubArray(array));
   }
   booleaninputInvalid = false;//用于监视输入的数组是否合法
   publicint getGreatestSumOfSubArray(int[] array){
      if(array ==null || array.length <=0){
         inputInvalid = true;
         return 0;
      }
      inputInvalid =false;
      int partSum = 0;//临时存放和值
      int maxSubSum = -65536;//此处需要注意,最大值有可能还小于-65536
      for(int i = 0; i < array.length; i++){
         if(partSum <= 0){//如果前几个元素的和为非正数,则将下一个元素做为第一个求和元素
            partSum = array[i];
         }else {
            //partSum = partSum + array[i];
            partSum+=array[i];
         }
         if(partSum > maxSubSum){
            maxSubSum = partSum;
         }
      }
      return maxSubSum;
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值