Description

面试题4. 二维数组中的查找
难度中等173
在一个 n m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

*示例:

现有矩阵 matrix 如下:

  1. [
  2. [1, 4, 7, 11, 15],
  3. [2, 5, 8, 12, 19],
  4. [3, 6, 9, 16, 22],
  5. [10, 13, 14, 17, 24],
  6. [18, 21, 23, 26, 30]
  7. ]

给定 target = 5,返回 true
给定 target = 20,返回 false

限制:
0 <= n <= 1000
0 <= m <= 1000

Solution

  1. class Solution {
  2. public boolean findNumberIn2DArray(int[][] matrix, int target) {
  3. if (matrix.length <= 0)
  4. return false;
  5. int row = matrix.length, col = matrix[0].length;
  6. // 从二维数组的右上角开始遍历搜索
  7. int i = 0, j = col - 1; // i 为行,j为列
  8. while ( i < row && j >= 0){
  9. if (matrix[i][j] > target) // 当前位置的元素大于 target,下面行同一列的元素都会大于 target
  10. j --;
  11. else if (matrix[i][j] < target) // 当前位置的元素小于 target,那么同一行中 [0-j) 列之间的元素都会小于 target,排除掉
  12. i ++;
  13. else // 找到元素的情况
  14. return true;
  15. }
  16. return false; // 找不到元素的情况
  17. }
  18. }

执行结果:通过
显示详情
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:43.9 MB, 在所有 Java 提交中击败了96.59%的用户

使用 二分搜索 算法,查找数组中第一个小于等于的元素,提高第一个元素的定位

  1. class Solution {
  2. public boolean findNumberIn2DArray(int[][] matrix, int target) {
  3. if (matrix.length <= 0)
  4. return false;
  5. int row = matrix.length, col = matrix[0].length;
  6. int index = binarySearch(matrix[0], 0, col-1, target); // 使用 二分查找,查找 0 行中最后一个小于等于 target 的元素
  7. int i = 0, j = index; // j 为列,i 为行
  8. while ( i <= row - 1 && j >= 0 ){
  9. if (matrix[i][j] == target)
  10. return true;
  11. if (matrix[i][j] < target)
  12. i ++;
  13. else
  14. j --;
  15. }
  16. return false;
  17. }
  18. public int binarySearch(int[] nums, int lo, int hi, int target){
  19. while(lo <= hi){
  20. int mid = (lo+hi)/2;
  21. if (nums[mid] > target){
  22. hi = mid - 1;
  23. }else {
  24. if (mid == hi || nums[mid+1] > target){
  25. return mid;
  26. }
  27. lo = mid+1;
  28. }
  29. }
  30. return -1;
  31. }
  32. }