给定一个m行n列的整数矩阵(如图),每行从左到右和每列从上到下都是有序的。判断一个整数k是否在矩阵中出现的最优算法,在最坏情况下的时间复杂度是________。
O(m*n)
O(m+n)
O(log(m*n))
O(log(m+n))
答案 B 错选 D
杨氏矩阵查找算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
bool stepWise( int mat[][N_MAX], int N, int target, int &row, int &col) { if (target < mat[ 0 ][ 0 ] || target > mat[N- 1 ][N- 1 ]) return false ; row = 0 ; col = N- 1 ; while (row <= N- 1 && col >= 0 ) { if (mat[row][col] < target) row++; else if (mat[row][col] > target) col--; else return true ; } return false ; } |
首先,按题中要求所得矩阵的左上角和右下角元素分别为整个矩阵的最小值和最大值,这俩个点是矩阵的鞍点。
下面是最优算法:
记矩阵的右上角(左下角也可以)元素为a,搜索起点设置为a,要查找的元素为k:
若a>k,则a所在列的所有元素均大于k,搜索位置左移1位,然后删除该列构成新的矩阵;
若a<k,则a所在行的所有元素均小于k,搜索位置下移1位,然后删除该行构成新的矩阵;
若相等,结束查找;
由新构成的矩阵利用上述方式继续查找(递归调用)。
若a>k,则a所在列的所有元素均大于k,搜索位置左移1位,然后删除该列构成新的矩阵;
若a<k,则a所在行的所有元素均小于k,搜索位置下移1位,然后删除该行构成新的矩阵;
若相等,结束查找;
由新构成的矩阵利用上述方式继续查找(递归调用)。
本题中,该最优算法的最坏情况也就是说从右上角开始搜索直到左下角结束,每次向左或向下一步,共需要m+n步到达左下角,选B