最大连续一维子数组过程遍历回滚:
在最大子数组的前提下,遍历具体计算过程,并且可以回滚查看步骤,下面是我的输出结果
输入数组长度:5
输入数组元素:1 2 3 4 5
实验代码如下:
/* * 最大子数组 * 最大子数组的和 * 检查的那个最大子数组 * * 4.25 + 步骤回滚 */ package wodeshiyao; import java.util.Scanner; public class lalala { static String[] demo = new String[100]; static Scanner scan=new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub int n = 1; int b;//数组长度 System.out.println("请输入数组长度:"); b=scan.nextInt(); //扫描下一行,获取数组长度 int a[]=new int [b]; //定义规定长度的整型数组 System.out.println("请输入数组元素:"); for(int i=0;i<b;i++) //用for循环逐个扫描录入各个数组元素 { a[i]=scan.nextInt(); } int i,j,k; int max[]=new int [b];//max 存放数组和的值的数组 for(i=0;i<b;i++){ //找出以第i个元素开头的子数组的最大值 max[i]=a[i]; k=a[i]; demo[n-1] = "第" + n + "步:" +"此时的最大子数组和为" + k + ",从" + a[i] + "到" + a[i] + "的和。"; n++; System.out.println("此时以第"+(i+1)+"个元素开头的子数组的最大值为:"+k); for(j=i+1;j<b;j++){ //第i个元素到第j个元素的和的最大值 k=k+a[j]; if(k>max[i]) { max[i]=k; demo[n-1] = "第" + n + "步:" +"此时的最大子数组和为" + k + ",从" + a[i] + "到" + a[j] + "的和。"; n++; } } } int m=max[0]; for(i=1;i<b;i++) //找出max数组的最大值 { if(max[i]>m) { m=max[i]; } } System.out.println("所有连续子数组和的最大值为:"+m); System.out.println("--------------------------------"); for(int g = 0 ; g < b*(b+1)/2; g++) { System.out.println(demo[g]); } System.out.println("--------------------------------"); System.out.println("请输入需要开始回滚的步数:"); int v = scan.nextInt(); for(int g = v-1; g < b*(b+1)/2; g++) { System.out.println(demo[g]); } } }
同样适用正负数混合一维数组数组。