题目
在一个二维数组中,每一行按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该整数,并返回索引。
例如,判断下列数组是否包含7,并返回索引
思路:
我们发现右上角的元素是该行的最大,该列的最小。若要查找的数字m,大于右上角数字n,说明这个数不在第一行,删除第一行;若m<n,说明这个数不在最后一列,删除最后一列。删除后更新右上角的元素。重复以上过程直到找到该数。
如下图所示流程,判断7是否在数组中
python实现如下:
#coding=utf-8
## 面试题4 二维数组中的查找
## 在一个二维数组中,每一行都按照从左到右递增的顺序排序;每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组是否有该元素。
def search_2d_array(array_2d, item):
top = 0 #右上角元素的行索引
right = array_2d.shape[1] - 1 #右上角元素的列索引
if item > array_2d[-1, -1]: #判断该数是否比数组最小的元素小
print('exceed scope of array!', end=' ')
return
if item < array_2d[0, 0]:#判断该数是否比数组最大的元素大
print('too small!', end=' ')
return
while top <= array_2d.shape[0] - 1 and right >= 0:
if array_2d[top, right] > item:
right -= 1 #更新列索引
continue
if array_2d[top, right] < item:
top += 1 #更新行索引
continue
else:
return True,[top, right]
print('haven\'t this number', end=' ')
return None
if __name__ == '__main__':
import numpy as np
two_d_array = np.array([[1, 2, 8, 9],
[2, 4, 9, 12],
[4, 7, 10, 13],
[6, 8, 11, 15]])
#测试用例
items = [0, 7, 4.4, 16]
for item in items:
print(search_2d_array(two_d_array, item))
运行结果