求一个矩阵中最大的二维矩阵(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用C 写出关键代码
#include<stdio.h>
#include<stdlib.h>
//function1:最易懂的方法,每a[i][j],a[i][j+1],a[i+1][j],a[i+1][j+1]计算和,求最大值
void maxmatrix(int* tmp,int row,int col)
{
int result[2][2]={{0,0},{0,0}};
int sum;
int i,j;
int max_sum=0;
int result_i=0;
int result_j=0;
for(i=0;i<row-1;i++)
{
for(j=0;j<col-1;j++)
{
sum=*(tmp+i*col+j)+*(tmp+(i+1)*col+j)+*(tmp+i*col+j+1)+*(tmp+(i+1)*col+j+1);//用指针访问二维数组;
if(sum>max_sum)
{
max_sum=sum;
result_i=i;
result_j=j;
}
}
}
result[0][0]=*(tmp+result_i*col+ result_j);
result[0][1]=*(tmp+result_i*col+ result_j+1);
result[1][0]=*(tmp+(result_i+1)*col+ result_j);
result[1][1]=*(tmp+(result_i+1)*col+ result_j+1);
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d,",result[i][j]);
}
printf("\n");
}
}
//function 2:每a[i][j],a[i+1][j]求和,求每行最大和,算法效率高于方法1
void maxmatrix(int* tmp,int row,int col)
{
int result[2][2]={{0,0},{0,0}};
int i,j;
int result_i,result_j;
int max_sum;
int result_sum=0;
for(i=0;i<row-1;i++)
{
int max_last=*(tmp+i*col)+ *(tmp+(i+1)*col);
for(j=1;j<col;j++)
{
max_sum=max_last;
max_last=*(tmp+i*col+j)+*(tmp+(i+1)*col+j);
max_sum+=max_last;
if(result_sum<max_sum)
{
result_sum=max_sum;
result_i=i;
result_j=j-1;
}
}
}
result[0][0]=*(tmp+result_i*col+ result_j);
result[0][1]=*(tmp+result_i*col+ result_j+1);
result[1][0]=*(tmp+(result_i+1)*col+ result_j);
result[1][1]=*(tmp+(result_i+1)*col+ result_j+1);
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d,",result[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5]={
{1,2,0,3,4},
{22,3,4,1,5},
{11,1,6,3,0}
};
maxmatrix(arr,3,5);
return 1;
}