杨氏矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的杨氏矩阵只要求递增,不要求是等比或等差。
请编写程序在这样的矩阵中查找某个数字是否存在
要求:时间复杂度小于O(N);#include <stdio.h> find_num(int arr[3][3], int* px, int* py, int n) { int x = 0; int y = *py - 1; while (x < *px && y >= 0) { if (arr[x][y] < n) { x++; } else if(arr[x][y] > n) { y--; } 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 n = 0; int x = 3; int y = 3; scanf("%d", &n); int r = find_num(arr, &x, &y, n); if (r == 1) { printf("找到了\n"); printf("下标是 :%d %d\n", x, y); } else { printf("没找到\n"); } return 0; }
最简单的方法是遍历矩阵,但此时时间复杂度为O(N),不符合题目要求。
那么就要用到杨氏矩阵的特性来写代码,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,
如果与每一行最大数比较,n>3说明这一行没有要找的数,所以这一行可以排除,行加一x++,循环直到最后一行,如果n大于最后一行最大数,说明找不到,跳出循环。
如图,当与第三行最大值9相比,n<9,此时9是这一列最小值,(上方行已经排除,与下方相比为最小值),列向左移动y--,如果n小于最后一行最小值,说明找不到,跳出循环。
当找到n时,跳出循环;
一次排除一行或一列,这样代码的时间复杂度小于O(N).