求一个矩阵中最大的二维矩阵(元素和最大)
2012-03-20 21:07
363 查看
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]
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找出最大值就为该矩阵的最大子矩阵所对应的和值.
求一个矩阵中最大的二维矩阵(元素和最大).如:
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]
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找出最大值就为该矩阵的最大子矩阵所对应的和值.
相关文章推荐
- 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)
- 求一个矩阵中最大的二维矩阵(元素和最大)
- 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)
- 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)
- 35 求一个矩阵中最大的二维矩阵(元素和最大)
- 【每日面试题】求一个矩阵中最大的二维矩阵(元素和最大)
- 求一个矩阵中最大的二维矩阵(元素和最大)
- 每天学习一算法系列(32)(求一个矩阵中最大的二维矩阵(元素和最大))
- 100题求一个矩阵中最大的二维矩阵(元素和最大)
- 一个矩阵中最大的二维矩阵(元素和最大)
- 一个H行L列的二维矩阵数组(整形),求每行的元素总和,并输出最大的那一行的总和
- 每日一道算法题:求一个矩阵中最大的二维矩阵(元素和最大)
- 求一个矩阵中最大的二维矩阵(元素和最大)
- 求一个矩阵中最大的矩阵(元素和最大)(二维情况)
- 【编程题目】求一个矩阵中最大的二维矩阵(元素和最大)
- 微软算法100道题------求一个矩阵中最大的二维矩阵(元素和最大)
- 求一个矩阵中最大的二维矩阵(元素和最大)
- IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)
- 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
- 求一个矩阵中最大的二维矩阵(元素和最大)