欲求矩阵对角线元素之和最大元素

29. 微软面试题:求一个矩阵中最大的二维矩阵(元素和最大) - 推酷
29. 微软面试题:求一个矩阵中最大的二维矩阵(元素和最大)
题目:求一个矩阵中最大的二维矩阵(元素和最大).如:
中最大的是:
要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码
直接遍历二维数组,求出最大的二维数组就OK了
实现如下:
#include&iostream&
int max_matrix(int (*array)[5], int maxx, int maxy, int& posi, int& posj)
int max = 0;
int i = 0, j = 0;
while(i & maxx - 1)
while( j & maxy - 1)
int t = array[i][j] + array[i+1][j] + array[i][j+1] + array[i+1][j+1];
if( max & t)
int main()
int a[3][5] = {{1,2,0,3,4}, {2,3,4,5,1}, {1,1,5,3,0}};
int i = 0, j = 0;
int max = max_matrix(a, 3, 5, i, j);
cout && &max num: & && max &&
cout && &matrix: & &&
cout && a[i][j] && & & && a[i][j+1] &&
cout && a[i+1][j] && & & && a[i+1][j+1] &&
输出如下:
max num: 17
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致求最大子矩阵及最大权值子矩阵
&&&&求最大子矩阵:给出一个矩阵,其中一些地方有障碍物,问不包含障碍物的最大子矩阵有多大。
①:枚举左上角和右下角,进行判断。用前缀和判断可使时间降为O(n^2*m^2)
该算法计算了太多冗余情况,事实上,我们应该只考虑那些极大子矩阵。
极大子矩阵:四边都不能再扩张的合法子矩阵,即其边上和内部都没有障碍物。
容易知道,最大子矩阵一定是极大子矩阵,所以,问题关键在于找出极大子矩阵。
②:算法时间与障碍物数量S有关:O(S^2)。
将所有障碍物按横坐标排序,然后枚举一个障碍物v1,以其为子矩阵的左边界,同时记临时的上边界和下边界。再往后扫描。每次扫描到一个障碍物v2,就以其为子矩阵右边界,计算子矩阵大小,然后更新上下边界值。即当v2纵坐标比v1小时,更新下边界值,比v1大时,更新上边界值。更新时,都是使子矩阵缩小,而不可增大。相等时可移动左边界。为了方便处理和减少遗漏,还应将矩阵的四个角当成障碍物加入其中。(此处边界上的点不算入子矩阵中)
举例说明:以3为左边界,此时的上、下、左边界用红线表示。
枚举右边界为4时,计算子矩阵大小,并更新上边界:
枚举右边界为5时,继续:
就这样做下去,貌似可以解决问题,但是还有两种情况没有考虑到。
对于这两种情况,只要我们将横、纵坐标交换,矩阵的长、宽交换,再处理一次即可。
上述方法编程简单,但是障碍物密集时不再适用。于是,我们用另一种算法。
③:算法时间与矩阵大小有关:O(nm)。&&&
对于每个点,设置一条以其为底的线,线上没有障碍物,并且尽量长。记H[i][j]为该线的高度。L[i][j]为线向左移动不碰到障碍物的最远位置,R[i][j]为线向右移动不碰到障碍物的最远位置。那么,从L[i][j]到R[i][j],线扫过的面积就是子矩阵的大小。容易得到递推方程:
当(i,j)是障碍物,H[i][j] = L[i][j] = R[i][j] = 0; 否则
&&& H[i][j] =
H[i-1][j]+1。
&&& L[i][j] =
max(L[i-1][j],(i,j)左边第一个障碍物位置+1)。
&&& R[i][j] =
min(R[i-1][j], (i,j)右边第一个障碍物位置+1)。
求出H、L、R后,就可以快速得出所有极大子矩阵的大小,进而求出最大子矩阵。
矩阵很大的时候,可以离散化处理。
最大权值子矩阵:在一个有障碍物且各格权值非负的矩阵中,找出不包含障碍物的权值和最大的子矩阵。
分析:所求子矩阵一定是极大子矩阵。那么用上述方法可求出答案。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列好_百度知道
有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列好
提问者采纳
%d最大数\
max=a[0][0]#include&lt,d),8};;
c=i,11;i&lt,c; for(i=0;
d=j,max,6,3,j;n%d行号\i++) {for(j=0;void main(){int a[3][4]={{1;n%d列号&
printf(&=a[i][j])
{max=a[i][j];j&lt,d;j++)
if(max& int i,10;4,{5;3,max,4},2,c,12}},{9,7.h&stdio
来自团队:
其他类似问题
为您推荐:
行号的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和
int main()
int sum=0;
int max1,max2;//记录最大值的坐标
int min1,min2;//记录最小值的坐标
int a[4][4];
//为数组赋值
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
max=min=a[0][0];//初始化最大值最小值都为数组的第一个元素值a[0][0]
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(max=a[i][j])
min=a[i][j];
min1=i,min2=j;
printf("%d %d\n",max,min);
printf("max(%d,%d)
min(%d %d)\n",max1,max2,min1,min2);
//求两条主对角线元素之和
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i==j||(i+j==3))//关键(j==3-i)
sum=sum+a[i][j];
printf("sum=%d\n",sum);
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'求出一个矩阵中的最大值和位置
function y=max_cmn(x);
[r,c]=size(x);
if x(i,j)&t
&& y=max_cmn(A)
从网上看到的更好的方法:
function y=max_cmn(x);
[C1,I1]=max(x);
[C2,I2]=max(C1);
y=[C2,I1(I2),I2];
&& y=max_cmn(A)
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
#include &stdio.h&#include &string.h&#define N 10
/*宏定义*/int max,
By Long Luo 个人博客地址 上次在迅雷面试的时候,遇到了一个算法题,题目是: 有一个很长很长的字符串,全部都是由大写字母组成,要求求出其中每个字母在这个字符串中出现的次数. 不允许使用STL中的方法. 当时拿到这个题目,我首先想到了以下几个方法: 穷举法,一个个比较,最后算出每个字母出现的次数,这种方法可行,但不轻巧与优雅. 每个字符与'A'想减, ...
/*************************************************************名称:strcountinstring功能:计算一个字符在一个字符串中出现的次数参数:sourcestr,源字符串:
findstr,需要查找的字符串:返回:findcount,统计次数******************** ...
题目描述 如题,且无重复元素 思路 用分治法,把数组分成2组,2组内分别用两两比较淘汰的方法找出各自的最大值(一共n-1次比较), 最后出来的2个最大值比较,较大的那个是最大值,第二大的值在较小的那个和所有跟最大值比较过的元素(一共log_2 n -1个)之间产生.只需用较小的那个 和 log_2 n -1个与最大值比较过的元素分别比较一次 (这里又需要lo ...
这篇文章主要为大家介绍了字符串中最多的重复字符的计算代码,需要的朋友可以参考下 如需引入外部Js需刷新才能执行]
//第一个只出现一次的字符 char FirstNotRepeatingChar(char *pString) { if (pString == NULL) return '\0'; const int tableSize = 256; unsigned int hasTable[tableSize]; for (unsigned int i = 0; i
今天面试的一道题目是这样的,假设有一个数组,求出数组中的最大值,我使用的方法是: 1 var a = [3, 10, 5, 8, 12, 15]; 2 3 function compare(value1, value2) { 4 if (value1 & value2) { 5 return -1; 6 } else if (value1 & v ...
一,题目:求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码二,分析: 假设最大子矩阵的结果为从第r行到k行.从第i列到j列的子矩阵,如下所示(ari表示a[r][i],假设数组下标从1开始):
| a11 -- a1 ...

我要回帖

更多关于 矩阵对角线元素之和 的文章

 

随机推荐