第五章 - 高频考题(中等)
1906. 查询差绝对值的最小值
0240. 搜索二维矩阵 II

题目地址(240. 搜索二维矩阵 II)

题目描述

1
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
2
3
每行的元素从左到右升序排列。
4
每列的元素从上到下升序排列。
5
示例:
6
7
现有矩阵 matrix 如下:
8
9
[
10
[1, 4, 7, 11, 15],
11
[2, 5, 8, 12, 19],
12
[3, 6, 9, 16, 22],
13
[10, 13, 14, 17, 24],
14
[18, 21, 23, 26, 30]
15
]
16
给定 target = 5,返回 true。
17
18
给定 target = 20,返回 false。
Copied!

前置知识

  • 数组

公司

  • 阿里
  • 腾讯
  • 百度
  • 字节

思路

符合直觉的做法是两层循环遍历,时间复杂度是 O(m * n), 有没有时间复杂度更好的做法呢? 答案是有,那就是充分运用矩阵的特性(横向纵向都递增), 我们可以从角落(左下或者右上)开始遍历,这样时间复杂度是 O(m + n).
其中蓝色代表我们选择的起点元素, 红色代表目标元素。

关键点解析

  • 从角落开始遍历,利用递增的特性简化时间复杂

代码

代码支持:JavaScript, Python3
JavaScript Code:
1
/*
2
* @lc app=leetcode id=240 lang=javascript
3
*
4
* [240] Search a 2D Matrix II
5
*
6
* https://leetcode.com/problems/search-a-2d-matrix-ii/description/
7
*
8
*
9
*/
10
/**
11
* @param {number[][]} matrix
12
* @param {number} target
13
* @return {boolean}
14
*/
15
var searchMatrix = function (matrix, target) {
16
if (!matrix || matrix.length === 0) return false;
17
18
let colIndex = 0;
19
let rowIndex = matrix.length - 1;
20
while (rowIndex > 0 && target < matrix[rowIndex][colIndex]) {
21
rowIndex--;
22
}
23
24
while (colIndex < matrix[0].length) {
25
if (target === matrix[rowIndex][colIndex]) return true;
26
if (target > matrix[rowIndex][colIndex]) {
27
colIndex++;
28
} else if (rowIndex > 0) {
29
rowIndex--;
30
} else {
31
return false;
32
}
33
}
34
35
return false;
36
};
Copied!
Python Code:
1
class Solution:
2
def searchMatrix(self, matrix, target):
3
m = len(matrix)
4
if m == 0:
5
return False
6
n = len(matrix[0])
7
i = m - 1
8
j = 0
9
10
while i >= 0 and j < n:
11
if matrix[i][j] == target:
12
return True
13
if matrix[i][j] > target:
14
i -= 1
15
else:
16
j += 1
17
return False
Copied!
复杂度分析
  • 时间复杂度:$O(M + N)$
  • 空间复杂度:$O(1)$
大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。 大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。