1、题目数组
一、审题spa
二、分析code
给出一个二维数组,每一行的元素、每一列的元素均有序。在此数组中查找 target 元素。blog
2、解答get
一、思路class
方法1、方法
在每一行中用二分查找法。im
public boolean searchMatrix(int[][] matrix, int target) { int rows, cols; if(matrix == null || (rows = matrix.length) == 0 || (cols = matrix[0].length) == 0) return false; int row = 0; while(row < rows) { int start = 0, end = cols - 1; if(matrix[row][0] > target) return false; if(matrix[row][end] < target) { row++; continue; } while(start <= end) { int mid = (end - start) / 2 + start; if(matrix[row][mid] == target) return true; else if(matrix[row][mid] < target) start = mid + 1; else end = mid - 1; } row++; } return false; }
方法2、二维数组
从二维数组的右上角开始向前、向下定位:img
①、若 target 小于当前元素,则 target 不可能在当前列,由于列向下为升序。
②、若 target 大于当前元素,则 target 不可能在当前行,由于当前行为升序。
public boolean searchMatrix(int[][] matrix, int target) { int rows, cols; if(matrix == null || (rows = matrix.length) == 0 || (cols = matrix[0].length) == 0) return false; // 从右上角开始查找 int row = 0, col = cols - 1; while(col >= 0 && row < rows) { if(target == matrix[row][col]) return true; else if(target < matrix[row][col]) col--; else if(target > matrix[row][col]) row++; } return false; }