二维数组中最大子数组的和
题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为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 类型的形参不兼容的错误,通过网上查找资料改正。
总结:通过看网络上前辈们的代码,将他们代码的思路和自己的思路进行比较,找出自己的不足,并通过实际敲代码来体会这种差别,受益良多。