1. 问题描述:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
2. 思路分析:
① 通过题目可以知道每一行都是有序的,并且下一行的元素都比上一行的元素要大,所以整个二维数组是有序的,目标是需要查找数组中是否存在某一个值,这个是典型的二分查找的题目,只是在计算下表的时候需要通过中间位置计算出对应的二维数组的行标与列标在哪一个位置即可,本质上没有任何的区别
② 下面是具体的代码:
import java.util.Scanner;
public class Solution {
public static boolean searchMatrix(int[][] matrix, int target) {
if (matrix.length == 0) return false;
/*实际上使用的就是二分查找*/
int row = matrix.length, col = matrix[0].length, left = 0, right = row * col - 1;
while (left <= right){
int mid = (left + right) / 2;
int r = mid / col;
int c = mid - r * col;
if (matrix[r][c] == target) return true;
if (matrix[r][c] > target) right = mid - 1;
else {
left = mid + 1;
}
}
return false;
}
}