【LeetCode】74. 搜索二维矩阵
74. 搜索二维矩阵
知识点:数组,二分查找;
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
解法一:二分查找
这个二维数组是是有序的,想象一下,将其扁平化后就是一个有序的一维数组,就能使用二分查找了,所以可以想象一个一维数组,仍然和原来一样不断求中间值,只不过我们将中间值转化为二维数组的索引就可以了,
- 行坐标=mid/列数。比如5/4=1,就在第1行;
- 列坐标=mid%列数。比如5%4=1,就在第1列;
这样就获得了其在二维数组中的值,nums[行坐标][列坐标];然后判断其与target的值,进行移动就可以了。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length, n = matrix[0].length;
int left = 0, right = m*n-1;
while(left <= right){
int mid = left + ((right-left) >> 1);
int x = mid / n;
int y = mid % n;
if(matrix[x][y] == target){
return true;
}else if(matrix[x][y] > target){
right = mid-1;
}else{
left = mid+1;
}
}
return false;
}
}
- python
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m, n = len(matrix), len(matrix[0])
i, j = 0, n-1
while 0 <= i < m and 0 <= j < n:
if matrix[i][j] == target:
return True
elif matrix[i][j] < target:
i += 1
else:
j -= 1
return False