zoukankan      html  css  js  c++  java
  • 个人作业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循环,有的想法想起来简单,但是用代码写出来很困难,接下来我会想法简化这个代码,降低时间复杂度。

  • 相关阅读:
    spring读取配置文件内容并自动注入
    xshell免费下载安装使用
    cas sso原理
    sql两列相除,保留n位小数
    mysql 报zone什么的错误
    mysql union出错: "Every derived table must have its own alias"
    mysql jdbc操作
    sql 对某列取值进行if判断
    Python深入:02浅拷贝深拷贝
    Python基础:22__slots__类属性
  • 原文地址:https://www.cnblogs.com/liujinxin123/p/10584301.html
Copyright © 2011-2022 走看看