本次实验将一维数组改进为二维数组,,一维数组只需要从开始依次遍历即可,但二维数组则需要将整个矩阵划分为不同的矩阵块。
课堂上很长时间没有思路,最后采用民哥的方法,先对二维数组进行遍历,确认行列数均为一的数组块中的最大值,以及其他较大值,整个二维数组最大值一定包含这个最大值或其他较大值,然后依次比较各子数组块的大小来确定最大值
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(); } }
但最后还存在较多问题,希望园友大神指点!