求一个矩阵中最大的二维矩阵(元素和最大)

来源:互联网 发布:动态宣传图制作软件 编辑:程序博客网 时间:2024/05/16 12:07
35.(矩阵)
求一个矩阵中最大的二维矩阵(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码


遍历每个二维矩阵,记录和最大的index。时间复杂度O(m*n)




//coder:Lee,20120320


#include<iostream>
#include<cassert>
using namespace std;


struct Index
{
int indexRow;
int indexCol;
};
//Output: left-up index
Index Max2DInMatrix(int A[][5],int row,int col)
{
assert(A!=NULL&&*A!=NULL&&row>1&&col>1);
Index leftUpIndex;
leftUpIndex.indexRow=0;
leftUpIndex.indexCol=0;
int maxSum=-999999;
int tempSum=0;
for(int i=0;i<row-1;i++)
for(int j=0;j<col-1;j++)
{
tempSum=A[i][j]+A[i+1][j]+A[i][j+1]+A[i+1][j+1];
if(tempSum>maxSum)
{
maxSum=tempSum;
leftUpIndex.indexRow=i;
leftUpIndex.indexCol=j;
}
}
return leftUpIndex;
}
int main()
{
int A[3][5]={{1 ,2 ,0 ,3 ,4},{2 ,3 ,4 ,5 ,1},{1 ,1 ,5 ,3 ,0}};
Index index=Max2DInMatrix(A,3,5);
for(int i=index.indexRow;i<=index.indexRow+1;i++)
{
for(int j=index.indexCol;j<=index.indexCol+1;j++)
cout<<A[i][j]<<" ";
cout<<endl;
}
return 0;
}




扩展:参考http://blog.csdn.net/yuucyf/article/details/6717435
如果题目是要求求最大的子矩阵呢,那么我们就可以把矩阵每一竖直方向的排列,看做一个元素。
所以,矩阵就转化成了我们熟悉的一维数组。
即以上矩阵,相当于:
a[1->n][1] a[1->n][2] ... a[1->n][i] .. a[1->n][j] .. a[1->n][n]
1->n 表示竖直方向,其中a[1->n][1]表示第一列中的所有元素相加后的值。
那么,假定是5X5矩阵,那解法是:
第一行:a[1-5][1]  a[1-5][2]  a[1-5][3] a[1-5][4] a[1-5][5] 形成一个一维数组,该数组的最大和值


为Sum1.


第二行:a[2-5][1]  a[2-5][2]  a[2-5][3] a[2-5][4] a[2-5][5] 形成一个一维数组,该数组的最大和值


为Sum2.


第三行:a[3-5][1]  a[3-5][2]  a[3-5][3] a[3-5][4] a[3-5][5] 形成一个一维数组,该数组的最大和值


为Sum3.


第四行:a[4-5][1]  a[4-5][2]  a[4-5][3] a[4-5][4] a[4-5][5] 形成一个一维数组,该数组的最大和值


为Sum4.


第五行:a[5][1]  a[5][2]  a[5][3] a[5][4] a[5][5] 形成一个一维数组,该数组的最大和值为Sum5.


然后比较Sum1到Sum5找出最大值就为该矩阵的最大子矩阵所对应的和值.
原创粉丝点击