
《剑指offer》1、二维数组中的查找
检查数组是否为空,若为空则返回false。 设置行指针row从数组的最后一行开始(rows - 1),列指针column从数组的最后一列开始(columns - 1)。 遍历检查: 若遍历结束仍未找到,返回false。
发布日期:2021-05-10 01:19:14
浏览次数:17
分类:精选文章
本文共 1267 字,大约阅读时间需要 4 分钟。
在一个二维数组中,每一行按照从左到右的递增顺序排列,每一列按照从上到下的递增顺序排列。这样的数组有着良好的单调性,能够利用这一特性进行高效查找。
要实现二维数组的查找,可以模拟一种类似于二分查找的列筛法。选择数组的右下角元素作为起始点,逐步细化查找范围,跳过较大的和较小的元素,以减少不必要的检查。
具体步骤如下:
- 如果当前元素等于目标,返回true。
- 如果当前元素大于目标,说明目标在当前行的左边或下方行,进而设置column = column - 1。
- 如果当前元素小于目标,说明目标在当前列的上方或当前行的右边,进而设置row = row - 1。
- 维护一个标记变量,当找到目标时设为true,结束循环。
以下是具体的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)))的时间复杂度内完成查找,极大提高了效率。