复制
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例:
现有矩阵 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。
给定 target = 20,返回 false。
符合直觉的做法是两层循环遍历,时间复杂度是 O(m * n), 有没有时间复杂度更好的做法呢? 答案是有,那就是充分运用矩阵的特性(横向纵向都递增), 我们可以从角落(左下或者右上)开始遍历,这样时间复杂度是 O(m + n).
复制 /*
* @lc app=leetcode id=240 lang=javascript
*
* [240] Search a 2D Matrix II
*
* https://leetcode.com/problems/search-a-2d-matrix-ii/description/
*
*
*/
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function (matrix , target) {
if ( ! matrix || matrix . length === 0 ) return false ;
let colIndex = 0 ;
let rowIndex = matrix . length - 1 ;
while (rowIndex > 0 && target < matrix[rowIndex][colIndex]) {
rowIndex -- ;
}
while (colIndex < matrix[ 0 ]. length ) {
if (target === matrix[rowIndex][colIndex]) return true ;
if (target > matrix[rowIndex][colIndex]) {
colIndex ++ ;
} else if (rowIndex > 0 ) {
rowIndex -- ;
} else {
return false ;
}
}
return false ;
};
复制 class Solution :
def searchMatrix ( self , matrix , target ):
m = len (matrix)
if m == 0 :
return False
n = len (matrix[ 0 ])
i = m - 1
j = 0
while i >= 0 and j < n :
if matrix [ i ] [j] == target :
return True
if matrix [ i ] [j] > target :
i -= 1
else :
j += 1
return False