在一个二维数组中,输出最大的子数组块,并且用文件进行存储。
这个刚开始的时候我想了许多方法,都不能将最优解算出来,但是通过讨论我知道了一种方法:像一行一行的筛选,找出每行的最大值;然后及进行循环一遍之后将第一行和第二行相加,找出最大值,之后在加上第三行比较最大值,之后一行一行的相加,知道全部遍历完。
package hello; import java.util.Scanner; public class App8 { public static int time=1; public static void main(String[] args) throws InterruptedException { Scanner in= new Scanner(System.in); //writeFile(); int hang=7; long sum; String str; long[] num=new long[hang]; //储存数组块 long[] num2=new long [hang]; //循环减去第一个的数据,储存每行数据的值 long max=0; int n,s,start=1,end=1; boolean f=false; sum=in.nextLong(); num[0]=sum; if(sum>0)f=true; for( n=1,s=1;n<hang;n++) { //输入数组,并计算数组块 sum=in.nextLong(); if(num[s-1]*sum>0) num[s-1]+=sum; else { num[s]=sum; s++; } if(sum>0)f=true; } //if(num[0]*num[s]>0) {num[0]+=num[s];num[s]=0;} if(f==true) { max=num[0]; num2[0]=num[0]; for(int i=1;i<s;i++) { //计算以数组下标为0的各个子数组的和 num2[i]=num2[i-1]+num[i]; //if(num2[i]>num2[i-1])max=num2[i]; } for(int i=0,j=0;j<s;) { //循环输出最大子数组块以及相应的起始终止位置,和第几次循环 num2[i]=num2[i]-num[j]; if(num2[i]>max) {max=num2[i];start=j+2;end=i+1;} System.out.println("第 "+time+" 次循环, 已检查 "+time+" 种情况, 当前最大值为"+max+" 当前是第 "+start+" 个元素到第 "+end+" 个元素"); time++; if(i==s-1) {j++;i=j;} else i++; str=in.next(); if(str.equals("n"))continue; else {max=huigun(str,num,s);break;} //使用再次调用该数组进行回滚操作 } } else { //数组中全为负数的算法 max=num[0]; num2[0]=num[0]; for(int i=1;i<s;i++) { num2[i]=num2[i-1]+num[i]; if(num2[i]>max)max=num2[i]; System.out.println("第"+time+"次循环,还剩下"+time+"种情况,当前最大值为"+max); time++; } } System.out.println("最后结果最大值为"+max); in.close(); } private static long huigun(String str, long[] num, int s) throws InterruptedException { long[] num2=new long [s]; long max=0; int n=Integer.parseInt(str),start=1,end=1; max=num[0]; num2[0]=num[0]; int time2=1; time=n; for(int i=1;i<s;i++) { num2[i]=num2[i-1]+num[i]; //if(num2[i]>num2[i-1])max=num2[i]; } for(int i=0,j=0;j<s;) { num2[i]=num2[i]-num[j]; if(num2[i]>max) {max=num2[i];start=j+1;end=i+1;} if(time2>=n) { System.out.println("第 "+time+" 次循环, 已检查 "+time+" 种情况, 当前最大值为"+max+" 当前是第 "+start+" 个元素到第 "+end+" 个元素"); time++; } if(i==s-1) {j++;i=j;} else i++; time2++; //Thread.sleep(1000); } return max; } }