
LeetCode Problems
In this tutorial we will solve 74. Search a 2D Matrix from leetcode.
Reference: 74. Search a 2D Matrix
In this problem statement we are given an input matrix of dimensions m * n where, m is the number of rows and n is the number of columns.
The matrix is the following two properties.
We are asked to return true if the given integer value target is present in the matrix or false otherwise.
We are also instructed to find the result in O(log m*n) time complexity.
Watch this video for Binary Search.
Example from leetcode.
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^4 <= matrix[i][j], target <= 10^4
To solve this problem we will use Binary Search. By looking at the problem statement we can deduce that the target value, if present, will be in only one row of the given matrix. So, we can use Binary Search to first find the row in which the target value may exists. Next we will use the Binary Search to find the target value in the selected row.
Let us look at the first example matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
target = 3
input
  | 0  1  2  3
--+-------------
0 | 1  3  5  7
1 | 10 11 16 20
2 | 23 30 34 60    
m = number of rows = matrix.length = 3
n = number of columns = matrix[0].length = 4
lastColIndex = n - 1 = 3
first we search the row
start = 0
end = m - 1 = 2
while start <= end ? yes
  mid = Math.floor((start+end) / 2)
      = Math.floor((0+2)/2)
      = 1
  so, we are inspecting row #1.
  is target >= first element of row #1 AND target <= last element of row #1 ?
  i.e., is 3 >= 10 AND 3 <= 20 ?
    => NO
  is target > last element of row #1 ?
  i.e., is 3 >= 20 ?
  	=> NO
  is target <= last element of row #1 ?
  i.e., is 3 <= 20 ?
    => YES
    => therefore, set end = mid - 1 = 0
start = 0
end = 0
while start <= end ? yes
  mid = Math.floor((start+end) / 2)
      = Math.floor((0+0)/2)
      = 0
  so, we are inspecting row #0.
  is target >= first element of row #0 AND target <= last element of row #0 ?
  i.e., is 3 >= 1 AND 3 <= 7 ?
    => YES
    => therefore, row #0 is or target row
now, we will perform binary search in row #0
start = 0
end = lastColIndex = 3
while start <= end ? YES
  mid = Math.floor((start+end) / 2)
      = Math.floor((0+3)/2)
      = 1
  is target == element #1 of row #0 ?
  i.e., 3 == 3 ?
    => YES
    => therefore, return true
JavaScript
/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    let targetRow = binarySearchRow(matrix, target);
    if (targetRow === -1) return false;
    return binarySearch(matrix[targetRow], target) !== -1;
};
const binarySearchRow = (matrix, target) => {
    let lastColIndex = matrix[0].length - 1;
    let start = 0
    let end = matrix.length - 1;
    while(start <= end) {
        let mid = Math.floor((start + end) / 2);
        if (target >= matrix[mid][0] && target <= matrix[mid][lastColIndex]) return mid;
        if (target > matrix[mid][lastColIndex]) start = mid + 1;
        else end = mid - 1;
    }
    return -1;
};
const binarySearch = (nums, target) => {
    let start = 0;
    let end = nums.length - 1;
    while(start <= end) {
        let mid = Math.floor((start + end) / 2);
        let midVal = nums[mid];
        if (midVal === target) return mid;
        if (midVal < target) start = mid + 1;
        else end = mid - 1;
    }
    return -1;
};
Time complexity: O(log m*n)
The time complexity of this solution is O(log m*n)
Space complexity: O(1)
We are only using constant extra memory to solve the problem. Hence, space complexity is O(1).
ADVERTISEMENT