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

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找出最大值就为该矩阵的最大子矩阵所对应的和值.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值