YSMull
<-- algorithm



原题链接

题目描述

编写一个高效的算法来判断m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  1. 每行中的整数从左到右按升序排列。
  2. 每行的第一个整数大于前一行的最后一个整数。

分析

先对第一列进行二分搜索,确定 target 在哪一行,再对那一行进行二分搜索。

对列搜索的时候,注意 f(m) 应该取 arr[m] > target。
如果 f(m) = arr[m] >= target,需要对 l 进行大量讨论,导致代码变得非常复杂。

实现

class Solution {

    public static boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length, n = matrix[0].length;
        // 先搜索是哪一行
        int l = 0, r = m;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (matrix[mid][0] > target) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        if (l == 0) return false;

        // 否则可以确定行数,答案只可能在 l-1 行
        int i = 0, j = n;
        while (i < j) {
            int mid = i + (j - i) / 2;
            if (matrix[l - 1][mid] >= target) {
                j = mid;
            } else {
                i = mid + 1;
            }
        }
        if (i == n || matrix[l - 1][i] != target) return false;
        return true;
    }
}