美文网首页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