Problem
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
Algorithm
Using binary search. First search vertical, then horizontal.
Code
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if not matrix or not matrix[0]:
return False
u_index = 0
d_index = len(matrix) - 1
while u_index < d_index:
m_index = (u_index + d_index + 1) // 2
if matrix[m_index][0] == target:
return True
elif matrix[m_index][0] > target:
d_index = m_index - 1
else:
u_index = m_index
if matrix[d_index][0] == target:
return True
row = d_index
l_index = 0
r_index = len(matrix[0]) - 1
while l_index < r_index:
m_index = (l_index + r_index + 1) // 2
if matrix[row][m_index] == target:
return True
elif matrix[row][m_index] > target:
r_index = m_index - 1
else:
l_index = m_index
return matrix[row][l_index] == target