Description
面试题4. 二维数组中的查找
难度中等173
在一个 n m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
*示例:
现有矩阵 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,返回 true。
给定 target = 20,返回 false。
限制:0 <= n <= 10000 <= m <= 1000
Solution
class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {if (matrix.length <= 0)return false;int row = matrix.length, col = matrix[0].length;// 从二维数组的右上角开始遍历搜索int i = 0, j = col - 1; // i 为行,j为列while ( i < row && j >= 0){if (matrix[i][j] > target) // 当前位置的元素大于 target,下面行同一列的元素都会大于 targetj --;else if (matrix[i][j] < target) // 当前位置的元素小于 target,那么同一行中 [0-j) 列之间的元素都会小于 target,排除掉i ++;else // 找到元素的情况return true;}return false; // 找不到元素的情况}}
执行结果:通过
显示详情
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:43.9 MB, 在所有 Java 提交中击败了96.59%的用户
使用 二分搜索 算法,查找数组中第一个小于等于的元素,提高第一个元素的定位
class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {if (matrix.length <= 0)return false;int row = matrix.length, col = matrix[0].length;int index = binarySearch(matrix[0], 0, col-1, target); // 使用 二分查找,查找 0 行中最后一个小于等于 target 的元素int i = 0, j = index; // j 为列,i 为行while ( i <= row - 1 && j >= 0 ){if (matrix[i][j] == target)return true;if (matrix[i][j] < target)i ++;elsej --;}return false;}public int binarySearch(int[] nums, int lo, int hi, int target){while(lo <= hi){int mid = (lo+hi)/2;if (nums[mid] > target){hi = mid - 1;}else {if (mid == hi || nums[mid+1] > target){return mid;}lo = mid+1;}}return -1;}}
