IT公司100题-3-求数组的最大子序列的和

本文介绍了一种高效的算法,通过一次遍历计算数组中最大子序列的和,时间复杂度为O(n)。示例代码演示了如何实现这一算法。

问题描述:

计算一个给定数组的最大子序列之和

求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2

因此输出为该子数组的和18。

分析:

有三种方法:

1,扫描3遍,可以计算所有的子序列之和,但是复杂度为N^3。

2,扫描2遍,计算以任意元素开始的和,如果大于当前的最大值则将最大值付给它,复杂度为N^2。

3,扫描一遍,计算任意元素开始的值,如果小于零则清零,否则继续往后加。


代码实现:

package oschina.IT100;
/**
 * @project: DataStructureAndAlgorithmAnalysis
 * @filename: MaxSubSum
 * @version: 0.10
 * @author: Jimmy Han
 * @date: 21:35 2015/7/7
 * @comment: calculate the sum from any point, reset sum when current sum is negative
 * @result: 10
 */

class IT3 {
   public static void main(String[] args){
      int[] arr = {-1, 3, 2, -3, -1, 4, 5};
      System.out.println(maxSubSum(arr));
   }

   public static int maxSubSum( int[] a){
      int maxSum = 0, thisSum = 0;

      for(int j = 0; j < a.length; j++){
         thisSum += a[j];

         if(thisSum > maxSum)
            maxSum = thisSum;
         else if(thisSum < 0)
            thisSum = 0;
      }

      return maxSum;
   }
}


转载于:https://my.oschina.net/jimmyhan/blog/475838

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值