题目链接:https://leetcode.cn/problems/search-a-2d-matrix/
题目描述
编写一个高效的算法来判断 m x n
矩阵中,是否存在一个目标值target
。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 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
Code
解法一:暴力遍历
因为矩阵可读且目标值明确,直接快速查找即可
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length;//行数
int col = matrix[0].length;//列数
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (target == matrix[i][j]) {
return true;
}
}
}
return false;
}
解法二:锁定搜索
因为一个二维递增矩阵可以通过横纵坐标来确定具体的位置,所以我们可以靠坐标范围来确定位置,此处展示先锁定横坐标(纵坐标类似操作)
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length;//行数
int col = matrix[0].length;//列数
int index;
for (index = 0; index < row; index++) {
if (target >= matrix[index][0] && target <= matrix[index][col - 1]) {
break;
}
}
for (int i = 0; i < col; i++) {
if (index == row) {
break;
} else if (target == matrix[index][i]) {
return true;
}
}
return false;
}
解法三:维度转换
虽然这是一个二维矩阵,但是因为它的递增性质,我们可以看做一个分割开的一维矩阵。由于递增可以直接使用二分查找,只需要注意索引值的关系转换即可
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length;//行数
int col = matrix[0].length;//列数
int left = 0;//左边界
int right = row * col - 1;//右边界
while (left <= right) {
int middle = (right - left) / 2 + left;//防止int越界
if (target < matrix[middle / col][middle % col]) {
right = middle - 1;
} else if (target > matrix[middle / col][middle % col]) {
left = middle + 1;
} else {
return true;
}
}
return false;
}