求一个整形数组的最大子数组之和

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

 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 }

 

posted @ 2017-11-03 11:16  JiaJoa  阅读(247)  评论(0编辑  收藏  举报