• 结对编程之求二维数组最大子数组和


    1.题目:

    返回一个二维整数数组中最大子数组的和。

    2.要求:

    输入一个二维整形数组,数组里有正数也有负数。
    二维数组首尾相接,象个一条首尾相接带子一样。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    3.设计思路:

     分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。

    4.源代码:

     1 #include<iostream>
     2 using namespace std;
     3 #include <ctime>
     4 #include <cstdlib>
     5 #define MAX 10000 
     6 int Max(int b[])
     7 {
     8     int m[MAX],n=0,p=0;
     9     for(int i=0;i<4;i++)
    10     {
    11         for(int j=0;j<4;j++)
    12         {
    13             n=n+b[i+j];
    14             m[p]=n;
    15             p++;
    16         }
    17         n=0;
    18     }
    19     int max=m[0];
    20     for(i=0;i<p;i++)
    21     {
    22         if(m[i]>max)
    23             max=m[i];
    24     }
    25     return max;
    26 }
    27 
    28 int main()
    29 {
    30     int k[MAX],a[4][8],h[8];
    31     srand(time(0));
    32     cout<<"该矩阵为:"<<endl;
    33     for(int i=0;i<4;i++)
    34     {
    35         for(int j=0;j<4;j++)
    36         {
    37             a[i][j]=rand()%100-50;
    38             a[i][j+4]=a[i][j];
    39             cout<<a[i][j]<<" ";
    40         }
    41         cout<<endl;
    42     }
    43     for(i=0;i<4;i++)
    44     {
    45         k[i]=Max(a[i]);
    46     }
    47     int  q=4;
    48     for(i=0;i<3;i++)
    49     {
    50         int    t=0;
    51         for(int j=0;j<8;j++)
    52         {
    53             
    54             h[t]=a[i][j]+a[i+1][j];
    55             t++;
    56         }
    57         k[q]=Max(h);
    58         q++;
    59     }
    60     for(i=0;i<2;i++)
    61     {
    62         int    t=0;
    63         for(int j=0;j<8;j++)
    64         {
    65             
    66             h[t]=a[i][j]+a[i+1][j]+a[i+2][j];
    67             t++;
    68         }
    69         k[q]=Max(h);
    70         q++;
    71     }
    72     int t=0;
    73     i=0;
    74     for(int j=0;j<8;j++)
    75     {
    76         
    77         h[t]=a[i][j]+a[i+1][j]+a[i+2][j]+a[i+3][j];
    78         t++;
    79     }
    80     k[q]=Max(h);
    81     q++;
    82     cout<<endl;
    83     int max=k[0];
    84     for(i=0;i<q;i++)
    85     {
    86         if(k[i]>max)
    87             max=k[i];
    88     }
    89     cout<<"最大子矩阵的值为:"<<endl;
    90     cout<<max;
    91     return 0;
    92 }

    5.结果截图:

    6.心得体会:

    一次次的程序延伸,一次次的修改代码,让我们组对于子数组求和的理解更深了,但题目千变万化,我们还是要多多学习的,争取做到再难再复杂的变化也能攻破吧。

  • 相关阅读:
    高级前端工程师面试必备(持续更新中)
    用node编写cli工具
    用vscode开发vue应用
    jsbridge的js封装
    react-create-app 构建react项目的流程以及需要注意的地方
    【面试篇】寒冬求职季之你必须要懂的原生JS(中)
    基于vue-cli3.0构建功能完善的移动端架子,主要功能包括
    @vue/cl构建得项目下,postcss.config.js配置,将px转化成rem
    eslint prettier editrorconfig
    数据结构题集--集锦
  • 原文地址:https://www.cnblogs.com/zhengt/p/4391645.html
Copyright © 2020-2023  润新知