题目描述
解法
解法一:暴力法
两个for循环,逐个遍历,找target
解法二:按规律搜索
矩阵的特性很重要啊!!不能白给啦
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
思路:
刚开始,我想的是从最矩阵中间的元素开始与target比较,借鉴二分搜索的思路,但是…发现只有往左上角走是变小的…就不符合二分法了,不知道 i (行)、j(列)如何改变了。就像下面这个图这样
所以不能从中间开始区分,只能从角落开始。但是并不是四个角都可以的,看下图,箭头表示数字变大的方向。
左上角:当行数i增加时,数变大;列数j增大时,数也变大。
右下角:当行数i减小时,数变小;列数j减小时,数也变小。
左下角:当行数i减小时,数变小;列数j增加时,数变大。
右上角:当行数i增加时,数变大;列数j减小时,数变小。
因此,只有左下角、右上角可以,也就是说因为从这两个角出发,能分别通过改变行数i和列数j来控制数变大变小。另外两个角则不能。
我写的是从右上角出发,i=0,j=len(matrix[0])-1,当target大于当前值,则i+1,也就是往下走,当前值变大;
当target小于当前值,则j-1,也就是往左走,当前值变小。直到找到target。
最终如果整个矩阵都遍历完了,说明没找到,返回False.
上代码
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if not matrix:
return False
i = 0
j = len(matrix[0])-1
while i<len(matrix) and j>-1:
if target > matrix[i][j]:
i += 1
elif target == matrix[i][j]:
return True
else:
j -= 1
return False
最坏时间复杂度:O(n2)
总结:也是注重找规律的一题,当题目给出一些特性时,一定要利用到,这些特性就是关键。