编程之美2.14求数组的子数组之和的最大值Java版

  1. /* 
  2.  * To change this license header, choose License Headers in Project Properties. 
  3.  * To change this template file, choose Tools | Templates 
  4.  * and open the template in the editor. 
  5.  */  
  6.   
  7. package Test;  
  8.   
  9. import static java.lang.Integer.max;  
  10.   
  11. /** 
  12.  * 
  13.  * @author Administrator 
  14.  */  
  15. public class SearchArrayMaxSum {  
  16.     public static void main(String[] args) {  
  17.         int[] arry = new int[]{-2,5,3,-6,4,-8,6};  
  18.         //解法一  
  19.         int num1 = search_max_sum1(arry);  
  20.         System.out.println("num1 ="+num1);  
  21.         //解法二 分治  
  22.         int num2 = search_max_sum2(arry ,0,arry.length-1);  
  23.         System.out.println("num2 ="+num2);  
  24.         //解法三    
  25.         int num3 = search_max_sum3(arry,arry.length);  
  26.         System.out.println("num3 ="+num3);  
  27.     }  
  28.   
  29.     private static int search_max_sum1(int[] arry) {  
  30.         Integer maxsum = null;  
  31.         int sum ;  
  32.         for(int i =0;i<arry.length;i++){  
  33.             sum =0;  
  34.             for(int j =i;j<arry.length;j++){  
  35.                 sum += arry[j];  
  36.                 if(maxsum ==null||sum > maxsum){  
  37.                     if(maxsum ==null)  
  38.                         maxsum = new Integer(sum);  
  39.                     maxsum =sum;  
  40.                 }  
  41.             }  
  42.         }  
  43.         return maxsum;  
  44.     }  
  45.   
  46.     private static int search_max_sum2(int[] arry,int l,int r) {  
  47.         Integer maxsum = null;  
  48.         if(r-l <=1){  
  49.             int sum =0 ;  
  50.             for(int i = l;i<=r;i++)  
  51.                 sum +=arry[i];  
  52.             return sum;  
  53.         }  
  54.         int mid = (l+r)/2;  
  55.         int l_sum = search_max_sum2(arry,l,mid);  
  56.         int r_sum = search_max_sum2(arry,mid+1,r);  
  57.         for(int i =l;i<=r;i++){  
  58.             int sum =0;  
  59.             for(int j =i;j<=r;j++){  
  60.                 sum +=arry[j];  
  61.                 if(maxsum == null|| maxsum<sum){  
  62.                     if(maxsum ==null)  
  63.                         maxsum = new Integer(sum);  
  64.                     maxsum = sum;  
  65.                 }  
  66.             }  
  67.         }  
  68.         if(l_sum>r_sum){  
  69.             if(l_sum>maxsum)  
  70.                 maxsum = l_sum;  
  71.         }else{  
  72.             if(r_sum>maxsum)  
  73.                 maxsum = r_sum;  
  74.         }  
  75.         return maxsum ;  
  76.     }  
  77.   
  78.     private static int search_max_sum3(int[] arry,int num) {  
  79.        int nStart = arry[num-1];  
  80.        int nAll = arry[num-1];  
  81.        for(int i = num-2;i>=0;i--){  
  82.            nStart = max(arry[i],nStart+arry[i]);  
  83.            nAll  = max(nStart,nAll);  
  84.        }  
  85.        return nAll;  
  86.     }  
  87. }  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值