题目链接

牛客网

题目描述

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。

  1. Consider the following matrix:
  2. [
  3. [1, 4, 7, 11, 15],
  4. [2, 5, 8, 12, 19],
  5. [3, 6, 9, 16, 22],
  6. [10, 13, 14, 17, 24],
  7. [18, 21, 23, 26, 30]
  8. ]
  9. Given target = 5, return true.
  10. Given target = 20, return false.

解题思路

要求时间复杂度 O(M + N),空间复杂度 O(1)。其中 M 为行数,N 为 列数。

该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来快速地缩小查找区间,每次减少一行或者一列的元素。当前元素的查找区间为左下角的所有元素。

4. 二维数组中的查找 - 图1

  1. public boolean Find(int target, int[][] matrix) {
  2. if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
  3. return false;
  4. int rows = matrix.length, cols = matrix[0].length;
  5. int r = 0, c = cols - 1; // 从右上角开始
  6. while (r <= rows - 1 && c >= 0) {
  7. if (target == matrix[r][c])
  8. return true;
  9. else if (target > matrix[r][c])
  10. r++;
  11. else
  12. c--;
  13. }
  14. return false;
  15. }