杨氏矩阵(详解)
创始人
2025-05-30 08:20:44
0

题目:

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);

代码实现:

#include
int find_num(int arr[3][3], int* px, int* py, int k)
{int x = 0;int y = *py - 1;while (x<= *px && y>= 0){if (arr[x][y] > k){y--;}else if (arr[x][y] < k){x++;}else{*px = x;*py = y;return 1;}}return 0;
}
int main()
{int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int k = 0;scanf("%d", &k);int x = 3;int y = 3;int ret = find_num(arr,&x,&y, k);if (ret == 1){printf("找到了,坐标是: %d %d\n", x, y);}else{printf("找不到\n");}return 0;
}

大致思路:

杨氏矩阵:

1 2 3

4 5 6

7 8 9

比如要查找数字7,方法:

1 从右上角(or左下角)的数字开始,因为右上角的数字是一行的最大值,一列的最小值(左下角的数字是一行中的最小值,一列中的最大值)

2 比较右上角的数字与要查找的数字:

   a. 若右上角的数字>被查找的数字:y--(y代表列的序号)能去掉一列

   作为一列中的最小值都比被查找的数字大,则这一列中肯定不能找到被查找的数字

   b. 若右上角的数字<被查找的数字:x++(x代表行的序号)能去掉一行

  作为一行中的最大值都比被查找的数字小,则这一行中肯定不能找到被查找的数字

   c. 若相等,则找到了,返回此数字的坐标

       这里使用了一个很妙的操作:将代表行数的x,列数的y的地址传给函数,做到了既输入又输出

        输入:把行数和列数传入参数

        输出:通过指针改变实参x,y,将被查找数字的下标带回

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...