LeetCode21 - 搜索二维矩阵 II
📝 题目描述
题目链接:搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例:
示例 1:
1 | 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5 |
示例 2:
1 | 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20 |
提示:
m == matrix.lengthn == matrix[i].length1 <= n, m <= 300-10^9 <= matrix[i][j] <= 10^9每行的所有元素从左到右升序排列每列的所有元素从上到下升序排列-10^9 <= target <= 10^9
💡 解题思路
方法一:二分查找
首先,由于矩阵每行的元素从左到右升序排列、每列的元素从上到下升序排列,我们可以通过剪枝来缩小查找范围。
举例来说,对于示例二中的矩阵,如果 target = 5,那么我们通过遍历第一行[1 4 7 11 15],可以确定 target 肯定只会出现在[1 4]两列,因为后面的列的首个值(最小值)已经大于5,肯定后续元素也会大于5;同理,遍历第一列,我们可以确定 target 只会出现在[1 2 3]这三列中。通过这样的剪枝,我们把查找范围从缩小到了。
因此当我们收到 target 时,可以通过遍历首行的每个元素、每列的首个元素,缩小要查找的范围。
接下来我们可以从缩小后的范围中,按行遍历,通过二分法进一步提高效率。
方法二:优化解法
我们可以使用类似二叉树的思路,将起点放在右上角(或左下角)。
以右上角(x, y)为例,向左走,元素会变小,向下走,元素会变大。
因此我们可以不断将自身与 target 比较,并根据结果调整位置,直到找到 target 或走出矩阵边界。
🔧 代码实现
1、二分查找
1 | class Solution { |
2、Z字查找
1 | class Solution { |
📊 复杂度分析
1、二分查找
- 时间复杂度:。对一行使用二分查找的时间复杂度为 O(logn),最多需要进行 m 次二分查找。
- 空间复杂度:。
2、Z字查找
- 时间复杂度::在搜索的过程中,如果我们没有找到 target,那么我们要么将 y 减少 1,要么将 x 增加 1。由于 (x,y) 的初始值分别为 (0,n−1),因此 y 最多能被减少 n 次,x 最多能被增加 m 次,总搜索次数为 m+n。在这之后,x 和 y 就会超出矩阵的边界。
- 空间复杂度:。
🎯 总结
- 核心思想:掌握二分查找的写法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 很多时候不懂事!