• 返回一个整数数组中最大子数组的和4


    题目:返回一个二维整数数组中最大子数组的和。
    要求:
    1 输入一个二维整形数组,数组里有正数也有负数。
    2 二维数组首尾相接,象个一条首尾相接带子一样。
    3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    4 求所有子数组的和的最大值。要求时间复杂度为O(n)。
    设计思想
       目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案
    源代码
    题目:返回一个二维整数数组中最大子数组的和。
    要求:
    1 输入一个二维整形数组,数组里有正数也有负数。
    2 二维数组首尾相接,象个一条首尾相接带子一样。
    3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    4 求所有子数组的和的最大值。要求时间复杂度为O(n)。
    设计思想
       目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案
    源代码
    #include<iostream>
    #include<time.h>
    #include<conio.h>
    #include<fstream>
    using namespace std;
    ofstream out;
    void RandIn(int RowIntNum,int ColIntNum,int A[][100])//随机生成一个二维数组
    {
        for(int i=0;i<RowIntNum;i++)
        {
            for(int j=0;j<ColIntNum;j++)
            {
                A[i][j]=-(int)rand()%201+100;
                cout<<A[i][j]<<'	';
            }
            cout<<endl;
        }
    }
    int MaxArray(int array[],int Maxsize,int &Location)
    {
        int max=array[0];//生成最大数值
        Location=0;//最大数值下标位置初始化
        for(int i=0;i<Maxsize;i++)
        {
            if(max<array[i])
            {
                max=array[i];
                Location=i;
            }
        }
        return max;
    }
    void DivANum(int A[][100],int RowIntNum,int ColIntNum,int SubRowNum,int SubColNum,int EveTSum[],int &Location,int Times)
    {
        int sum[10000];//记录子矩阵的和
        int ArrayNum=0;//生成子矩阵的数目
        int count=0;//子矩阵累加次数
        for(int row=0;row<RowIntNum-SubRowNum+1;row++)
        {
            for(int col=0;col<ColIntNum;col++)//求所有子矩阵
            {
                sum[ArrayNum]=0;
                for(int p=row;p<row+SubRowNum;p++)//求得子矩阵的和
                {
                    for(int q=col;q<col+SubColNum;q++)
                    {
                        sum[ArrayNum]+=A[p][q%ColIntNum];
                    }
                }
                ArrayNum++;//记录生成的子矩阵数
            }
        }
        EveTSum[Times]=MaxArray(sum,ArrayNum,Location);//记录每次生成的子矩阵中的最大子矩阵数值
    }
    void Print(int row,int col, int array[][100])
    {
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                out<<array[i][j]<<',';
            }
            out<<'
    ';
        }
    }
    void main()
    {
        out.open("text.txt");
        srand((unsigned)time(NULL));
        int Location[100];//记录每次最大子数组的位置
        int A[100][100],RowIntNum,ColIntNum;
        int SubRowNum,SubColNum;
        int max=0,LocTimes=0;
        int EveTSum[10000];
        int q=0;
        while(q==0)
        {
            cout<<"请输入行数:";
            cin>>RowIntNum;
            out<<RowIntNum<<',';
            cout<<"请输入列数:";
            cin>>ColIntNum;
            out<<ColIntNum<<','<<'
    ';
            cout<<"整数内容"<<endl;
            RandIn(RowIntNum,ColIntNum,A);//随机生成RowIntNum行,ColIntNum列的数组
            Print(RowIntNum,ColIntNum,A);
            for(SubRowNum=1;SubRowNum<=RowIntNum;SubRowNum++)
            {
                for(SubColNum=1;SubColNum<=ColIntNum;SubColNum++)
                {
                    DivANum(A,RowIntNum,ColIntNum,SubRowNum,SubColNum,EveTSum,Location[(SubRowNum-1)*RowIntNum+SubColNum-1],(SubRowNum-1)*RowIntNum+SubColNum-1);
                }
            }
            cout<<"输出最大矩阵的和"<<endl;
            max=MaxArray(EveTSum,(SubRowNum-1)*(SubColNum-1),LocTimes);
            cout<<max<<endl;
            out<<max;
            out.close();
            cout<<"是否继续测试(输入0继续)"<<endl;
            cin>>q;
            system("cls");
        }
    }

    程序截图

    实验总结

    此次试验的收获就是熟悉了%和for循环语句的配合对于数组问题产生的效果,对于达到时间复杂度达到o(n),想出的方法大多都无法达到要求,只能再查找资料找寻新的思路了,之后会贴在下面。

  • 相关阅读:
    Zabbix5 Frame 嵌套
    Zabbix5 对接 SAML 协议 SSO
    CentOS7 安装 Nexus
    CentOS7 安装 SonarQube
    GitLab 后台修改用户密码
    GitLab 查看版本号
    GitLab Admin Area 500 Error
    Linux 安装 PostgreSQL
    Liger ui grid 参数
    vue.js 是一个怪东西
  • 原文地址:https://www.cnblogs.com/littilsaber/p/4562075.html
Copyright © 2020-2023  润新知