题目描述
编写一个高效的算法来判断 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
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 100
- -1e4<= matrix[i][j], target <= 1e4
思路
这题直接依次遍历就行,数据强度很弱。
但写个二分还是可以块一点的,将所有元素下标从 0 到 总元素数-1 编号,进行二分搜索。 二分代码如下:
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int len1 = matrix.length;
int len2 = matrix[0].length;
int total = len1*len2;
int left = 0,right = total-1;
while(left <= right) {
int mid = (left+right)/2;
int tmp = searchNumber(matrix, len1, len2, mid);
if(target > tmp)
left = mid + 1;
else if(target < tmp)
right = mid - 1;
else
return true;
}
return false;
}
int searchNumber(int[][] matrix,int len1,int len2,int pos) {
int row = pos/len2;
int col = pos%len2;
return matrix[row][col];
}
}