返回

LeetCode 240:搜索二维矩阵 II - 进阶二分查找

前端

在这个数字化的时代,解决复杂问题的创新方法至关重要。在数据密集型应用程序中,高效搜索二维矩阵是至关重要的。LeetCode 240 题目提供了一个引人入胜的机会,让我们探索一种巧妙的二分查找算法,该算法适用于二维矩阵。

理解问题

LeetCode 240 题目要求我们搜索一个 排序后的 二维矩阵中的目标值。与标准的二分查找不同,这个矩阵中的元素既按行又按列排序。这种额外的复杂性使传统方法变得无效,促使我们寻找更巧妙的解决方案。

二分查找的进阶

要理解这个进阶的二分查找算法,我们需要重新思考 我们看待二维矩阵的方式。我们可以将它视为一个 排序后的一维数组 ,其中每一行是一个连续的块。

算法的关键步骤如下:

  1. 确定初始范围: 我们从矩阵的 右上角元素 开始,因为它位于右上角的块中。我们用 startend 指针标记这个块的范围。
  2. 计算中点: 就像标准二分查找一样,我们计算 startend 之间的中间行 mid_row
  3. 检查中点行: 我们通过 mid_row 行逐列搜索目标值。如果目标值在此行中,我们返回 true。否则,如果目标值比当前元素小,我们调整 end 指针为 mid_row。如果目标值大于当前元素,我们调整 start 指针为 mid_row + 1
  4. 重复步骤 2 和 3: 我们重复步骤 2 和 3,直到 startend 相遇,或者我们找到目标值。

实现细节

def searchMatrix(matrix, target):
    if not matrix or not matrix[0]:
        return False

    # 设置初始范围
    start_row = 0
    end_row = len(matrix) - 1
    start_col = len(matrix[0]) - 1

    # 开始二分查找
    while start_row <= end_row and start_col >= 0:
        # 计算中间行
        mid_row = (start_row + end_row) // 2

        # 在中间行中查找
        col = start_col
        while col >= 0:
            if matrix[mid_row][col] == target:
                return True
            elif matrix[mid_row][col] < target:
                col -= 1
            else:
                break

        # 根据结果调整范围
        if matrix[mid_row][col] < target:
            start_row += 1
        else:
            start_col -= 1

    # 未找到目标值
    return False

SEO优化