给定M×N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。
示例:
现有矩阵 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。
给定 target = 20,返回 false。
由于数组是按序排列的,因此我们可以灵活的找到以一个数位起点,如target大于或小于该数,则查找范围减少一行或者一列。观察可以发现数组的左下角数或右上角两个数都可以作为起点。
注意数组可能为空数组,
以测试题为例:选取matrix左下角那个数18为起点,18 > 5说明target一定在数组的上方、故上移一行到10,同理直到 3 < 5说明target一定在该数右边、故右移一列到6,以此类推,直到找到target,若超出数组范围还没找到则返回False。
- class Solution(object):
- def findNumberIn2DArray(self, matrix, target):
- """
- :type matrix: List[List[int]]
- :type target: int
- :rtype: bool
- """
- if len(matrix) == 0: # 如若数组为空,则直接返回无需再进行查找
- return False
- else:
- n = len(matrix) # 得到数组大小
- m = len(matrix[0])
- i, j = n-1, 0
- while i >= 0 and j < m:
- if matrix[i][j] > target:
- i -= 1
- elif matrix[i][j] < target:
- j += 1
- else:
- return True
- return False
时间复杂度:O(n+m)。访问到的下标的行最多增加 n 次,列最多减少 m 次,因此循环体最多执行 n + m 次。
空间复杂度:O(1)。