剑指 Offer 04. 二维数组中的查找

这篇博客介绍了如何在二维数组中高效地查找目标值。通过将二维数组视为特殊的二叉树,可以利用其左下角或右上角作为根节点的性质进行搜索。提供了两种算法:一种以左下角为根,另一种以右上角为根。算法根据目标值与当前根节点的关系,调整根节点的位置。若遍历完整个数组仍未找到目标值,则返回false。
摘要由CSDN通过智能技术生成

剑指 Offer 04. 二维数组中的查找

在这里插入图片描述
由于该二维矩阵的特殊性,可以将其看作一个二叉树,以左下角或者右上角的位置的数为二叉树的根的话有着不同的性质。

  1. 以左下角为根。
    以左下角为根的话,这样的一个二叉树的上节点总是比根小,右节点总是比根大。
  2. 以右上角为根
    以右上角为根的话,这样的一个二叉树的左节点总是比根小,下节点总是比根大。
    将二维矩阵转化成二叉树看待,就可以利用其特殊的性质来进行搜索。

算法:

  1. 有了上述性质之后,算法就很简单了。以左下角为根为例,如果target < root,那么就将根节点移动到上子叶,如果target > root,那么就将根节点移动到右子叶。如果target == root,那么就返回true。
  2. 当越过二维数组的边界还未搜索到target的话,那么就可以返回false。

代码

  1. 以左下角为根
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        int l = matrix.length, tempL = l-1, tempR = 0;
        while(tempL >= 0 && tempR <= matrix[0].length-1){
            int root = matrix[tempL][tempR];
            if(root < target){
                tempR++;
            }else if(root > target){
                tempL--;
            }
            else
            return true;
        }
        return false;
    }
}
  1. 以右上角为根
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        int tempL = 0;
        if(matrix.length == 0)
        return false;
        int tempR = matrix[0].length - 1;
        while(tempL <=  matrix.length-1 && tempR >= 0){
            int root = matrix[tempL][tempR];
            if(root < target){
                tempL++;
            }else if(root > target){
                tempR--;
            }
            else
            return true;
        }
        return false;
    }
}

注意:

对于二维数组,如果该二位数组为空,例如nums[][] = {}; 在java中,nums.length是可以通过编译的,其结果为零。但是nums[0].length会越界。nums[0].length必须在二维数组不为空的情况下才有值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值