二维数组

  在一个二维数组中,输出最大的子数组块,并且用文件进行存储。

这个刚开始的时候我想了许多方法,都不能将最优解算出来,但是通过讨论我知道了一种方法:像一行一行的筛选,找出每行的最大值;然后及进行循环一遍之后将第一行和第二行相加,找出最大值,之后在加上第三行比较最大值,之后一行一行的相加,知道全部遍历完。

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;
    }

}

 

posted @ 2019-03-18 19:52  九离  阅读(140)  评论(0编辑  收藏  举报