题目描述:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
示例 1:

输入: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
示例 2:

输入: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 = 20 输出:false
题解1:
比较巧妙的排除法,首先从矩阵的右上角开始找起,如果右上角元素x比target大,那么说明右上角这一列都不会存在target,因此这一列就不需要再遍历;如果x比target小,那么就说明,右上角这一行都不会存在target,排除这一行。
实现代码:
- public static boolean searchMatrix2(int[][] matrix, int target) {
- int m = matrix.length;//行数
- int n = matrix[0].length;//列数
- int i = 0 ;
- int j = n-1;
- while(i<m&&j>=0){
- if(matrix[i][j]==target){
- return true;
- }else if(matrix[i][j]>target){
- j--;
- }else{
- i++;
- }
- }
- return false;
- }
题解2:
使用常规方法对每一行进行二分查找,看是否存在target
实现代码:
- int m = matrix.length;
- int n = matrix[0].length;
- for (int i = 0; i < m; i++) {
- int l = 0;
- int r = n-1;
- while(l<=r){
- int mid = (r-l)/2+l;
- if(matrix[i][mid]==target){
- return true;
- }else if(matrix[i][mid]>target){
- r = mid-1;
- }else{
- l = mid+1;
- }
- }
- }
- return false;