赞
踩
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
这题要实现非常简单,关键就在于如何采取高效的方法去查找二维数组中的目标值。
我写的代码看起来有点复杂,但是效率应该是可以的,类似于一维数组中使用二分法查找目标值。
经过了n次找bug,终于写出来了,但是看了官方的题解,有些地方还是想的复杂了点。
class Solution { public boolean searchMatrix(int[][] matrix, int target) { int i = matrix.length - 1; //表示数组的列数 int j = matrix[0].length - 1; return binarySearch(matrix, 0, 0, i, j, target); } public static boolean binarySearch(int[][] matrix, int startX, int startY, int endX, int endY, int target) { //查找中心位置的索引,即[x,y] int row = matrix.length; int col = matrix[0].length; int location = ((endX * col + endY) + (startX * col + startY)) >> 1; int x = location / col; int y = location % col; if (matrix[x][y] == target) { return true; } if (startX == endX && startY == endY) { return false; } if (matrix[x][y] > target) { if (startX == x && startY == y) { return false; } if (y == 0) { //[0][0]>target,说明target不存在于数组中 if (x == 0) { return false; } return binarySearch(matrix, startX, startY, x - 1, col - 1, target); } return binarySearch(matrix, startX, startY, x, y - 1, target); } if (y == col - 1) { //[col][col]<target,说明target不存在于数组中 if (x == row - 1) { return false; } else { return binarySearch(matrix, x + 1, 0, endX, endY, target); } } return binarySearch(matrix, x, y + 1, endX, endY, target); } }
O(log(mn)),m,n分别是行数和列数
若将矩阵每一行拼接在上一行的末尾,则会得到一个升序数组,我们可以在该数组上二分找到目标元素。
代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。
class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length, n = matrix[0].length; int low = 0, high = m * n - 1; while (low <= high) { int mid = (high - low) / 2 + low; int x = matrix[mid / n][mid % n]; if (x < target) { low = mid + 1; } else if (x > target) { high = mid - 1; } else { return true; } } return false; } }
O(log(mn)),m,n分别是行数和列数
class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length, n = matrix[0].length; int low = 0, high = m * n - 1; while (low <= high) { //移位运算符优先级小于+号,所以前面要加括号 int mid = ((high - low) >> 1) + low; int x = matrix[mid / n][mid % n]; if (x == target) { return true; } else if (x > target) { high = mid - 1; } else { low = mid + 1; } } return false; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。