返回

LeetCode 240:巧用分治法,玩转二维矩阵搜索

后端

作为一名算法大师,面对复杂数据结构如二维矩阵,如何快速准确地从中找到目标元素是必备技能。今天,我们一起来破解 LeetCode 上的经典题目 240:搜索二维矩阵 II,深入理解如何运用分治法优雅解决此类问题。

分治法斩乱麻

分治法是一种经典的解决复杂问题的方法,它将原问题分解成更小的子问题,逐层求解,最终合并子问题的解得到原问题的解。搜索二维矩阵问题十分适合采用分治法解决。

我们从二维矩阵的左上角开始搜索。如果目标元素小于当前元素,则目标元素一定在矩阵的左侧;如果目标元素大于当前元素,则目标元素一定在矩阵的右侧。基于此,我们将矩阵分为左右两部分,继续在较小的子矩阵中搜索。

LeetCode 240:解题步骤

步骤 1:确定搜索区间

从矩阵的左上角 (0, 0) 开始,设定两个指针 leftright,分别指向矩阵的第一行和最后一列。

步骤 2:缩小搜索范围

使用 while 循环,只要 left 指针小于 right 指针,说明当前搜索区间中可能存在目标元素:

  1. 计算当前行和列的中间元素 mid
  2. 如果 mid 等于目标元素,则返回找到的位置。
  3. 如果 mid 小于目标元素,将 left 指针移动到当前行的下一列。
  4. 如果 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 题目就是一个经典的案例,运用分治法,我们能够快速准确地搜索二维矩阵,这也是算法学习中重要的思维模型。