题目描述:
给你一个满足下述两条属性的 m x n
整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target
,如果 target
在矩阵中,返回 true
;否则,返回 false
。
解题思路:
数组中,每一行按严格递增顺序排列,且每一行的第一个元素大于前一行的最后一个元素。这就说明,数组的第一列也是按递增顺序排列。因此可以采用分块查找的算法思想。首先确定target可能所在的行,再确定target是否存在。
第一步:确定target所在的行。针对数组第一列,根据折半查找的算法思想,查找到第一个大于target的元素,target所在的行就在它的前一行。
第二步:采用折半查找算法判定target是否存在。
代码实现:
public boolean searchMatrix1(int[][] matrix, int target){
//确定所在的行
int row=matrix.length>1?binarySearchRow(matrix, target):0;
//判断目标值是否存在
if (row<0) {
//当row小于0,说明target小于数组的第一个元素,那么数组中一定不存在target
return false;
}
return binarySearch3(matrix[row], target);
}
//二分法(折半查找)判断target是否存在
public boolean binarySearch3(int[] nums,int target){
int left=0,right=nums.length-1;
while (left<=right) {
int mid=(left+right)/2;
if (nums[mid]<target) {
left=mid+1;
}else if (nums[mid]>target){
right=mid-1;
}else {
return true;
}
}
return false;
}
//查找target所在的行:
public static int binarySearchRow(int[][] matrix,int target){
int left=0,right=matrix.length-1;
int mid=-1;
while (left<=right) {
mid=(left+right)/2;
if (matrix[mid][0]<=target) {
left=mid+1;
}else {
right=mid-1;
}
}
return right;
}