zoukankan      html  css  js  c++  java
  • 二维数组中最大子数组的和

    题目:返回一个二维整数数组中最大子数组的和。
    要求:
    输入一个二维整形数组,数组里有正数也有负数。
    二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。 
    思路:
    借鉴网上代码整理得思路;
    根据一位数组最大子数组求和的编程思路,讲二维数组转化成一维数组求解;
    即求出每一行的最大子数组之和,通过比较各行最大子数组之和的大小,求出只有二维数组只有一行的情况下的最大子数组之和;
    然后求每两行最大子数组之和,即将每两行的相同列相加,将二维数组压缩成一维数组,然后步骤同上;
    以此类推,最后求出二维数组中最大子数组之和。
     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<ctime>
     4 using namespace std;
     5 #define M 4
     6 #define N 4
     7 #include <memory.h>  
     8 
     9 int maxSubArray(int *arr, int len)       //最大子序列和  
    10 {
    11     int i, sum = arr[0], b = 0;
    12     for (i = 0; i<len; ++i)
    13     {
    14         if (b>0)
    15             b += arr[i];
    16         else
    17             b = arr[i];
    18         if (b>sum)
    19             sum = b;
    20     }
    21     return sum;
    22 }
    23 int maxSubMatrix(int n, int m, int array[M][N])
    24 {
    25     int i, j, h, max, sum = -100000;
    26     int b[100];
    27     for (i = 0; i<n; i++)
    28     {
    29         memset(b, 0, sizeof(b));       //初始化b[]  
    30         for (j = i; j<n; j++)          //把第i行到第j行相加,对每一次相加求出最大值  
    31         {
    32             for (h = 0; h<m; h++)
    33             {
    34                 b[h] += array[j][h];   //二维数组压缩成一维数组,然后求最大子序列和  
    35             }
    36             max = maxSubArray(b, h);
    37 
    38             if (max>sum)
    39                 sum = max;
    40         }
    41     }
    42     return sum;
    43 }
    44 int main()
    45 {
    46     int arr[M][N];
    47     cout << "随机二维数组为:" << endl;
    48     srand(time(0));
    49     for (int i = 0; i < M; i++)
    50     {
    51         for (int j = 0; j < N; j++)
    52         {
    53             arr[i][j] = rand() % 50-25;
    54             cout << arr[i][j] << " ";
    55         }
    56         cout << endl;
    57     }
    58     cout << maxSubMatrix(M, N, arr) << endl;
    59     return 0;
    60 }

    因为原代码是引用Txt文件中的数组,为产生随机数做出改动,在引用参数时出现int类型的实参与int 类型的形参不兼容的错误,通过网上查找资料改正。

    总结:通过看网络上前辈们的代码,将他们代码的思路和自己的思路进行比较,找出自己的不足,并通过实际敲代码来体会这种差别,受益良多。

  • 相关阅读:
    2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问
    Android小项目之十二 设置中心的界面
    【Mood-5】14条建议,使你的IT职业生涯更上一层楼
    【Android 界面效果15】Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)
    单线程模型中Message、Handler、Message Queue、Looper之间的关系
    140个google面试题
    Android小项目之十一 应用程序的主界面
    Android小项目之十 应用程序更新的签名问题
    Android小项目之九 两种上下文的区别
    Android小项目之八 界面细节
  • 原文地址:https://www.cnblogs.com/SanShaoS/p/4412525.html
Copyright © 2011-2022 走看看