剑指Offer04二维数组中的查找

简介: 剑指Offer04二维数组中的查找

🔎概述

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


🔎题解


🌻解法1(朴素解法)

public static boolean findNumberIn2DArray(int[][] matrix, int target) {
        for (int[] ints : matrix) {
            for (int x : ints) {
                if(x == target)
                    return true;
            }
        }
        return false;
 }

对于以上矩阵,我们只需要逐个遍历,就可以判断出该矩阵是否包含目标值target


🌻解法2(二分查找)

public static boolean findNumberIn2DArray(int[][] matrix, int target) {
        int n = matrix.length;
        //逐层遍历,看该层是否包含target
        //最后如果都未包含,返回false
        for (int i = 0; i < n; i++) {
            if(findTarget(matrix[i],target))
                return true;
        }
        return false;
}
//二分查找
private static boolean findTarget(int[] arr,int target) {
        int n = arr.length;
        if(n == 0) return false;
        int left = 0,right = n - 1;
        while(left <= right) {
            int mid = left + ((right - left) >> 1);
            if(arr[mid] < target) {
                left = mid + 1;
            }else if(arr[mid] > target){
                right = mid - 1;
            }else {
                return true;
            }
        }
        return false;
}

解法2是分别遍历二维数组的每一层,然后利用二分法去判断该层是否包含目标值target

如果包含,返回true

遍历结束,未包含target,返回false


对于解法1与解法2,我们比较容易想到,下面来介绍另一种更高效的解法

🌻解法3(Z字形查找)

public static boolean findNumberIn2DArray3(int[][] matrix, int target) {//解法3
        if(matrix == null || matrix.length == 0) return false;
        int n = matrix.length,m = matrix[0].length;
        //n-->二维数组行数,m-->每一行的元素个数
        int index1 = 0,index2 = m - 1;
        while(index1 < n && index2 >= 0) {
            if(matrix[index1][index2] < target) {
                index1++;
            }else if(matrix[index1][index2] > target) {
                index2--;
            }else {//matrix[index1][index2] == target
                return true;
            }
        }
        return false;
}

我们可以根据题目给出的性质

  • 每一行按照从左到右非递减顺序排序
  • 每一列按照从左到右非递减顺序排序

从矩阵中右上角的元素(左下角元素也可以)来遍历矩阵,寻找target是否存在


🔎题目链接

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


🔎结尾

如果大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
缓存 Linux
Centos7中搭建本地yum源
Centos7中搭建本地yum源
693 0
|
数据处理 开发者 监控
揭秘实时Web应用开发:WebSocket与Akka Streams如何让Play Framework如虎添翼?
【8月更文挑战第31天】实时Web应用需求日益增长,覆盖了从即时通讯到在线游戏等多个领域。Play Framework结合WebSocket与Akka Streams,简化了高效实时应用的开发。WebSocket提供全双工通信,使服务器能主动向客户端推送消息;Akka Streams支持声明式数据流处理,有效避免系统因数据处理不及时而崩溃。本文通过示例代码展示了如何利用这些技术构建实时股票报价系统,展现了其在实时数据处理方面的强大能力。掌握这一技术组合,将大幅提升你在实时Web应用开发中的效率与稳定性。
222 0
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
304 11
|
机器学习/深度学习 人工智能 算法
机器学习【教育领域及其平台搭建】
机器学习【教育领域及其平台搭建】
388 6
|
安全 Shell 网络安全
Neos的渗透测试靶机练习——DC-1
Neos的渗透测试靶机练习——DC-1
268 4
|
中间件 编译器 数据处理
在web开发中应用管道过滤器
【9月更文挑战第1天】本文介绍管道-过滤器架构将数据处理流程分解为一系列独立组件,通过管道连接,适用于数据流处理如图像处理、编译器设计等。通过具体实例说明了Gin如何有效支持管道-过滤器风格的设计,构建高性能Web服务。
284 11
|
Java 测试技术 Apache
《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)
【6月更文挑战第7天】本文介绍了在Java自动化测试中如何操作Excel数据。文章提到了当测试数据存储在Excel文件时,可以使用Apache的POI库来读写Excel。POI提供了对OLE2(.xls)和OOXML(.xlsx)格式的支持,比JXL库功能更全面。文章还详细讲解了如何下载和添加POI库到项目中,以及准备测试用的Excel文件。最后,给出了一个简单的Java代码示例,演示如何读取Excel文件的内容。
224 1
|
人工智能 JavaScript Java
一个简洁、干净的中后台管理模板
nova-admin —— 一个基于Vue3、Vite5、Typescript、Naive UI, 简洁干净后台管理模板。
318 2
一个简洁、干净的中后台管理模板
|
数据可视化 定位技术 API
Python pyecharts 模块
Python pyecharts 模块
|
JavaScript Java 数据库
Vue+SpringBoot+ElementUi+mybatis-plus 实现用户信息的修改及模拟充值
这篇文章展示了如何使用Vue结合SpringBoot、ElementUI和mybatis-plus实现用户信息的修改以及模拟充值的功能。文章首先介绍了模拟充值的过程,包括充值前后的账户余额和数据库信息的截图。然后,文章展示了用户信息修改前后的界面和数据库信息。核心代码部分演示了如何使用mybatis-plus轻松实现用户信息的修改操作,同时指出了异常处理和代码组织的最佳实践。