求一个整形数组的最大子数组之和
给定一个整数数组,求取该数组的最大子数组之和,代码如下(部分来源其他博客,如有侵权,请私信):
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 }