74&240. Search a 2D Matrix I & II

Search a 2D Matrix I

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

My Solutions:

因为所有数字都是递增的,可以用二分法。用数字的个数来定位数字在哪个格子。

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;

        int row = matrix.length, col = matrix[0].length;
        int begin = 0, end = row * col - 1;
        
        if (target < matrix[0][0] || target > matrix[row - 1][col - 1]) return false;
        
        while (begin + 1 < end) {
            int mid = begin + (end - begin) / 2;
            int midValue = matrix[mid / col][mid % col];
            
            if (midValue == target) return true;
            else if (midValue < target) begin = mid;
            else end = mid;
        }
        if (matrix[begin / col][begin % col] == target) return true;
        if (matrix[end / col][end % col] == target) return true;
        return false;
    }
}

Search a 2D Matrix II

Write an efficient algorithm that searches for a value target in an m x n integer matrix matrix. This matrix has the following properties:

  • Integers in each row are sorted in ascending from left to right.

  • Integers in each column are sorted in ascending from top to bottom.

Example 1:

Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
Output: true

My Solutions:

从matrix的右上角或者左下角找起,如果右上角的数字比target小,说明要移动行数,往下一行找。如果右上角的数字比target大,说明要移动列数,往左边一列找。

public boolean searchMatrix(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
    int row = 0, col = matrix[0].length - 1;
    
    while (col >= 0 && row <= matrix.length - 1) {
        
        // can use rightTop or leftBottom
        int rightTop = matrix[row][col];
        if (rightTop == target) return true;
        if (rightTop < target) row++;
        else col--;
    }
    return false;
}

Last updated