剑指offer 04: 二维数组中的查找

这篇博客介绍了如何在一个已排序的二维数组中高效地查找目标整数。通过将问题转换为类似二叉搜索树的逻辑,可以从右上角开始,根据目标值与当前元素的关系动态调整搜索路径,最终实现O(n+m)的时间复杂度。这种方法避免了遍历整个数组,提高了查找效率。
摘要由CSDN通过智能技术生成

题目描述

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


题目分析

在右上角看,矩阵可以看作一棵二叉搜索树BST。

  1. 若matrix = null或者matrix长度为0,则返回false。
  2. 若target 大于右上角值,则 row ++;
  3. 若target 小于右上角值,则 col --;
  4. 若target 等于右上角值,则返回true;
  5. 如果到step4还没有返回,则没找到,返回false;

代码实现

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        
        if (matrix == null || matrix.length == 0) {
            return false;
        }

        int n = matrix.length;
        int m = matrix[0].length;
        int row = 0;
        int col = m - 1;
        
       while(row < n && col >= 0) {
           if(target > matrix[row][col]){
               row++;
           }
           else if(target < matrix[row][col]){
               col --;
           }
           else{
               return true;
           }
        }
        return false;
    }
}

复杂度分析

时间复杂度:O(n + m)。while循环内,if最多分别执行n次和m次。
空间复杂度:O(1)。 只使用了常数个变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值