首先,我们需要了解什么是二维有序数组。二维有序数组,也叫做二维矩阵,是一个含有 m 行 n 列的矩阵,每行每列都是有序的。在这个二维有序数组中,我们需要实现一个二分查找算法,用来查找某个目标值是否存在于这个矩阵中。
以下是步骤:
1. 将二维矩阵转换为一维数组
由于二维矩阵每一行每一列都是有序的,我们可以将二维矩阵看成一个一维数组,即将每一行连在上一行的后面,这样就得到了一个有序的一维数组。当然,这个一维数组不是真的去拼接,只是逻辑上这么看。这个一维数组的长度为 mn,行列的下标对应的关系为:(i,j)->in+j。
2. 二分查找目标值
拿到了有序的一维数组之后,我们就可以使用二分查找算法来检测目标值是否存在于这个数组中。在二分查找的过程中,我们需要定义左右指针来标定当前二分的范围。初始时左指针 l=0,右指针 ri=len(matrix)-1。每次取左右指针之间的中间值 middle = (l + ri) // 2 进行比较,如果比目标值大,则舍弃 middle 到右指针之间的那段数组,将右指针更新为 mid - 1;否则舍弃 middle 到左指针之间的那段数组,将左指针更新为 mid + 1,直到左右指针相遇,判断最后一个数是否等于目标值。
3. 实现Python代码
def find(matrix, target):
# 特判,如果数组或目标值为空,返回 False。
if not matrix or not matrix[0] or not target:
return False
# 将二维矩阵转为一维数组
m, n = len(matrix), len(matrix[0])
l, r = 0, m*n - 1
while l <= r:
# 计算中间位置
mid = (l + r) // 2
# 将一维数组的索引转换为二维矩阵中的索引
i, j = mid // n, mid % n
# 如果找到目标值,返回 True
if matrix[i][j] == target:
return True
# 如果中间值比目标值大,将右指针更新为 mid - 1
elif matrix[i][j] > target:
r = mid - 1
# 如果中间值比目标值小,将左指针更新为 mid + 1
else:
l = mid + 1
# 如果没有找到目标值,返回 False
return False
4. 示例说明
示例 1
matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]]
target = 3
print(find(matrix, target)) # True
解释:将二维矩阵转换成一维数组为 [1, 3, 5, 7, 10, 11, 16, 20, 23, 30, 34, 50],应用二分查找, 找到目标值3,返回True。
示例 2
matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]]
target = 13
print(find(matrix, target)) # False
解释:将二维矩阵转换成一维数组为 [1, 3, 5, 7, 10, 11, 16, 20, 23, 30, 34, 50],应用二分查找,在二分过程中找不到目标值13,返回False。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现二维有序数组查找的方法 - Python技术站