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.
Example 1:
Input:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 3
Output: true
Example 2:
Input:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 13
Output: false
class Solution:
     def searchMatrix(self, matrix, target):
         if (not matrix) or (target is None):
             return False
         rows, index = len(matrix[0]), len(matrix) * len(matrix[0])
         low, high = 0, index - 1
         while high >= low:
             mid = (low + high) // 2
             item = matrix[mid // rows][mid % rows]
             if item == target:
                 return True
             elif item > target:
                 high = mid - 1
             else:
                 low = mid + 1
         return False
class Solution:
     def searchMatrix(self, matrix, target):
         if (not matrix) or (target is None):
             return False
         rows, index = len(matrix[0]), len(matrix) * len(matrix[0])
         low, high = 0, index - 1
         while high >= low:
             mid = (low + high) // 2
             item = matrix[mid // rows][mid % rows]
             if item == target:
                 return True
             elif item > target:
                 high = mid - 1
             else:
                 low = mid + 1
         return False