题目描述:
编写一个高效的算法来搜索 m x n
矩阵 matrix
中的一个目标值 target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例 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 输出:true
示例 2:
输入: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 输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
- 每行的所有元素从左到右升序排列
- 每列的所有元素从上到下升序排列
-109 <= target <= 109
我的作答:
和【hot100】刷题记录(9)-螺旋矩阵 的思路很像,都是分别循环行和列;本题的思路是因为元素是越往右和往下变大,所以从最右边和最下面开始遍历,从外往内推;
需要注意的是m和n有大小区分
class Solution(object):
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if not matrix and target: return False
if not matrix and not target: return True
starti, startj = 0, 0
offset = 1
m, n = len(matrix), len(matrix[0])
while starti<=m-offset and startj<=n-offset:
for i in range(starti, m-offset+1): #检查每行最后一个元素
if matrix[i][n-offset]<target:
starti = i+1
elif matrix[i][n-offset]==target:
return True
else: break
for j in range(startj, n-offset+1): #检查每列最后一个元素
if matrix[m-offset][j]<target:
startj = j+1
elif matrix[m-offset][j]==target:
return True
else: break
offset += 1
return False
参考:
class Solution(object):
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
return target in chain(*matrix)
chain(*matrix)
是 itertools.chain
函数的一个用法,它用于将多个可迭代对象连接成一个长的可迭代对象。target in chain(*matrix)
的意思是检查 target
是否存在于 matrix
中的任何一个元素中。
就是先把二维数组展平成一维数组,再查找。*matrix是把每一行的列表拼起来[[1,2] [2,3]]然后chain()是变成[1,2, 2, 3]接着查找。。。