现在的位置: 首页 > 综合 > 正文

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

2018年01月20日 ⁄ 综合 ⁄ 共 1064字 ⁄ 字号 评论关闭
/*
35.
求一个矩阵中最大的二维矩阵(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用 C 写出关键代码

思想很简单,每次计算周围的四个矩阵的元素和
计算二维子矩阵的和(sum=a[i,j]+a[i+1,j]+a[i,j+1]+a[i+1,j+1])  时间复杂度为O(i*j)

因为必须同时计算4个元素,有很多重复计算,所以可以适当减少点  复杂度相同 效率高些 
*/
#include<iostream>
#include<stdio.h>
using namespace std;

int getMax2Array(int a[][5],int row,int col,int ans[])
{
	int i,j,max,ans_i,ans_j,last2Sum,sum;
	
	max=-1; 
	for(i=0;i<row-1;i++)
	{
		last2Sum=a[i][0]+a[i+1][0];//一行开始 
		for(j=1;j<col;j++)
		{
			sum=last2Sum;
			last2Sum=a[i][j]+a[i+1][j];
			sum+=last2Sum;
			if(max<sum)
			{
				max=sum;
				ans_i=i;//行是一样,列减1 
				ans_j=j-1;
			}
		}
	}
	ans[0]=ans_i;//返回最大位置 
	ans[1]=ans_j;
	return max;
}
int main()
{
	int a[3][5]={{1,2,0,3,4},{2,3,4,5,1},{1,1,5,3,0}};
	int b[3][5]={{1,2,0,3,4},{2,3,4,5,1},{1,7,5,3,0}};
	int ans[2],max,i;
	
	max=getMax2Array(a,3,5,ans);
	printf("原来数组中最大二维数组的和为:%d\n",max);
	printf("%d %d\n",a[ans[0]][ans[1]],a[ans[0]][ans[1]+1]);
	printf("%d %d\n",a[ans[0]+1][ans[1]],a[ans[0]+1][ans[1]+1]);
	
	max=getMax2Array(b,3,5,ans);
	printf("原来数组中最大二维数组的和为:%d\n",max);
	printf("%d %d\n",b[ans[0]][ans[1]],b[ans[0]][ans[1]+1]);
	printf("%d %d\n",b[ans[0]+1][ans[1]],b[ans[0]+1][ans[1]+1]);
	
	return 0;
} 

抱歉!评论已关闭.