求数组最大子数组的和(循环数组)

  这次课上,把求最大子数组的问题进行了拓展,想象原始数组是一个像手环一样首位相连的结构,求最大子数组的和。我们知道,在中学的时候,涉及环状,包括圆柱体,圆锥体我们都会把它剪开,化简为平面问题。我想环状数组也可以这样来简化。

  例如原始数组为 1 2 3 ,我们可以从3处剪开,再添上前面的两个数,变成 1 2 3 1 2,这样就可以在一维数组中求解。

  上次的代码可以复制过来用,只需要修改几个地方即可:1.添加新的数组,用来存储环状数组变化成一维数组后的值 2.修改子数组个数为 i 方 3.第二次for循环条件的修改,保证环状数组每个元素的子数组都可取到最大。

  

 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 }
View Code

 

posted @ 2019-03-16 11:33  Aduoee  阅读(188)  评论(0编辑  收藏  举报