Skip to main content

Command Palette

Search for a command to run...

74. Search a 2D Matrix

Published
•2 min read•View as Markdown
B
Senior Software Engineer | Backend, Cloud, Data, Machine Learning

You are given an m x n integer matrix matrix with the following two properties:

  • Each row is sorted in non-decreasing order.

  • The first integer of each row is greater than the last integer of the previous row.

Given an integer target, return true if target is in matrix or false otherwise.

You must write a solution in O(log(m * n)) time complexity.

Example 1:

Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
Output: true

Example 2:

Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
Output: false

Constraints:

  • m == matrix.length

  • n == matrix[i].length

  • 1 <= m, n <= 100

  • -10<sup>4</sup> <= matrix[i][j], target <= 10<sup>4</sup>

Solution:

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        """
        double binary search
        """
        ROWS, COLS = len(matrix), len(matrix[0])

        # determine the row
        top, bot = 0, ROWS - 1
        while top <= bot:
            row = (top + bot) // 2
            if target > matrix[row][-1]:
                top = row + 1
            elif target < matrix[row][0]:
                bot = row - 1
            else:
                break

        # check is the row not found
        if not (top <= bot):
            return False


        # get the row
        row = (top + bot) // 2
        # get the value in the selected row
        # if the target value found return True else False
        l, r = 0, COLS - 1
        while l <= r:
            m = (l + r) // 2
            if target > matrix[row][m]:
                l = m + 1
            elif target < matrix[row][m]:
                r = m - 1
            else:
                return True
        return False

More from this blog

yesicbap

437 posts