返回
LeetCode 240:巧用分治法,玩转二维矩阵搜索
后端
2023-11-13 17:54:50
作为一名算法大师,面对复杂数据结构如二维矩阵,如何快速准确地从中找到目标元素是必备技能。今天,我们一起来破解 LeetCode 上的经典题目 240:搜索二维矩阵 II,深入理解如何运用分治法优雅解决此类问题。
分治法斩乱麻
分治法是一种经典的解决复杂问题的方法,它将原问题分解成更小的子问题,逐层求解,最终合并子问题的解得到原问题的解。搜索二维矩阵问题十分适合采用分治法解决。
我们从二维矩阵的左上角开始搜索。如果目标元素小于当前元素,则目标元素一定在矩阵的左侧;如果目标元素大于当前元素,则目标元素一定在矩阵的右侧。基于此,我们将矩阵分为左右两部分,继续在较小的子矩阵中搜索。
LeetCode 240:解题步骤
步骤 1:确定搜索区间
从矩阵的左上角 (0, 0) 开始,设定两个指针 left
和 right
,分别指向矩阵的第一行和最后一列。
步骤 2:缩小搜索范围
使用 while
循环,只要 left
指针小于 right
指针,说明当前搜索区间中可能存在目标元素:
- 计算当前行和列的中间元素
mid
。 - 如果
mid
等于目标元素,则返回找到的位置。 - 如果
mid
小于目标元素,将left
指针移动到当前行的下一列。 - 如果
mid
大于目标元素,将right
指针移动到当前列的前一行。
步骤 3:查找失败
如果 while
循环结束后仍未找到目标元素,说明目标元素不存在于矩阵中,返回 -1
。
代码示例
def searchMatrix(matrix, target):
if not matrix:
return -1
left, right = 0, len(matrix[0]) - 1
while left <= right:
mid_row = (left + right) // 2
mid_col = (left + right) // 2
if matrix[mid_row][mid_col] == target:
return [mid_row, mid_col]
elif matrix[mid_row][mid_col] < target:
left = mid_col + 1
else:
right = mid_col - 1
return -1
总结
通过分治法,我们可以将复杂问题拆解成易于处理的子问题,逐步缩小搜索范围,最终高效找到目标元素。LeetCode 240 题目就是一个经典的案例,运用分治法,我们能够快速准确地搜索二维矩阵,这也是算法学习中重要的思维模型。