这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。
- 示例 1:
输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true
- 示例 2:
输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出: false
- 提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
实现思路
解法一:由题可知,矩阵中每行的最后一个是最大的并且比上一行大,这样我们就可以通过遍历每行的最后一个锁定target在哪一行,再通过遍历当行看是否含有target
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
let m = matrix.length
let n = matrix[0].length
let index = 0
for (let i = 0; i < m; i++) {
if (matrix[i][n - 1] >= target) {
index = i
break
}
}
for (let i = 0; i < n; i++) {
if (matrix[index][i] == target) {
return true
}
}
return false
};
解法二:我们可以将二维矩阵看成一个坐标系,行为x轴列为y轴matrix[x][y],原点放在二维矩阵的左下角matrix[m-1][0],当matrix[x][y] > target时说明matrix[x][y]太大了往上移动x--,matrix[x][y] < target说明matrix[x][y]太小了往右移动y++,当matrix[x][y] = target说明找到了返回true,如果x和y超出了二维矩阵的范围说明target不在二维矩阵中返回false
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
let m = matrix.length
let n = matrix[0].length
let x = m - 1, y = 0
let bool = true
while (bool) {
if (matrix[x][y] > target) {
x--
} else if (matrix[x][y] < target) {
y++
} else {
return true
}
if (x < 0 || x >= m || y < 0 || y >= n) {
bool = false
}
}
return false
};