线性最大子数组的求法(二)

1、题目:求一个数组的最大线性子数组

2、常规求法

  这个方法相信大家都会想到,但是这个方法比较复杂,想法很简单,思路是:两层for循环遍历,从第一个元素开始一直累加后面的元素,找到最大的值赋给maxNum。

  这个方法的时间复杂度是O(n2),

3、第二种方法就是动态规划,这个名字不太清楚,思路是:遍历这个数组,从第一个元素开始向后加,这个值为curNum,当这个curNum的值小于0的时候就不会再加了(因为curNum是负数的话,加后面的数就会比前面的数小,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和),当这个值curNum比最大值maxNum大的时候就把curNum赋给maxNum。

  这个方法的时间复杂度是O(n),代码如下:

 1 /**
 2  * 求一个数组的最大线性子数组
 3  * @author lixiaochao
 4  *
 5  */
 6 public class MaxArray {
 7     
 8     public static void main(String[] args) {
 9         int[] a = new int[]{2,4,-7,5,2,-1,2,-4,3};
10         int curSum = 0;   //中间态的值
11         int maxSum = 0;   //这个数组的最大值
12         int start= 1;     //起始位置
13         int end = 0;      //末位置
14         for(int i =0; i < a.length; i++){
15             curSum += a[i];
16             if(maxSum < curSum){
17                 maxSum = curSum;
18                 end = i+1;
19             }
20             System.out.println("curSum= "+curSum+", a[i]= "+a[i]+",start="+start);
21             /*
22              * 当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,
23              * 那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和
24              */
25             if(curSum < 0){
26                 curSum = 0;
27                 start = i+2;
28             }
29         }
30         System.out.println("最大值为:"+maxSum);
31         System.out.println("开始位置为:"+start+",结束位置: "+end);
32         
33     }
34     
35 }

以上是个人观点,有什么不对的地方,还请大家指正,

 

转载于:https://www.cnblogs.com/lixiaochao/p/5666522.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值