数据结构与算法之 leetcode 二分查找二维数组 行列有序矩阵

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


摘要:

本文将围绕LeetCode上的经典题目“二分查找二维数组(行列有序矩阵)”展开,深入探讨二分查找算法在解决行列有序矩阵查找问题中的应用。通过分析题目背景、解题思路、代码实现以及性能优化等方面,帮助读者全面理解二分查找在二维有序矩阵中的应用。

一、题目背景

在LeetCode中,有一个经典的题目叫做“二分查找二维数组(行列有序矩阵)”。题目描述如下:

给定一个按行和列都升序排列的二维数组 matrix,编写一个函数,找出给定目标值 target 是否存在于该矩阵中。如果存在,则返回其索引;如果不存在,则返回 [-1, -1]。

示例:


matrix = [


[1, 4, 7, 11, 15],


[2, 5, 8, 12, 19],


[3, 6, 9, 16, 22],


[10, 13, 14, 17, 24],


[18, 21, 23, 26, 30]


]


target = 5


输出:`[1, 2]`

二、解题思路

由于矩阵是按行和列都升序排列的,我们可以利用二分查找的思想来解决这个问题。具体思路如下:

1. 将二维数组转换为一维数组,并计算转换后的索引。

2. 对一维数组进行二分查找。

3. 如果找到目标值,则将一维索引转换回二维索引。

4. 如果未找到目标值,则返回 [-1, -1]。

三、代码实现

下面是使用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_val = matrix[mid // cols][mid % cols]



if mid_val == target:


return [mid // cols, mid % cols]


elif mid_val < target:


left = mid + 1


else:


right = mid - 1



return [-1, -1]

测试代码


matrix = [


[1, 4, 7, 11, 15],


[2, 5, 8, 12, 19],


[3, 6, 9, 16, 22],


[10, 13, 14, 17, 24],


[18, 21, 23, 26, 30]


]


target = 5


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


四、性能优化

在上述代码中,我们将二维数组转换为一维数组,这可能会增加额外的内存消耗。为了优化性能,我们可以直接在原二维数组上进行二分查找,避免转换。

下面是优化后的代码:

python

def searchMatrixOptimized(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_val = matrix[mid // cols][mid % cols]



if mid_val == target:


return [mid // cols, mid % cols]


elif mid_val < target:


left = mid + 1


else:


right = mid - 1



return [-1, -1]

测试代码


matrix = [


[1, 4, 7, 11, 15],


[2, 5, 8, 12, 19],


[3, 6, 9, 16, 22],


[10, 13, 14, 17, 24],


[18, 21, 23, 26, 30]


]


target = 5


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


五、总结

本文通过分析LeetCode上的“二分查找二维数组(行列有序矩阵)”题目,详细介绍了二分查找算法在解决行列有序矩阵查找问题中的应用。通过代码实现和性能优化,帮助读者更好地理解二分查找算法在二维有序矩阵中的应用。在实际编程中,我们可以根据具体问题选择合适的算法和数据结构,以达到最优的性能。