【剑指offer】面试题04:二维数组中的查找(java)
发布日期:2021-04-30 21:04:53 浏览次数:79 分类:精选文章

本文共 1165 字,大约阅读时间需要 3 分钟。

要解决一个二维数组中查找特定整数的问题,可以利用二叉搜索的思路,结合数组的结构特点,从右上角开始查找,逐步缩小搜索范围。

方法思路

  • 问题分析: 给定一个按行递增、按列递增的二维数组,目标是查找是否存在一个特定的整数。由于数组的特殊结构,每行递增意味着左边的数值较小,右边的数值较大;每列递增意味着上面的数值较小,下面的数值较大。因此,可以通过类似于二叉搜索的方法高效地查找目标值。

  • 算法选择: 采用递归或迭代的方式,从右上角开始,比较当前元素与目标值:

    • 如果当前元素等于目标值,返回true。
    • 如果当前元素大于目标值,向左移动(减小列索引j)。
    • 如果当前元素小于目标值,向下移动(增加行索引i)。
  • 优化思路: 这种方法的时间复杂度为O(n + m),其中n和m分别是矩阵的行数和列数,因为每个元素最多被访问一次。

  • 解决代码

    public class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0 || matrix[0].length < 1) {
    return false;
    }
    int j = matrix[0].length - 1;
    int i = 0;
    while (i < matrix.length && j >= 0) {
    if (matrix[i][j] == target) {
    return true;
    } else if (matrix[i][j] > target) {
    j--;
    } else {
    i++;
    }
    }
    return false;
    }
    }

    代码解释

  • 初始检查: 检查矩阵是否为空或没有有效的行或列,如果是,直接返回false。
  • 初始化索引: 从右上角开始,初始化行索引i为0,列索引j为最后一列的索引。
  • 循环查找: 使用while循环,直到i超过行数或j小于0。
    • 比较当前元素: 如果当前元素等于目标值,返回true。
    • 当前元素大于目标值: 将j减1,向左移动。
    • 当前元素小于目标值: 将i增加1,向下移动。
  • 结束返回: 如果循环结束后未找到目标值,返回false。
  • 这种方法利用了二维数组的有序性质,能够高效地缩小搜索范围,确保在最优时间复杂度内完成任务。

    上一篇:JAVA 使用web3j接入以太坊(二)
    下一篇:全网最全原理讲解!Android高级工程师必看系列,大厂面经合集

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2026年06月04日 18时59分48秒