Search a 2D Matrix

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.
For example,

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
Given target = 3, return true.

二分法

思路

把matrix看成一个m*n的数组, 那么如果把数组一字排开就是正常的有序数组二分搜索了.

复杂度

时间 O(logMN) 空间 O(1)

代码

public boolean searchMatrix(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
        return false;
    }
    int row = matrix.length;
    int col = matrix[0].length;
    int left = 0, right = row * col - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        int cur = matrix[mid/col][mid % col];
        if (cur == target) {
            return true;
        } else if (cur < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return false;
}

Search a 2D Matrix II

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 in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.
For example,

Consider the following 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]
]
Given target = 5, return true.

Given target = 20, return false.

遍历法

说明

从左下角开始遍历, 如果大于当前就往右走, 小于就往上走

复杂度

时间 O(M + N) 空间O(1)

代码

public boolean searchMatrix(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
    int m  = matrix.length;
    int n = matrix[0].length;
    int i = m - 1;
    int j = 0;
    while (i >= 0 && j < n) {
        int tem = matrix[i][j];
        if (tem == target) {
            return true;
        } else if (tem > target) {
            i--;
        } else {
            j++;
        }
    }
    return false;
}

lpy1990
26 声望10 粉丝