题目描述:
- 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增排序。
- 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题目分析:
对题目的分析:
我们选取二维数组右上角或者左下角的数字来不断的和目标整数做比较
详细思路:
以右上角来举例说明:
- 首先我们选取数组右上角的数字。
- 如果该数字等于要查找的数字,则查找过程结束。
- 如果该数字大于查找的数字,则剔除这个数字所在的列。
- 如果该数字小于要查找的数字,则剔除这个数字所在的行。
举例说明:
若目标number是7,先用7和9做比较,具体如下图所示:
代码实现:
class Solution:
def find(self,array,number):
if array == []: # 排空
return False
rows = len(array) # 总行数
columns = len(array[0]) # 总列数
# 定义右上角坐标位置[i][j]
i = 0
j = columns - 1
while i < rows and j >= 0:
if array[i][j] < number: # 如果右上角值小于目标值,只可能在矩阵下方,则行数加1、下移
i += 1
elif array[i][j] > number: # 如果右上角值大于目标值,只可能在矩阵左边,则列数减1、左移
j -= 1
else:
return True # 否则相等,返回True
return False
if __name__ == '__main__':
# 验证:
# 二维数组中包含查找的数字
test_1 = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
# 二维数组中不包含查找的数字
test_2 = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
# 特殊输入测试(输入空数组)
test_3 = []
solution = Solution()
print("test_1:", solution.find(test_1,7))
print("test_2:", solution.find(test_2,3))
print("test_3:", solution.find(test_3,5))
验证结果:
test_1: True
test_2: False
test_3: False
复杂度分析:
时间复杂度:
上述代码最长就是遍历完数组的所有数字,因此时间复杂度是 O(n),
空间复杂度:O(1)