跳转至 搜索二维矩阵 IIhttps://leetcode-cn.com/problems/search-a-2d-matrix-ii/
题目
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例 1:
输入:matrix =
[
[1,4,7,11,15],
[2,5,8,12,19],
[3,6,9,16,22],
[10,13,14,17,24],
[18,21,23,26,30]
], target = 5
输出:true
示例 2:
输入:matrix =
[
[1,4,7,11,15],
[2,5,8,12,19],
[3,6,9,16,22],
[10,13,14,17,24],
[18,21,23,26,30]
], target = 20
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109
题解
由题意可知矩阵的横纵向的值到时按升序排序的,通过观察可以发现将矩阵逆时针旋转45度后矩阵以中间线为基准左边的值是要小于右边的值的,这个性质类似于二叉树的特性,因此我们可以使用类似于二叉树搜索的方法去查找目标值。
function searchMatrix(matrix: number[][], target: number): boolean {
// 以矩阵右上角为起始处(二叉树的首部)
let row: number = 0
let col: number = matrix[0].length - 1
while(col >= 0 && row < matrix.length) {
const cur: number = matrix[row][col]
// 如果当前值小于目标值,row指针下移(二叉树往右子节点走)
if(cur < target)
row++
// 如果当前值大于目标值,col指针左移(二叉树往左子节点走)
else if(cur > target)
col--
else
return true
}
return false
};
执行效率如下: