返回
LeetCode 240:搜索二维矩阵 II - 进阶二分查找
前端
2023-11-30 10:45:07
在这个数字化的时代,解决复杂问题的创新方法至关重要。在数据密集型应用程序中,高效搜索二维矩阵是至关重要的。LeetCode 240 题目提供了一个引人入胜的机会,让我们探索一种巧妙的二分查找算法,该算法适用于二维矩阵。
理解问题
LeetCode 240 题目要求我们搜索一个 排序后的 二维矩阵中的目标值。与标准的二分查找不同,这个矩阵中的元素既按行又按列排序。这种额外的复杂性使传统方法变得无效,促使我们寻找更巧妙的解决方案。
二分查找的进阶
要理解这个进阶的二分查找算法,我们需要重新思考 我们看待二维矩阵的方式。我们可以将它视为一个 排序后的一维数组 ,其中每一行是一个连续的块。
算法的关键步骤如下:
- 确定初始范围: 我们从矩阵的 右上角元素 开始,因为它位于右上角的块中。我们用
start
和end
指针标记这个块的范围。 - 计算中点: 就像标准二分查找一样,我们计算
start
和end
之间的中间行mid_row
。 - 检查中点行: 我们通过
mid_row
行逐列搜索目标值。如果目标值在此行中,我们返回true
。否则,如果目标值比当前元素小,我们调整end
指针为mid_row
。如果目标值大于当前元素,我们调整start
指针为mid_row + 1
。 - 重复步骤 2 和 3: 我们重复步骤 2 和 3,直到
start
和end
相遇,或者我们找到目标值。
实现细节
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