杨氏矩阵中查找一个数,时间复杂度小于O(N)

匿名 (未验证) 提交于 2019-12-03 00:19:01

【问题描述】:杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。如果存在返回坐标,不过不存在,返回不存在.
时间复杂度小于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; }


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!