题目要求:查找数组连成环形的和最大的连续子数组
实验代码:
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 }
实验截图:
时间: 2024-10-14 07:09:57