查找矩阵鞍点(时间复杂度还可以)

Posted cstdio1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找矩阵鞍点(时间复杂度还可以)相关的知识,希望对你有一定的参考价值。

鞍点(注意:这里是二维数组中的)的定义:在行中最大,并且在列中最小的数。

很容易理解,如下面2个例子

1    3    5                 4    5    7

2    4    6                 3    8    5

5    6    7                 6    9    4

2个3*3的数组,第一个有一个鞍点,1行3列的5,第二个没有鞍点。

 

在网上随便看了下关于求鞍点的C程序,发现都不够严谨,遇到稍微特殊一点的情况,可能就找不出鞍点,例如

1    5    5

2    8    7

3    4    9

这个数组明显有一个鞍点1行3列的5,但是用网上比较随意的求鞍点的C程序是找不出这个鞍点的!原因在于,他们的C程序只比较了(1,2)的5是不是在第2列中最小,而(1,3)中的5并没有判断。如果把上例中的(3,2)的4改为6(比5大),那么(1,2)中的5也是一个鞍点,也就是说这个数组有2个鞍点!

看一下下面更特殊的情况:

7    8    9           6    6    6

3    3    3           6    6    6

5    6    7           6    6    6

第一个数组 中第二行的3,第二个数组中所有的6,都满足鞍点定义:在行中最大,并且在列中最小的数!  这些都是鞍点!

#include <iostream>

using namespace std;

int main()
{
const int a = 15,b = 15;
int m, n, i, j, max_num, min_num, flag = 0,x ,y;
int arrary[a][b], hang[a][b] = {-999}, lie[a][b] = {-999};//辅助的2个二维数组
//cout << "Hello world!" << endl;
cout << "请输入二维数组的行数: " ;
cin >> m;
cout << "请输入二维数组的行数: ";
cin >> n;
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
cin >> arrary[i][j];
}
for( i = 0;i < m;i++)
{
max_num = arrary[i][0];
for(j = 0;j < n;j++)
{
if(max_num == arrary[i][j])
{
max_num = arrary[i][j];
x = i; y = j;
hang[i][j] = arrary[i][j];
}
if(max_num > arrary[i][j])
hang[i][j] = -999;
if(max_num < arrary[i][j])
{
hang[x][y] = -999;//将之前最大的指覆盖掉
max_num = arrary[i][j];
x = i; y = j;
hang[i][j] = arrary[i][j];
}

}

}


for(j = 0;j < n;j++)
{
min_num = arrary[0][j];
for(i = 0;i < m;i++)
{
if(min_num == arrary[i][j] )
{
min_num = arrary[i][j];
x = i; y = j;
lie[i][j] = arrary[i][j];
}
if(min_num < arrary[i][j])
lie[i][j] = -999;
if(min_num > arrary[i][j])
{
lie[x][y] = -999;
min_num = arrary[i][j];
x = i; y = j;
lie[i][j] = arrary[i][j];
}
}

}
/*
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
cout <<lie[i][j] <<" ";
cout <<" ";
}

return 0;*/

//cout << "鞍点坐标和值分别是: ";
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
if(hang[i][j] == lie[i][j] && hang[i][j] != -999)
{
flag++;
cout << "第" << i+1 <<"行" << "第" << j+1 <<"列:" << lie[i][j] << endl;
}
}
if(!flag) cout <<"没有鞍点! " << endl;
return 0;
}











































































以上是关于查找矩阵鞍点(时间复杂度还可以)的主要内容,如果未能解决你的问题,请参考以下文章

矩阵鞍点的算法,用c++实现。

二分查找74. 搜索二维矩阵

算法笔记_130:行列递增矩阵的查找(Java)

c语言问题 找矩阵中的鞍点

算法 主定理

C问题---在杨氏矩阵中查找