一、题目
1、审题
2、分析
一个二维数组,其中从左到右为升序,且下面一行数值均比上面的大,求所给数值 target 是否存在于数组中。
二、解答
1、思路:
方法一、
先对二维数组的每一行的第一列进行二分查找,在对该列所在的行进行二分查找。
public boolean searchMatrix(int[][] matrix, int target) { int rows = matrix.length - 1; if(rows < 0) // 处理空行 return false; int cols = matrix[0].length - 1; if(cols < 0) // 处理空列 return false; int left = 0; int right = rows; // 确定行为 right while(left <= right) { int mid = (left + right) / 2; if(matrix[mid][0] > target) right = mid - 1; else left = mid + 1; } // 处理特殊情况,eg 只有一行、每行只有一列 if(right < 0) return false; if(cols == 0) return target == matrix[right][0]; int rowIndex = right; right = cols; left = 0; while(left <= right) { int mid = (left + right) / 2; if(matrix[rowIndex][mid] > target) right = mid - 1; else left = mid + 1; } return matrix[rowIndex][right] == target; }
方法二、
将二维数组看成一个有序的一维数组进行一次二分法计算。
其中坐标为: [mid/col][mid%col]
public boolean searchMatrix2(int[][] matrix, int target) { int rows = matrix.length; int cols = matrix[0].length; int left = 0; int right = rows * cols - 1; while(left <= right) { int mid = (left + right) / 2; int midValue = matrix[mid / cols][mid % cols]; if(midValue < target) left = mid + 1; else if(midValue > target) right = mid - 1; else return true; // 唯一 找到 } // 不需要这样写,而且也会报错,当只有一行一列时。 // return matrix[right / cols][right % cols] == target; return false; }