小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
搜索二维矩阵 II
编写一个高效的算法来搜索 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
输入:
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
来源:LeetCode
【暴力法】
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for(int i = 0;i<matrix.length;i++){
if (matrix[i][0]>target){
return false;
}
for(int j = 0;j<matrix[0].length;j++){
if(matrix[i][j] == target){
return true;
}
if(matrix[i][j]>target){
break;
}
}
}
return false;
}
}
【排序二叉树思想】
题述中元素从左到右升序,从上到下升序,结构类似于排序二叉树
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// 从左下角(第0列,最后一行)开始查找, 还可以右上角开始查找
int col = 0, row = matrix.length - 1;
while(row >= 0 && col < matrix[0].length){
// 当target 大于 矩阵中元素的值时,col + 1 ,向右移动
// 当target 小于矩阵中元素的值时,row - 1 , 向上移动
if(target > matrix[row][col]){
col++;
}else if(target < matrix[row][col]){
row--;
}else{
return true;
}
}
return false;
}
}