这次课上,把求最大子数组的问题进行了拓展,想象原始数组是一个像手环一样首位相连的结构,求最大子数组的和。我们知道,在中学的时候,涉及环状,包括圆柱体,圆锥体我们都会把它剪开,化简为平面问题。我想环状数组也可以这样来简化。
例如原始数组为 1 2 3 ,我们可以从3处剪开,再添上前面的两个数,变成 1 2 3 1 2,这样就可以在一维数组中求解。
上次的代码可以复制过来用,只需要修改几个地方即可:1.添加新的数组,用来存储环状数组变化成一维数组后的值 2.修改子数组个数为 i 方 3.第二次for循环条件的修改,保证环状数组每个元素的子数组都可取到最大。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package zuoye3; 2 3 import java.util.Scanner; 4 5 public class xunhuan { 6 7 public static void main(String[] args) { 8 // TODO 自动生成的方法存根 9 int i,j; 10 int sum=0; 11 int count=1;//子数组下标单位 12 int max; 13 Scanner scan=new Scanner(System.in); 14 System.out.print("输入数组的长度: "); 15 i=scan.nextInt(); 16 int length=i*i;//表示子数组的个数 17 int []a=new int[i];//定义长度为i的原始数组 18 int []a2=new int[2*i-1];//将循环数组展开后的数组 19 int []b=new int[length];//定义长度为length的子数组,用来存放各个子数组的和 20 System.out.println("请依次输入数组元素"); 21 for(i=0;i<a.length;i++) 22 { 23 a[i]=scan.nextInt(); 24 }//输入数组元素 25 System.out.println("原始数组为: "); 26 for(i=0;i<a.length;i++) 27 { 28 System.out.print(a[i]+" "); 29 }// 30 31 for(i=0;i<a2.length ;i++) 32 { 33 if(i<a.length) 34 { 35 a2[i]=a[i]; 36 } 37 else 38 a2[i]=a[i-a.length]; 39 } 40 System.out.println(" "); 41 System.out.println("循环数组展开为: "); 42 43 for(i=0;i<a2.length;i++) 44 { 45 System.out.print(a2[i]+" "); 46 } 47 System.out.println(" "); 48 //下面代码表示求各子数组大小的过程 49 for(i=0;i<a.length;i++) 50 { 51 sum=0; 52 for(j=i;j<i+a.length;j++) 53 { 54 sum+=a2[j]; 55 System.out.println("第"+count+"个子数组的和为"+sum); 56 b[count-1]=sum; 57 count++; 58 } 59 } 60 max=b[0]; 61 for(i=0;i<b.length;i++) 62 { 63 if(max<b[i]) 64 max=b[i]; 65 } 66 67 System.out.println("最大子数组的和为 :"+max); 68 } 69 70 }