第一种解法:
因为是递增的数列,所以左边肯定是最小值,右边肯定是最大值,所以只需要拿目标数与每一行的左右比较看其是否在左右两数之间,在的话就用二分查找找出目标值。
- 代码:
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0){
return false;
}
for(int i = 0;i < matrix.length;i++){
if(target >= matrix[i][0] && target <= matrix[i][matrix[i].length - 1]){
int left = 0;
int right = matrix[i].length - 1;
int mid = 0;
while(left <= right){
mid = (left + right) / 2;
if(target < matrix[i][mid]){
right = mid - 1;
} else if(target > matrix[i][mid]){
left = mid + 1;
}else if(target == matrix[i][mid]){
return true;
}
}
}
}
return false;
}
}
- 第二种解法
利用了给定数组的横纵递增性,取右上顶角和目标数字比较,当右上顶角数字大于目标数字时,说明目标数字肯定在右上顶角这里一列的右边(因为右上顶角是这一列最小的数字),当右上顶角数字小于目标数字时,说明目标数字肯定在这一行的下面(因为右上顶角是这一行最大的数字),循环直到找出目标数字
- 代码实现:
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0){
return false;
}
int right = matrix[0].length - 1;
int top = 0;
while(top < matrix.length && right >= 0){
if(matrix[top][right] < target){
top++;
}else if(matrix[top][right] > target){
right--;
}else if(matrix[top][right] == target){
return true;
}
}
return false;
}
}
网友评论