给定一个杨氏矩阵,如何快速查找指定的元素?要讲究技巧。
首先弄清楚什么叫做杨氏矩阵:它的每一行从左至右是递增的,每一列从上至下是递减的。例如:
1, 2, 3
2, 4, 6
5, 7, 8
对于这道题,首先想到的当然是暴力方法了,两层for循环嵌套查找,在优化一下每次从每行的最后一个元素开始比较,要是大于这个地方的值,那么肯定不在这一行了,于是相当于删除了一行。
当然还有更好的方法,比如我们还是从3开始比,假如要查找的数比3大,我们可以删除掉当前行,因为肯定不在这一行了;假如查找的数比3小,那么肯定不在这一列了。如此,每次从右上角(当然左下角也可以)开始比,可以删除一行或者一列,直到找到。
下面就来实现这种方法:
/* 杨氏矩阵查找函数 */ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h> //1, 2, 3 //4, 5, 6 //7, 8, 9 struct rs { int row; int col; }; struct rs search(int arr[][3], int row, int col, int val) { int r = 0, c = col - 1; struct rs ret = {-1, -1}; while ((r < row) && (c >= 0)) { if (arr[r][c] > val) { c--; } else if (arr[r][c] < val) { r++; } else { ret.col = c; ret.row = r; break; } } return ret; } int main() { int arr[3][3] = { {1, 3, 5}, {3, 4, 6}, {7, 8, 9} }; struct rs ret = search(arr, 3, 3, 9); printf("row:%d col:%d\n", ret.row, ret.col); system("pause"); return 0; }
这个程序健壮性不够好,下边再以从左下角开始比较做演示,顺便提升程序健壮性,这次不返回下标位置了:
#include <stdio.h> #define ROW 4 #define COL 4 int search(int *matrix, int rows, int cols, int val) { if ((NULL != matrix) && (rows > 0) && (cols > 0)) { int row = rows - 1; int col = 0; while ((row >= 0) && (col < cols)) { if (val == *(matrix + row*cols + col)) { return 1; //找到 } else if (val < *(matrix + row*cols + col)) { row--; } else { col++; } } } return 0; //没找到 } int main() { int yang[4][4] = { {1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15} }; int ret = search(&yang[0][0], ROW, COL, 14); if (ret == 1) printf("exist\n"); else printf("not exist\n"); return 0; }
杨氏矩阵中的查找
最新推荐文章于 2022-01-29 11:27:10 发布