二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路(右上角开始)
该二维数组特性是数字大小每一行从左到右递增,每一列从上到下递增。
因此可以从右上角开始遍历:
该数字大于目标数字target,则该行前面可能有目标数字target,继续向前遍历,列标 -1
该数字小于目标数字target,则该行前面不可能有目标数字target,转向下一行,行标 +1
该数字等于目标数字,返回True
代码示例(Python)
# -*-
在编程领域,尤其是在面试或解决算法问题时,《剑指Offer》是一本非常著名的书籍,它包含了一系列经典的编程题目。本文将讨论的是《剑指Offer》中的一道问题,即“二维数组中的查找”。该问题要求在特定结构的二维数组中寻找一个整数是否存在。
题目描述:
给定一个二维数组,其特点是每行都是从左到右递增的,而每列是从上到下递增。例如:
```
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
```
我们需要实现一个函数,输入这个二维数组和一个整数`target`,判断数组中是否存在该整数。
解题思路:
由于数组的特殊排列,我们可以采用一种高效的策略来查找目标整数,即从右上角(最后一个元素的位置)开始遍历。这是因为如果目标值大于当前元素,那么它可能存在于当前元素的左边;如果目标值小于当前元素,那么它只能存在于当前元素的下方或者左下方。根据这个规律,我们可以编写如下的搜索算法:
1. 初始化行索引`row`为0,列索引`column`为最后一列。
2. 当`row`小于数组的行数时,进行以下步骤:
a. 检查当前元素`array[row][column]`是否等于`target`,如果相等则返回`True`。
b. 如果`array[row][column]`小于`target`,说明目标可能在当前元素的下方,因此将`row`加1。
c. 如果`array[row][column]`大于`target`,说明目标可能在当前元素的左边,但由于每行递增,目标不可能在当前列的上方,所以将`column`减1。
3. 如果整个数组遍历完都没有找到目标,返回`False`。
以下是基于此思路的Python代码实现:
```python
class Solution:
def Find(self, target, array):
rows = len(array) # 总行数
columns = len(array[0]) # 总列数
row = 0 # 起始行
column = columns - 1 # 起始列
while row < rows:
if array[row][column] == target:
return True
elif array[row][column] < target:
row += 1
else:
column -= 1
return False
```
这个算法的时间复杂度为O(m+n),其中m是行数,n是列数。由于数组的特殊结构,我们避免了不必要的遍历,提高了效率。在实际应用中,这种针对性的搜索策略对于处理类似问题非常有用,特别是在数据量大、需要高效查找的情况下。