LeetCode 240. 搜索二维矩阵 Ⅱ
一、题目详情
原题链接:240. 搜索二维矩阵 II
编写一个高效的算法来搜索 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
提示:
-
m == matrix.length
-
n == matrix[i].length
-
1 <= n, m <= 300
-
-10^9 <= matix[i][j] <= 10^9
-
每行的所有元素从左到右升序排列
-
每列的所有元素从上到下升序排列
-
-10^9 <= target <= 10^9
二、二分法
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 ||matrix[0].length == 0){
return false;
}
//二分查找
return binarySearch(matrix,target,0,matrix.length - 1,0,matrix[0].length - 1);
}
public boolean binarySearch(int[][] matrix, int target,int heightLow,int heightHigh,int widthsLow,int widthsHigh){
int heightMid = (heightHigh + heightLow) / 2;
int widthsMid = (widthsHigh + widthsLow) / 2;
int midValue = matrix[heightMid][widthsMid];
while(heightLow <= heightHigh && widthsLow <= widthsHigh){
if(midValue > target){
heightHigh = heightMid - 1;
widthsHigh = widthsMid - 1;
return binarySearch(matrix,target,heightLow,heightHigh,widthsLow,widthsHigh);
}else if(midValue < target){
heightLow = heightMid + 1;
widthsLow = widthsMid + 1;
return binarySearch(matrix,target,heightLow,heightHigh,widthsLow,widthsHigh);
}else{
return true;
}
}
return false;
}
}
三、利用行列性质进行剪枝
因为该矩阵的每行元素和每列元素均是升序排列。因此可以从左下角(或右上角)开始查找。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 ||matrix[0].length == 0){
return false;
}
int m = matrix.length - 1;
int n = 0;
while(m >= 0 && n < matrix[0].length){
if(matrix[m][n] > target){
//当前矩阵的元素值 > target时,向上移动一行
m--;
}else if(matrix[m][n] < target){
//当前矩阵的元素值 < target时,向右移动一列
n++;
}else{
//当前矩阵的元素值 == target
return true;
}
}
return false;
}
}