【问题描述】:杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。如果存在返回坐标,不过不存在,返回不存在.
时间复杂度小于O(N);
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。如果存在返回坐标,不过不存在,返回不存在.
时间复杂度小于O(N);
例如数组:
1 2 3
4 5 6
7 8 9
【解决思路】:简单的办法是将二维数组遍历一遍,依次比较,但是这样的话时间复杂度肯定大于o(n),不符合题目要求。我们要想做到时间复杂度小于o(n),只能根据杨氏矩阵的性质来查找,假设在上边的数组中我们要查找5,首先我们确定右上角的元素4,4<5,则现在我们可以去掉第一行,因为杨氏矩阵的每一行的元素是递增的;如果要找的数小于右上角的数,可以直接去掉一列,因为杨氏矩阵的每一列也是递增的。
【参考代码】:
#include<stdio.h> #include<windows.h> #define ROW 3 #define COL 3 struct point { int x; int y; };//定义一个结构体返回坐标 struct point find_key(int arr[ROW][COL], int key) { int x = 0; int y = COL-1; struct point ret = { -1,-1 }; while ((x <=ROW-1) && (y >= 0)) { if (key == arr[x][y]) { ret.x = x; ret.y = y; return ret; } else if (key < arr[x][y]) { y--; } else { x++; } } return ret; } int main() { int key = 0; int arr[ROW][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; printf("请输入要找的数:"); scanf_s("%d", &key); struct point ret=find_key(arr, key); if ((ret.x != -1) && (ret.y) != -1) { printf("找到了,坐标是%d ,%d\n", ret.x+1, ret.y+1); } else { printf("找不到\n"); } system("pause"); return 0; }
文章来源: 杨氏矩阵中查找一个数,时间复杂度小于O(N)