LeetCode 第 240 题:搜索二维矩阵 II
字数 880 2025-10-27 22:16:06
LeetCode 第 240 题:搜索二维矩阵 II
题目描述
给定一个 m x n 的矩阵 matrix,该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
要求编写一个高效的算法来搜索矩阵中是否存在目标值target。如果存在返回true,否则返回false。
解题思路
由于矩阵的行和列都是有序的,我们可以利用这种特性从矩阵的右上角(或左下角)开始搜索。以右上角为例:
- 如果当前元素等于
target,直接返回true。 - 如果当前元素大于
target,说明目标值不可能在当前元素的同一列(因为列向下递增),因此向左移动一列。 - 如果当前元素小于
target,说明目标值不可能在当前元素的同一行(因为行向左递减),因此向下移动一行。
这样每一步都能排除一行或一列,时间复杂度为O(m + n)。
详细步骤
- 初始化指针:从矩阵的右上角开始,即行索引
row = 0,列索引col = n - 1。 - 循环搜索:当指针在矩阵范围内时(
row < m且col >= 0):- 如果
matrix[row][col] == target,返回true。 - 如果
matrix[row][col] > target,说明目标值可能在当前元素的左侧,列索引col减 1。 - 如果
matrix[row][col] < target,说明目标值可能在当前元素的下方,行索引row加 1。
- 如果
- 终止条件:如果指针越界仍未找到目标值,返回
false。
示例演示
以矩阵为例:
matrix = [
[1, 4, 7, 11],
[2, 5, 8, 12],
[3, 6, 9, 16],
[10,13,14,17]
]
搜索 target = 5:
- 从右上角
11开始,11 > 5,向左移动到7。 7 > 5,向左移动到4。4 < 5,向下移动到5。5 == 5,返回true。
关键点
- 选择右上角或左下角作为起点,可以保证每次移动能排除一行或一列。
- 避免暴力搜索(
O(mn))或二分查找的复杂实现,该方法简洁且高效。