个人作业1-数组(二维数组)
要求:求二维数组最大子数组
设计思想:
最开始的思路是先求出每行的最大子数组,保留最大子数组的首末位置,之后每两行之间确定最大框,之后逐渐确定框的位置。
出现的问题:
需要考虑的情况太多,意外太多,算法设计太过困难,最后卡在了如何将两行的框合并成三行的框。
新的设计思想:
在之前的思路走不通之后,我选择采用比较笨的方法,那就是将所有的框的值全部算出来进行比较,并且设置四个变量来保存框的位置。
出现的问题:
最后的结果很大,与正确结果不符。
解决方法:
在每次与保存的最大子数组比较完后将求和的变量进行归零。
源代码:
import java.util.Scanner; public class Zuidazishuzu { public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.println("请输入二维数组的行、列:"); int x; int y; x=in.nextInt(); y=in.nextInt(); int[][] a=new int[x][y]; for(int i=0;i<x;i++) { for(int t=0;t<y;t++) { a[i][t]=in.nextInt(); } } int maxstart=0; int maxsum=a[0][0]; int line_first=0,line_second=0; int row_first=0,row_second=0; for(int row=0;row<y;row++)//列 { for(int line=0;line<x;line++)//行 { for(int line_1=line;line_1<x;line_1++)//行 { for(int row_1=row;row_1<y;row_1++)//列 { for(int line_2=line;line_2<=line_1;line_2++)// { for(int row_2=row;row_2<=row_1;row_2++)//列 { maxstart=maxstart+a[line_2][row_2]; } } if(maxsum<=maxstart) { maxsum=maxstart; line_first=line; row_first=row; line_second=line_1; row_second=row_1; } maxstart=0; } } } } System.out.println("最大子数组和为:"+maxsum); System.out.println("最大子数组为:"); for(int line=line_first;line<=line_second;line++) { for(int row=row_first;row<=row_second;row++) { System.out.print(a[line][row]+"\t"); } System.out.println(""); } } }
结果截图:
总结:
虽然最后结果是对的,但是时间复杂度太大,运用了太多的for循环,有的想法想起来简单,但是用代码写出来很困难,接下来我会想法简化这个代码,降低时间复杂度。