设计思路:
一维循环数组:一维整数组头跟尾相连形成一个环。
问题解决方案:将一个一维数组扩大两倍,求新的数组的最大子数组即可。
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; } }
运行结果: