二维数组返回子数组块中的最大子数组块

本次实验将一维数组改进为二维数组,,一维数组只需要从开始依次遍历即可,但二维数组则需要将整个矩阵划分为不同的矩阵块。

课堂上很长时间没有思路,最后采用民哥的方法,先对二维数组进行遍历,确认行列数均为一的数组块中的最大值,以及其他较大值,整个二维数组最大值一定包含这个最大值或其他较大值,然后依次比较各子数组块的大小来确定最大值

二维数组返回子数组块中的最大子数组块

package com.fmd.java;

import java.util.Scanner;

public class shuzu {
    public static void main(String[] args) {
        int i,j;
        int lnumber,rnumber,maxsum,maxstart;
        Scanner s = new Scanner(System.in);
        System.out.println("请输入二维数组的行:");
        lnumber = s.nextInt();
        System.out.println("请输入二维数组的列:");
        rnumber = s.nextInt();
        int array[][] = new int[lnumber][rnumber];
        for(i=0;i<lnumber;i++)
        {
            System.out.println("请输入二维数组第"+(i+1)+"行的的值:");
            for(j=0;j<rnumber;j++) {
            array[i][j]=s.nextInt();//依次输入数组元素的值
            }
        }
        maxsum = array[0][0];
        maxstart = array[0][0];
        for(i=0;i<lnumber;i++) {  //将最大子数组和与开始位置的值分别定义变量,让开始位置值参与循环,每次循环后更新最大子数组和的值,直到循环结束
            for(j=0;j<rnumber;j++) {
                if(maxstart<0) {
                    maxstart = 0;  //如果maxstart小于0,则另maxstart等于0,然后maxstart在自身基础上加上下一个数组元素
                }
                maxstart+=array[i][j];  //maxstart=maxatrat+array[i][j];
                if(maxstart>maxsum) {  
                    maxsum = maxstart;  //再判断maxstart与maxsum的大小,若maxstart大于maxsum,则maxsum的值为maxstart,maxstart的值不变
                }
            }
        }
        System.out.println("输入的数组为:");
        for(i=0;i<lnumber;i++) {
            for(j=0;j<rnumber;j++) {
                System.out.println(array[i][j]+"\t");
            }
            System.out.println();
        }
        System.out.println("最大子数组的和为:");
        System.out.println(maxsum);
        s.close();
    }
}

但最后还存在较多问题,希望园友大神指点!

上一篇:范围for语句for auto详解(C++11新特性)


下一篇:并发编程---------可重入锁