求一维循环数组最大子数组

设计思路:

一维循环数组:一维整数组头跟尾相连形成一个环。

问题解决方案:将一个一维数组扩大两倍,求新的数组的最大子数组即可。

import java.io.IOException;

public class xunhuanshuzu {

    public static void main(String[] args)throws IOException{
        int []a= {23,-12,234,-234,123,2,0,1,-1,-34};
        int n=a.length;
        int []b=new int[2*n];    
        try{
            for(int i=0;i<2*n;i++) {
            if(i<n) {
                b[i]=a[i];
                }
            else if(i>=n) {             
                b[i]=a[i-n];            
            }
        }
        System.out.println("最大子数组:"+max(b));
    }catch (Exception e) {            
        System.out.println("出错");            
        e.printStackTrace();        
    }
    }
    public static int max(int a[]) {
        /**
         * 求一维数组最大子数组
         */
        int x=a.length;
        int b[][]=new int[x][x];//存子数组
        int c[]=new int[x];//存二维数组每一行的最大值
        for(int i=0;i<x;i++) {//所有子数组存入二维数组中:以第i个开头的子数组们存入第i行
            for(int j=0;j<x;j++) {//求出二维数组的一行
                int sum=0;
                for(int s=i;s<=j;s++){//求每一个子数组                
                sum+=a[s];
                }
                b[i][j]=sum;//存子数组
            }
        };        
        for(int i=0;i<x;i++) {//i为行            
            for(int j=0;j<x;j++) {//j为列
                if(b[i][j]>c[i]) {                
                    c[i]=b[i][j];
                }
            }
        }
        int s=0;
        for(int i=0;i<c.length;i++) {    
            
            if(s<c[i]) {
                s=c[i];
            }
        };
        return s;
    }
}

运行结果:

原文地址:https://www.cnblogs.com/sengzhao666/p/10610185.html