zoukankan      html  css  js  c++  java
  • 求一个整形数组的最大子数组之和

    给定一个整数数组,求取该数组的最大子数组之和,代码如下(部分来源其他博客,如有侵权,请私信):

     1 /**
     2  * 求一个数组的最大子数组之和
     3  * @author JiaJoa
     4  *
     5  */
     6 public class Algorithm_GetMaxSubString {
     7 
     8     public static void main(String[] args) {
     9         int[] data = {1,-2,4,8,-4,7,-1,-5};
    10         System.out.println(Algorithm_GetMaxSubString.getMaxSubString(data));
    11         System.out.println(Algorithm_GetMaxSubString.getMaxSubString2(data));
    12         System.out.println(Algorithm_GetMaxSubString.getMaxSubIntByDP(data));
    13     }
    14     
    15     //以某个点及其后的字串最大值思路求解最大数组之和,时间复杂度O(n^2)
    16     public static int getMaxSubString(int[] data){
    17         int size = data.length;        
    18         int maxNum = Integer.MIN_VALUE;
    19         for(int i=0;i<size;i++){
    20             int sum = 0;
    21             for(int j=i;j<size;j++){
    22                 sum+=data[j];
    23                 if(sum>maxNum)
    24                     maxNum = sum;                   
    25             }
    26         }
    27         return maxNum;
    28     }
    29     
    30     //以某个点及其后的字串最大值思路求解最大数组之和,时间复杂度O(n)
    31     public static int getMaxSubString2(int[] data){
    32         int size = data.length;        
    33         int nAll = Integer.MIN_VALUE; //记录全局最大值
    34         int nEnd = 0; 
    35         int start = 0;
    36         int end = 0;
    37         
    38         for(int i=0;i<size;i++){
    39             if(nEnd<0){     //若nEnd小于0,说明字串最后一个数值小于0,则重新开始计算字串
    40                 nEnd = data[i];
    41                 start = i;
    42             }else{
    43                 nEnd += data[i];
    44             }
    45             if(nEnd>nAll){
    46                 nAll = nEnd;
    47                 end = i;
    48             }
    49         }
    50         
    51         StringBuilder sb = new StringBuilder();
    52         for(int i=start;i<=end;i++)
    53             sb.append(data[i]+",");
    54         System.out.println(sb.toString());
    55         
    56         return nAll;
    57     }
    58     
    59     
    60     //使用动态规划的思想求解最大数组之和,时间复杂度O(n)
    61     //使用两个变量,一个保存当前位置前最大字串值,一个用于探测进一步
    62     public static int getMaxSubIntByDP(int[] data){
    63         int size = data.length;
    64         int nAll = data[0];  //记录数组的前n个数字中最大子串的和,初始化为第一个数字data[0]
    65         int nEnd = data[0];  //在字串包含了第n个数字时,数组的前n个数字中最大子串的和,初始化为第一个数字data[0]
    66         for(int i=1;i<size;i++){
    67             nEnd = max(nEnd+data[i],data[i]); 
    68             nAll = max(nEnd,nAll);  
    69         }
    70         return nAll;
    71     }
    72     
    73     //求最大值
    74     public static int max(int a,int b){
    75         return a>b?a:b;
    76     }
    77 }
  • 相关阅读:
    opencv 遍历Mat对象中数据方法-转
    JVM OutOfMemoryError 分析
    hibernate validation HV000030: No validator could be found for constraint
    通过aop实现rpc统一参数校验&异常捕捉
    java8 lambda groupingby 分组保持原来顺序
    递归判断素组是否有序
    dubbo 直连
    Linux 删除openjdk
    telnet命令调用远程dubbo 接口
    git submodule ssh key
  • 原文地址:https://www.cnblogs.com/JiaJoa/p/7777253.html
Copyright © 2011-2022 走看看