数据结构与算法之 leetcode 二分查找二维矩阵算法 行列递增查找

数据结构与算法阿木 发布于 6 天前 3 次阅读


摘要:

二分查找是一种高效的查找算法,其核心思想是将有序数组分成两半,根据目标值与中间值的比较结果,决定在左半部分还是右半部分继续查找。在二维矩阵中,如果矩阵的行和列都是有序的(即每一行从左到右递增,每一列从上到下递增),我们可以利用二分查找的思想来优化查找过程。本文将围绕LeetCode上的“二分查找二维矩阵”问题,深入解析这一算法的原理、实现以及优化策略。

一、问题背景

LeetCode上的“二分查找二维矩阵”问题如下:

给定一个按行和列都升序排列的二维矩阵,编写一个函数,判断一个目标值是否存在于矩阵中。如果存在,返回其坐标;如果不存在,返回[-1, -1]。

示例:


matrix = [


[1, 3, 5, 7],


[10, 11, 16, 20],


[23, 30, 34, 50]


]


target = 3


输出:[1, 2],因为3位于矩阵的第二行第三列。

二、算法原理

由于矩阵的行和列都是有序的,我们可以将二维矩阵看作一个一维有序数组。具体来说,对于矩阵中的任意元素`matrix[i][j]`,我们可以通过以下公式将其映射到一维数组的索引:


index = i matrix[0].length + j


这样,我们就可以使用二分查找算法在一维数组中查找目标值。找到目标值后,再根据公式将其转换回二维矩阵的坐标。

三、代码实现

下面是使用Python实现的二分查找二维矩阵算法:

python

def searchMatrix(matrix, target):


if not matrix or not matrix[0]:


return [-1, -1]



rows, cols = len(matrix), len(matrix[0])


left, right = 0, rows cols - 1



while left <= right:


mid = (left + right) // 2


mid_value = matrix[mid // cols][mid % cols]



if mid_value == target:


return [mid // cols, mid % cols]


elif mid_value < target:


left = mid + 1


else:


right = mid - 1



return [-1, -1]

测试代码


matrix = [


[1, 3, 5, 7],


[10, 11, 16, 20],


[23, 30, 34, 50]


]


target = 3


print(searchMatrix(matrix, target)) 输出:[1, 2]


四、优化策略

1. 避免重复计算:在计算一维数组索引时,我们可以使用位运算来避免重复计算除法和取余操作。

2. 使用递归:可以将二分查找算法改写为递归形式,使代码更加简洁。

3. 考虑边界情况:在实现算法时,要考虑矩阵为空、矩阵只有一行或一列等边界情况。

五、总结

二分查找二维矩阵算法是一种高效且实用的查找方法,它利用了矩阵的有序特性,将二维问题转化为了一维问题。通过理解算法原理和实现细节,我们可以更好地掌握这一算法,并在实际应用中发挥其优势。在LeetCode等编程竞赛平台上,这类问题也是高频考点,掌握二分查找二维矩阵算法对于提高解题能力具有重要意义。