编写一个高效的算法来搜索 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
-
初始化:
- 定义两个变量
i
和j
,分别代表当前搜索位置的行索引和列索引。 i
初始化为 0,表示从矩阵的第一行开始。j
初始化为matrix[0].length - 1
,表示从矩阵的最后一列开始。
- 定义两个变量
-
循环搜索:
- 使用
while
循环来遍历矩阵,循环条件为i
小于等于矩阵的最后一行索引并且j
大于等于 0。 - 在每次循环中,比较目标值
target
与当前元素matrix[i][j]
的大小关系:- 如果
target
大于当前元素,则i++
,移动到下一行,因为当前行的所有元素都比target
小。 - 如果
target
小于当前元素,则j--
,移动到前一列,因为当前列的所有元素都比target
大。 - 如果
target
等于当前元素,则返回true
,表示找到了目标值。
- 如果
- 使用
-
循环结束:
- 如果退出
while
循环仍未找到目标值,则返回false
,表示目标值不存在于矩阵中。class Solution { public boolean searchMatrix(int[][] matrix, int target) { // 初始化行索引i和列索引j int i = 0, j = matrix[0].length - 1; // 在矩阵范围内搜索 while(i <= matrix.length - 1 && j >= 0) { // 如果目标值大于当前元素,向下移动一行 if(target > matrix[i][j]) { i++; // 如果目标值小于当前元素,向左移动一列 } else if(target < matrix[i][j]) { j--; // 如果目标值等于当前元素,返回true } else { return true; } } // 未找到目标值,返回false return false; } }
- 如果退出