题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
思路
简单来说就是将一个一维有序数组切成若干长度相同的段,然后将这些段拼接成一个二维数组。你的任务就是在这个拼接成的二维数组中找到 target。
需要注意的是,数组是不存在重复元素的。
如果有重复元素,我们该怎么办?
算法:
选择矩阵左下角作为起始元素 Q
如果 Q > target,右方和下方的元素没有必要看了(相对于一维数组的右边元素)
如果 Q < target,左方和上方的元素没有必要看了(相对于一维数组的左边元素)
如果 Q == target ,直接 返回 True
交回了都找不到,返回 False
#代码(Python)
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m = len(matrix)
if m == 0:
return False
n = len(matrix[0])
x = m - 1
y = 0
while x >= 0 and y < n:
if matrix[x][y] > target:
x -= 1
elif matrix[x][y] < target:
y += 1
else:
return True
return False
复杂度分析
时间复杂度:最坏的情况是只有一行或者只有一列,此时时间复杂度为
O
(
M
∗
N
)
O(M * N)
O(M∗N)。更多的情况下时间复杂度为
O
(
M
+
N
)
O(M + N)
O(M+N)
空间复杂度:
O
(
1
)
O(1)
O(1)