课堂练习-求二维子数组的和最大值以及文件的导入

题目:返回一个整数数组中最大子数组的和02。
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:
数组的行数,
数组的列数,
每一行的元素, (用逗号分开)
每一个数字都是有符号32位整数。 当然, 行数和列数都是正整数。例如下面的文件说明数组是有1行, 6列, 元素依次是: 5, 6, –3, 8, –9, 2

[String fileName = "C:\\Users\\54417\\Desktop\\input.txt";
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        StringBuilder number = new StringBuilder("");
        while ((line = br.readLine()) != null) {
            // 一行一行地处理...
//            System.out.println(line);
            number.append(line);
        }
        String[] split = number.toString().split(",");
        //for (String s : split) System.out.println(s);
        ArrayList<Integer> arrayList=new ArrayList<>();
        for(String s:split){
            if(Integer.parseInt(s)>99999999){
                System.out.println("文件输入数字太大");
            }else {
            arrayList.add(Integer.parseInt(s));
            }
        }
        int n=arrayList.get(0);
        int m=arrayList.get(1);
        int [][] c=new int[arrayList.get(0)][arrayList.get(1)];
        int cnt=2;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                c[i][j]=arrayList.get(cnt);
                cnt++;
                System.out.print(c[i][j]);
                System.out.print(" ");
            }
            System.out.println();
        }
        System.out.println(maxSubArray2(c,n,m));](java)
首先读入文件,使用文件缓冲流,读入到一个字符串中,
然后使用stringbudder类中的append方法,拼接成一个新的字符串,
然后在使用string的spilt函数使用","分割成一个字符串数组,
然后使用Integer中的ParseInt函数转化成整数类型,
存到一个n行m列的数组里,然后传入我的求和方法,进行最大和的计算。
[
    public static int maxSubArray2(int [][]nums,int n,int m){
        int a=1,b=1,c=1,d=1;
        int [][] sums=new int[n+1][m+1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                sums[i][j]=sums[i-1][j]+sums[i][j-1]-sums[i-1][j-1]+nums[i-1][j-1];
            }
        }
        int max=sums[1][1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                for(int x=i;x<=n;x++){
                    for(int y=j;y<=m;y++){
                        if((sums[x][y] - sums[x - i][y] - sums[x][y - j] + sums[x - i][y - j])>max){
                            a=x-i;b=y-j;c=x;d=y;
                        }
                        max= Math.max(max, sums[x][y] - sums[x - i][y] - sums[x][y - j] + sums[x - i][y - j]);
                    }
                }
            }
        }
        System.out.print("左上:"+(a+1)+"行");
        System.out.println(" "+(b+1)+"列");
        System.out.print("右下:"+c+"行 ");
        System.out.println(d+"列");
        return max;
    }](java)
在计算和的函数中,我定义了一个前缀和数组,来提前计算一些数组的和,
然后分别枚举i行j列的数组,使用x,y表示在原数组中的位置,使用前缀和数组来计算原数组中所有i行j列数组中的元素的和。
然后分别进行比较,交换,最后计算出最大值。

posted @ 2022-03-19 14:39  open520  阅读(38)  评论(0)    收藏  举报