目录
- 在一个 m 行 n 列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从 上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组 中是否含有该整数。
杨氏矩阵就是每一行每一列都是数字都按递增排序;
比如这道题我拿下面这个杨氏矩阵来查找数字7

首先大家都会想到遍历整个二维数组找数字7,这样肯定可以,但是复杂度较高;
方法一:复杂度较高不推荐
#include<stdio.h>
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int i = 0;
int k = 0;
scanf("%d", &k);
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
if (arr[i][j] == k)
{
printf("找到了\n");
return 0;
}
}
}
printf("没找到\n");
return 0;
}
方法二:
我们可以根据矩阵的特性来思考,我们观察上面这个矩阵可以知道3是矩阵它所在一行中最大的元素,是他所在这一列最小的元素,所以我们从这里入手。
如果要查找的一个元素k比3大(因为这一行中3最大)所以这一行的元素都不可能找到k,我们就可以去掉一行,当我们要查找的数字k比3小,我们就可以去掉一列。
接下来我们演示一下如何找到7的
首先拿3与要查找的元素7比较,7>3所以这一行都没有要查找的元素7,我们就去掉一行
我们在与6比较,7>6(6是这一行最大的元素),所以不能找到要查找的元素7,去掉一行
我们要查找的元素7在于9比较,这时发现9>7,因为9是这一行中最大的元素,所以右边的一列肯定比9要小,所以我们去掉9这一列;
我们要查找的元素7在与8比较,发现8>7,去掉一列
最后在7与7比较,发现相等就找到了。
代码实现:
#include<stdio.h>
int find_matrix(int matrix[][3], int row, int col, int k)
{
int x = 0;
int y = col - 1;//把初始要比较的元素放到右上角
while (x < row&& y >= 0)
{
if (matrix[x][y] > k) {//如果大于查找的元素就去掉一列
y--;
}
else if (matrix[x][y] < k) {//如果小于查找的元素就去掉一列
x++;
}
else
{
printf("下标为:%d %d\n", x, y);
return 1;//找到了
}
}
return 0;
}
int main()
{
//查找杨氏矩阵中的某个数字
int matrix[][3] = { 1,2,3,4,5,6,7,8,9 };
int x = 3;
int y = 3;
int k = 7;
int ret = find_matrix(matrix, x, y, k);
if (1 == ret)
{
printf("找到了\n");
//printf("下标为:%d %d", x, y);
}
else
{
printf("找不到\n");
}
return 0;
}
代码实现2(带回下标):
#include<stdio.h>
int find_matrix(int matrix[][3],int* px, int* py, int k)
{
int x = 0;
int y = *py-1;
while (x < *px && y >= 0)
{
if (matrix[x][y] > k) {//如果大于查找的元素就去掉一列
y--;
}
else if (matrix[x][y] < k) {//如果小于查找的元素就去掉一列
x++;
}
else if(matrix[x][y]==k)
{
*px = x;//返回x的下标
*py = y;//返回y的下标
return 1;
}
}
return 0;
}
int main()
{
//查找杨氏矩阵中的某个数字
int matrix[][3] = { 1,2,3,4,5,6,7,8,9 };
int x = 3;
int y = 3;
int k = 7;
int ret = find_matrix(matrix, &x, &y, k);
if (1 == ret)
{
printf("找到了\n");
printf("下标为:%d %d", x, y);
}
else
{
printf("找不到\n");
}
return 0;
}
