个人作业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]+"	");
            }
            System.out.println("");
        }
    }

}

结果截图:

总结:

     虽然最后结果是对的,但是时间复杂度太大,运用了太多的for循环,有的想法想起来简单,但是用代码写出来很困难,接下来我会想法简化这个代码,降低时间复杂度。

原文地址:https://www.cnblogs.com/liujinxin123/p/10584301.html