一、设计思路
基本思路与 ‘返回一个一维整数数组中最大子数组的和’ 相差不多,但是多了一个循环,具体如下:
让每一个数组中的数字都作为该数组的第一个数字进行for循环,再在这个for循环里求出该整数数组中最大子数组的和,然后把每一个最大值的数字存进去一个新的数组里进行for循环,求出最大值,即为结果。
求每一个数组里的最大子数组和的值的方法为: 先定义一个与原数组长度相同的空数组,然后将原数组的第一个数赋值给空数组的第一个位置,然后用循环比较原数组的数字与空数组的前一个数字相加是否为负数,如果为负数,则两个数组都 “+1/+1” 重新开始循环比较,得到第二个数组后进行比较就可以得到整数数组中最大子数组的和。
让每一个数组中的数字都作为该数组的第一个数字进行for循环的方法为: 定义一个长度为二倍原数组长的空数组,例如原数组的长度为n,则赋值空数组if(i<n) akong[n]=ayuan[n], if(i>n) akong[n]=ayuan[n-i],(akong 表示新建空数组,ayuan 表示原数组,可自行定义数组名),然后for循环即可。
二、源程序代码:
//返回一个整数环形数组中最大子数组的和。 //信1405-1班 20142966 黄伟鹏 import java.util.Scanner; public class shuzu2 { public static void main(String[] args) { // TODO 自动生成的方法存根 int i,j,length; System.out.println("请输入要进行比较的数字个数:"); Scanner in=new Scanner(System.in); //定义数组长度 length=in.nextInt(); int list[]=new int[length]; System.out.println("请输入要进行比较的数字:"); Scanner t=new Scanner(System.in); //定义数组的内容 for(i=0;i<length;i++) { list[i]=t.nextInt(); } //定义一个空的存储数组 int list2[]=new int[length+length]; int size[]=new int[length]; int size2[]=new int[length]; //paixu for(j=0;j<2*length;j++) { if(j<length) { list2[j]=list[j]; } else if(j>=length) list2[j]=list[j-length]; } //将数组中的数字相加,求最大值 for(j=0;j<length;j++) { size[0]=list[0]; for(i=1;i<length;i++) { list[i]=list2[i+j]; if(size[i-1]<0) { size[i]=list[i]; } else { size[i]=list[i]+size[i-1]; } } //求出一次循环最大值 for(i=0;i<length-1;i++) { if(size[0]<size[i+1]) { size[0]=size[i+1]; } } size2[j]=size[0]; } for(i=0;i<length-1;i++) { if(size2[0]<size2[i+1]) { size2[0]=size2[i+1]; } } //输出最大值 System.out.println(size2[0]); } }
三、运行结果截图: