zoukankan      html  css  js  c++  java
  • 线性最大子数组的求法(二)

    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 }

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

  • 相关阅读:
    static 续--
    [非原创]java 中static作用解析
    public/private/protected作用域
    三种排序方法(冒泡、选择、插入)
    SQLMAP自动注入(四)
    SQLMAP自动注入(三)—Injection,Detection,Techniques
    SQLMAP自动注入(二)-request,优化
    SQLMAP自动注入(一)
    SQL盲注
    SQL注入——猜测字段名称
  • 原文地址:https://www.cnblogs.com/lixiaochao/p/5666522.html
Copyright © 2011-2022 走看看