杨氏矩阵🐸
📕题目要求:
杨氏矩阵
题目内容📚:
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
🧠题目分析:
对于数字矩阵,我们应该要想到二维数组的矩阵特性。
对于查找数字,我们应该要想到数组的循环遍历和 if 的判断对比。
思路拓展🐎:
杨氏矩阵:矩阵的每行从左到右是递增的,矩阵从上到下是递增的。
我们可以利用杨氏矩阵的特性,简化以往在数组中查数字的过程。
假设:查找的数字为K,行数为 i 列数为 j
1、先从右上角开始查找,若查找的数字K大于右上角的数字,那么行数+1
(该行没有比K大的,需要往下一行查看)
2、若查找的数字K小于右上角的数字,那么列数-1
(右上角的是这一行最大的数字,比右上角小,那么数字K就在这一行中,往左开始寻找)
3、若查找的数字K等于右上角的数字,那么数字K就在矩阵中
4、若行或列越界了,那么证明数字K并不在矩阵中,而对此我们需要另设一个判断进行判定
(设置调用函数的返回值进行if的判定,若返回1则为找到了,返回0则为没找到)
代码演示🐉
#include <stdio.h>int find(int a[][3], int x, int y, int k) //第一个参数的类型需要调整
{int i = 0, j = y - 1; //从右上角开始遍历while (j >= 0 && i < x){if (a[i][j] < k) //比我大就向下{i++;}else if (a[i][j] > k) //比我小就向左{j--;}else{return 1;//找到了返回1}}return 0;//没找到返回0
}int main()
{int a[][3] = { {1, 3, 5},{3, 5, 7}, {5, 7, 9} }; //一个示例if (find(a, 3, 3, 2))//进行判断是1是0{printf("找到啦!\n");//是1}else{printf("没找到!\n");//是0}return 0;
}