zoukankan      html  css  js  c++  java
  • 二维数组

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

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

    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;
        }
    
    }
  • 相关阅读:
    Tiny6410 交叉编译helloworld程序
    Tiny6410 设备驱动之helloworld
    Tiny6410 LED字符设备驱动
    STM32移植UCGUI3.90笔记
    USB2.0学习笔记连载(十九):EZ-USB TRM手册重要部分介绍
    USB2.0学习笔记连载(十八):keil实现寄存器的配置及相关函数讲解(二)
    USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)
    USB2.0学习笔记连载(十七):keil实现寄存器的配置及相关函数讲解(一)
    USB学习笔记连载(十五):USB固件更新以及安装驱动
    USB学习笔记连载(十六):USB数字签名
  • 原文地址:https://www.cnblogs.com/huan-ch/p/11070210.html
Copyright © 2011-2022 走看看