64.搜索二维矩阵(学习)
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例 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
解析:
一、初始化:
1.设置两个指针,row 指向矩阵的第一行(0),col 指向矩阵的最后一列(matrix[0].length - 1)。
二、循环搜索:
1.当 row 小于矩阵的行数且 col 大于等于 0 时,进行循环。
2.在当前位置 (row, col),比较 matrix[row][col] 和 target。
2.1.如果 matrix[row][col] === target,则返回 true,因为找到了目标值。
2.2.如果 matrix[row][col] > target,则由于当前行是递增的,我们可以确定 target 不在当前行的右侧(如果存在的话),因此将 col 减 1,向左移动一列。
2.3.如果 matrix[row][col] < target,则由于下一行的开始值大于当前行的结束值,我们可以确定 target 可能在当前行的下一行中(如果存在的话),因此将 row 加 1,向下移动一行。
三、循环结束:
1.如果循环结束后仍未找到目标值,则返回 false。
var searchMatrix = function (matrix, target) {
if (matrix.length === 0 || matrix[0].length === 0) return false;
let row = 0;
let col = matrix[0].length - 1;
while (row < matrix.length && col >= 0) {
if (matrix[row][col] === target) {
return true;
} else if (matrix[row][col] > target) {
// 当前元素大于目标值,向左移动
col--;
} else {
// 当前元素小于目标值,向下移动
row++;
}
}
// 遍历完矩阵后仍未找到目标值
return false;
};