要求:
二维数组每一行按照从左到右递增顺序排列,每一列按照从上到下顺序排列。实现一个函数,输入一个整数判断数组中是否含有该整数。
分析:
最简单的方法就是对二维数组进行顺序遍历,然后判断待查找元素是否在数组中,这种时间复杂度为O(M*N),M,N分别为二维数组行数和列数。
但顺序遍历不是最好的方法,当数组有序的时候,二分查找是一个很好的方法,具体思路如下:给定数组array(行数:rows,列数:columns,待查找元素:data),首先遍历数组右上角元素(i=0,j=columns-1),如果array[i][j]==data,则在二维数组中找到了data,直接返回;如果array[i][j]>data,则说明这一列其他元素也一定大于data,因此,通过 j- 操作排除这一列。同理,如果array[i][j]<data,则说明这一行中其他数字一定比data小,因此,通过 i+ 操作排除这一行。依次类推,直到遍历完数组结束。
代码实现:
# -*- coding:utf-8 -*-
def findWithBinary(array,data):
if array == None:
return False
#从二维数组右上角元素开始遍历
i = 0
rows = len(array)
columns = len(array[0])
j = columns - 1
while i < rows and j >= 0:
#在数组中找到data,返回
if array[i][j] == data:
return True
#当前遍历到数组中的值大于data,data肯定不在这一列
elif array[i][j] > data:
j -= 1
#当前遍历到数组中的值小于data,data肯定不在这一行
else:
i += 1
return False
if __name__ == "__main__":
array = [[0,1,2,3,4],[10,11,12,13,14],[20,21,22,23,24],[30,31,32,33,34],[40,41,42,43,44]]
print(findWithBinary(array,21))
print(findWithBinary(array,25))
运行结果:
True
False
性能分析:
此算法从二维数组右上角遍历到左下角,算法时间复杂度为O(M+N),此外,这种方法没有申请额外的存储空间。
本文介绍如何在每一行和每一列都有序的二维数组中进行高效数据查找。通过从右上角开始,利用二分查找的思想排除部分元素,算法时间复杂度达到O(M+N)。提供详细分析和代码实现。


被折叠的 条评论
为什么被折叠?



