【题目描述】
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
【测试用例】
# target
102
# array
[[1, 2, 3, 4, 5],
[2, 66,101,102,103],
[3, 67,200,201,102],
[4, 68,201,202,203],
[5,103,300,400,500]]
【解题思路】
- 暴力法
遍历每一个位置,时间复杂度为O(mn),空间复杂度为O(1) - 从左下角往右上角搜索
由于每一行从左至右是递增的,每一列从上到下也是递增的,所以当从左下角开始搜索时,只考虑往右和往上呈阶梯状走即可,这样时间复杂度为O(m+n),空间复杂度为O(1)。
如果target值大于当前位置的值,说明target值如果存在的话,一定在当前位置的右侧,则往右遍历;如果target值小于当前位置的值,说明target值如果存在的话,一定在当前位置的上侧,则往上遍历,所给用例的搜索方式为:
用Python实现的代码为:
# -*- coding:utf-8 -*-
class Solution:
def Find(self, target, array):
num_raw = len(array)
num_col = len(array[0])
c_pos = 0 # 从左至右的指针
r_pos = num_raw - 1 # 从下至上的指针
while c_pos < num_col and r_pos >= 0:
if array[c_pos][r_pos] == target:
return 'true'
# 如果当前位置的值<target,说明target如果存在的话,一定在当前位置的右侧,则往右遍历
if array[c_pos][r_pos] < target:
c_pos += 1
# 如果当前位置的值>target,说明target如果存在的话,一定在当前位置的上侧,则往上遍历
else:
r_pos -= 1
return 'false'
while True:
try:
S=Solution()
L=list(eval(raw_input()))
array=L[1]
target=L[0]
print(S.Find(target, array))
except:
break