74. 搜索二维矩阵
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]], target = 13
输出:false
示例 3:
输入:matrix = [], target = 0
输出:false
提示:
m == matrix.length
n == matrix[i].length
0 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix
Link:https://leetcode.com/problems/search-a-2d-matrix
暴力破解
O(M*N)
每个都遍历一遍,比较
行列排除
O(M + N)
取右上角, 和目标值做对比,能够排除一行或者一列
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if len(matrix) == 0 or len(matrix[0]) == 0:
return False
m = len(matrix)
n = len(matrix[0])
i = 0
j = n - 1
while i < m and j >= 0:
if matrix[i][j] == target:
return True
if matrix[i][j] > target:
j -= 1
else:
i += 1
return False
二分法
O(logK), K = M * N
把二维数组看作是一维的,然后二分
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if len(matrix) == 0 or len(matrix[0]) == 0:
return False
m = len(matrix)
n = len(matrix[0])
left = 0
right = m * n - 1
while left < right:
mid = left + (right - left) // 2
if matrix[mid // n][mid % n] == target:
return True
if matrix[mid // n][mid % n] > target:
right = mid
else:
left = mid + 1
return matrix[left // n][left % n] == target
–End–