Java二维数组查找功能代码实现

下面来详细讲解如何用Java实现二维数组查找功能的代码。

算法思路

二维数组(也叫矩阵)是由若干个一维数组组成的数据结构,我们可以将其看成一个具有行列特性的表格。要实现查找功能,我们可以从左上角(或者右下角)开始逐行逐列地查找,找到目标数就返回 true,否则返回 false。

具体实现步骤如下:

  1. 从左上角开始查找,设当前位置为 (i, j),若该位置的值 a[i][j] 大于目标数,则直接返回 false。
  2. 若该位置的值小于目标数,则往右查找,即令 j++,继续判断 a[i][j] 的值。
  3. 如果在某一行中找到了目标数,则返回 true。
  4. 如果往右到达了最后一列仍未找到目标数,就往下查找,即令 i++,继续从该行的第一个位置开始查找。
  5. 重复第二、三、四步,直到找到目标数或遍历完整个矩阵。

代码实现

下面是 Java 语言实现二维数组查找功能的代码示例:

public boolean searchMatrix(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
        return false;
    }
    int m = matrix.length, n = matrix[0].length;
    int i = 0, j = n - 1;  // 从矩阵右上角开始查找
    while (i < m && j >= 0) {
        if (matrix[i][j] == target) {
            return true;
        } else if (matrix[i][j] > target) {
            j--;  // 当前值比目标值大,向左移动
        } else {
            i++;  // 当前值比目标值小,向下移动
        }
    }
    return false;  // 没有找到目标值
}

这个方法的时间复杂度是 $O(m+n)$,其中 $m$ 和 $n$ 是矩阵的行数和列数,空间复杂度是常数级别,只需要几个辅助变量。

接下来,我们来看两个具体的应用场景:

示例 1:在二维矩阵中查找目标数

假如现在有一个二维矩阵如下:

  1  3  5  7
 10 11 16 20
 23 30 34 60

我们需要在这个矩阵中查找一个目标数,比如 16

我们可以按照上述代码实现过程,从矩阵右上角开始查找,即 (i, j) = (0, 3) 开始查找,根据二维数组查找的规则,如果比目标数大就向左移动,如果比目标数小就向下移动,直到找到目标数或者遍历完整个矩阵。

代码实现如下:

int[][] matrix = {
        {1, 3, 5, 7},
        {10, 11, 16, 20},
        {23, 30, 34, 60}
};
int target = 16;
boolean isFound = searchMatrix(matrix, target);
System.out.println(isFound);  // true

运行结果为 true,表示已经找到了目标数。

示例 2:判断二维数组中是否包含某一行

假设现在有一个 $m \times n$ 的二维矩阵 matrix,我们需要判断其中是否包含某一行 row

我们可以按照行来遍历这个二维矩阵,对于每一行都按照上述算法来查找目标数,如果找到了就说明包含该行。

代码实现如下:

int[][] matrix = {
        {1, 3, 5, 7},
        {8, 10, 11, 16},
        {23, 30, 34, 60}
};
int m = matrix.length, n = matrix[0].length;
int[] row = {8, 10, 11, 16};
boolean isFound = false;
for (int i = 0; i < m && !isFound; i++) {
    if (matrix[i][0] <= row[0] && matrix[i][n - 1] >= row[n - 1]) {
        // 假设该行是升序的
        isFound = searchMatrix(matrix, row, i);
    }
}
System.out.println(isFound);  // true

这里需要定义一个 searchMatrix() 方法,用来查找一行是否相等:

private static boolean searchMatrix(int[][] matrix, int[] row, int i) {
    int n = matrix[0].length, j = 0;
    while (j < n && matrix[i][j] == row[j]) {
        j++;
    }
    return j == n;
}

运行结果为 true,表示该二维矩阵包含了目标行。

总结

以上就是 Java 实现二维矩阵查找功能的完整攻略,核心思路就是从右上角开始查找,找到就返回 true,没找到就继续往左或者往下查找。代码实现不难,但是需要注意细节,比如空指针判断,边界条件等。在实际应用中,可以根据具体需求来调整算法实现的细节和逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java二维数组查找功能代码实现 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Redis Plus 来了,性能炸裂!

    来源:https://developer.aliyun.com/article/705239 1 什么是KeyDB? KeyDB是Redis的高性能分支,专注于多线程,内存效率和高吞吐量。除了多线程之外,KeyDB还具有仅在Redis Enterprise中可用的功能,例如Active Replication,FLASH存储支持以及一些根本不可用的功能,例如…

    Java 2023年4月25日
    00
  • SpringBoot自定义Starter与自动配置实现方法详解

    SpringBoot自定义Starter与自动配置实现方法详解 什么是SpringBoot Starter SpringBoot Starter是一种用于扩展SpringBoot框架功能的一种技术手段,它可以将应用程序中涉及到的依赖库集成到SpringBoot环境中,使得应用程序更加简单、灵活且易于扩展。 Starter的实现过程主要有自定义Starter和…

    Java 2023年5月20日
    00
  • 详解SpringBoot中JdbcTemplate的事务控制

    详解SpringBoot中JdbcTemplate的事务控制 什么是JdbcTemplate JdbcTemplate是Spring框架提供的一个简化JDBC操作的模板类,通过JdbcTemplate可以避免传统JDBC操作中大量重复的样板代码,提高开发效率。JdbcTemplate中封装了大量常用操作方法,如查询、更新等。 什么是事务控制 事务是指具有原子…

    Java 2023年5月20日
    00
  • java 汉诺塔详解及实现代码

    Java 汉诺塔详解及实现代码攻略 汉诺塔是经典的递归算法题目,其背后的递归思想能够很好地帮助我们理解递归算法。本攻略将详细讲解Java实现汉诺塔的思路及代码实现,以及两个示例演示。 思路及示例演示 思路 该问题的本质是将$n$个圆盘从初始塔$A$借助辅助塔$B$移动到目标塔$C$。根据思考,我们可以发现它是递归结构,且满足以下三个条件: 如果只有一个圆盘,…

    Java 2023年5月23日
    00
  • Struts和servlet不能共存问题解决方法

    当你在一个Java web项目中同时使用Struts和Servlet时,可能会出现以下错误: java.lang.ClassCastException: org.apache.struts.action.ActionServlet cannot be cast to javax.servlet.Servlet 这是因为Struts包含了一个名为ActionS…

    Java 2023年5月20日
    00
  • JAVA程序员不得不留意的编码规范

    下面我将为您详细讲解“Java程序员不得不留意的编码规范”的完整攻略。 1. 编码规范的重要性 编码规范是一种旨在保证程序员编写的代码风格统一规范,提高代码的可读性和可维护性的编码习惯。良好的编码规范不仅可以改善代码质量,使代码更加规范化,提高代码可读性和可维护性,还可以提高代码重用性和移植性,减少程序出错率,有利于团队协作。而采用不规范化的编码规范可能会产…

    Java 2023年5月20日
    00
  • java web将数据导出为pdf格式文件代码片段

    当需要将Java Web应用程序中的数据转换为PDF格式文件时,我们可以通过使用第三方的Java库来完成。下面是一份详细的攻略。 第一步:选择合适的Java库 有许多Java库可以用于将Web应用程序数据转换为PDF格式文件,如iText、PDFBox、JasperReports等。本文以iText为例进行说明。 iText是一个免费的Java库,用于生成和…

    Java 2023年6月15日
    00
  • Java BigDecimal基础用法详解

    Java BigDecimal基础用法详解 什么是BigDecimal Java中的float和double类型是不能精确表示十进制数的,这对于很多需要精确计算的场景是不适用的。而BigDecimal是Java提供的一个可以精确表示任意大小和精度的十进制数类。 常用构造方法 BigDecimal(double val):通过一个Double类型的值来构造Bi…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部