美文网首页LeetCode每日一题
LeetCode每日一题:剑指 Offer 04. 二维数组中的

LeetCode每日一题:剑指 Offer 04. 二维数组中的

作者: Patarw | 来源:发表于2020-08-12 21:01 被阅读0次

第一种解法:
因为是递增的数列,所以左边肯定是最小值,右边肯定是最大值,所以只需要拿目标数与每一行的左右比较看其是否在左右两数之间,在的话就用二分查找找出目标值。

  • 代码:
 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;
}
}

相关文章

网友评论

    本文标题:LeetCode每日一题:剑指 Offer 04. 二维数组中的

    本文链接:https://www.haomeiwen.com/subject/aygmdktx.html