- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package Test;
- import static java.lang.Integer.max;
- /**
- *
- * @author Administrator
- */
- public class SearchArrayMaxSum {
- public static void main(String[] args) {
- int[] arry = new int[]{-2,5,3,-6,4,-8,6};
- //解法一
- int num1 = search_max_sum1(arry);
- System.out.println("num1 ="+num1);
- //解法二 分治
- int num2 = search_max_sum2(arry ,0,arry.length-1);
- System.out.println("num2 ="+num2);
- //解法三
- int num3 = search_max_sum3(arry,arry.length);
- System.out.println("num3 ="+num3);
- }
- private static int search_max_sum1(int[] arry) {
- Integer maxsum = null;
- int sum ;
- for(int i =0;i<arry.length;i++){
- sum =0;
- for(int j =i;j<arry.length;j++){
- sum += arry[j];
- if(maxsum ==null||sum > maxsum){
- if(maxsum ==null)
- maxsum = new Integer(sum);
- maxsum =sum;
- }
- }
- }
- return maxsum;
- }
- private static int search_max_sum2(int[] arry,int l,int r) {
- Integer maxsum = null;
- if(r-l <=1){
- int sum =0 ;
- for(int i = l;i<=r;i++)
- sum +=arry[i];
- return sum;
- }
- int mid = (l+r)/2;
- int l_sum = search_max_sum2(arry,l,mid);
- int r_sum = search_max_sum2(arry,mid+1,r);
- for(int i =l;i<=r;i++){
- int sum =0;
- for(int j =i;j<=r;j++){
- sum +=arry[j];
- if(maxsum == null|| maxsum<sum){
- if(maxsum ==null)
- maxsum = new Integer(sum);
- maxsum = sum;
- }
- }
- }
- if(l_sum>r_sum){
- if(l_sum>maxsum)
- maxsum = l_sum;
- }else{
- if(r_sum>maxsum)
- maxsum = r_sum;
- }
- return maxsum ;
- }
- private static int search_max_sum3(int[] arry,int num) {
- int nStart = arry[num-1];
- int nAll = arry[num-1];
- for(int i = num-2;i>=0;i--){
- nStart = max(arry[i],nStart+arry[i]);
- nAll = max(nStart,nAll);
- }
- return nAll;
- }
- }
编程之美2.14求数组的子数组之和的最大值Java版
最新推荐文章于 2019-06-29 18:45:05 发布