首页 > 代码库 > 查找数组连成环形的和最大的连续子数组

查找数组连成环形的和最大的连续子数组

 1 package zuoYe;
 2  
 3 import java.util.Scanner;
 4  
 5  
 6 public class MaxSubArray {
 7     public static void main(String[] args) {
 8         Scanner scan = new Scanner(System.in);
 9          
10          
11         //输入数据
12         System.out.println("请输入数组长度");
13         int n = scan.nextInt();
14         int[] a = new int[n];
15          
16         System.out.println("请输入数组元素");
17         for(int i = 0;i < n;i++)
18         {
19             a[i] = scan.nextInt();
20         }
21         scan.close();
22         //计算此数组的和最大的连续子数组
23         int[] result = maxSub(a,a.length);
24         System.out.println("不连接成环的和最大的连续子数组:");
25         for(int i = result[0];i <= result[1];i++)
26         {
27             System.out.print(a[i] + "\t");
28         }
29         System.out.println("和为:" + result[2]);
30      
31      
32          
33          
34         //将此数组连成一个环,再计算此数组的和最大的连续子数组
35         //连成一个环即将数组后再接上此数组,但是数组的最后一个元素不用接,相当于计算接上之后的数组的和最大子数组
36         int[] b = new int[2 * n - 1];
37         for(int i = 0;i < n - 1;i++)
38         {
39             b[i] = a[i];
40             b[n + i] = a[i];
41         }
42         b[n - 1] = a[n - 1];
43         int[] result2 = maxSub(b,n);
44         System.out.println("\n\n将数组连成环后的和最大的连续子数组:");
45         for(int i = result2[0];i <= result2[1];i++)
46         {
47             System.out.print(b[i] + "\t");
48         }
49         System.out.println("和为:" + result2[2]);
50  
51          
52     }
53      
54      
55      
56      
57     //计算a数组的和最大的连续子数组(a数组为连成环后的等价数组,即原数组的二倍,n为原数组的长度)
58     public static int[] maxSub(int[] a,int n)
59     {
60         int an = a.length;//连成环的等价数组的长度
61         int currectSum = a[0];//记录当前累加和,初始值为a[0]
62         int currectStartIndex = 0;//记录当前累加的起始下标,初始值为0
63         int count = 1;//记录累加元素的个数,初始值为1
64         int[] result = new int[3];//记录结果子数组的信息,
65         result[0] = 0;//结果子数组的开始下标
66         result[1] = 0;//结果子数组的结束下标
67         result[2] = a[0];//结果子数组的和
68         for(int i = 1;i < an;i++)//依次遍历a数组的每个元素
69         {
70             if(currectSum <= 0)//如果当前累加和不大于0,不大于0对后续的元素没有贡献,可以去掉了,所以应从a[i]处重新开始加
71             {
72                 currectSum = a[i];//将当前累加和赋值为a[i]
73                 currectStartIndex = i;//将当前累加的开始下标赋值为i
74                 count = 1;//将累加元素的个数记为1
75             }
76             else//当前累加和大于0,则继续加a[i]
77             {
78                 currectSum += a[i];
79                 count++;//当前累加元素的个数加一
80             }
81             if(currectSum > result[2])//如果当前累加和大于原结果数组的累加和result[2],则应该将结果子数组信息更新为当前子数组,因为当前子数组的累加和大于结果子数组的和
82             {
83                 result[0] = currectStartIndex;//结果子数组的开始下标为当前子数组的开始下标
84                 result[1] = i;//结果子数组的结束下标赋值为i
85                 result[2] = currectSum;//结果子数组的累加和赋值为当前子数组的累加和
86             }
87             if(count >= n)//如果累加的元素个数等于原数组(未连成环的数组)的长度,则说明已经加了最多的元素,不能再加了,也就是说和最大的子数组即为原数组,应该结束循环
88             {
89                 break;
90             }
91         }
92         return result;
93     }
94      
95      
96      
97 }

 

查找数组连成环形的和最大的连续子数组