《剑指offer》1、二维数组中的查找
发布日期:2021-05-10 01:19:14 浏览次数:17 分类:精选文章

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

在一个二维数组中,每一行按照从左到右的递增顺序排列,每一列按照从上到下的递增顺序排列。这样的数组有着良好的单调性,能够利用这一特性进行高效查找。

要实现二维数组的查找,可以模拟一种类似于二分查找的列筛法。选择数组的右下角元素作为起始点,逐步细化查找范围,跳过较大的和较小的元素,以减少不必要的检查。

具体步骤如下:

  • 检查数组是否为空,若为空则返回false。
  • 设置行指针row从数组的最后一行开始(rows - 1),列指针column从数组的最后一列开始(columns - 1)。
  • 遍历检查:
    • 如果当前元素等于目标,返回true。
    • 如果当前元素大于目标,说明目标在当前行的左边或下方行,进而设置column = column - 1。
    • 如果当前元素小于目标,说明目标在当前列的上方或当前行的右边,进而设置row = row - 1。
    • 维护一个标记变量,当找到目标时设为true,结束循环。
  • 若遍历结束仍未找到,返回false。
  • 以下是具体的Java代码实现:

    public class Solution {
    public boolean Find(int target, int[][] array) {
    if (array == null || array.length == 0 || array[0].length == 0) {
    return false;
    }
    int rows = array.length;
    int columns = array[0].length;
    boolean found = false;
    int row = rows - 1;
    int column = columns - 1;
    while (row >= 0 && column >= 0) {
    if (array[row][column] == target) {
    found = true;
    break;
    } else if (array[row][column] > target) {
    // 目标在同一行的左边或下方行的右边
    column--;
    } else {
    // 目标在同一列的上方或当前行的右边
    row--;
    }
    }
    return found;
    }
    }

    这个实现通过从右下角开始,逐步调整行和列的指针,有效地缩小了查找范围,类似二分法,能够在O(log(min(rows, columns)))的时间复杂度内完成查找,极大提高了效率。

    上一篇:为什么要禁止除GET和POST之外的HTTP方法?
    下一篇:java中length,length(),size()区别

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月07日 07时20分53秒