题目:给定一个二维数组中,每一行都是按从左到右递增的顺序排序,每一列都按从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和
一个整数,判断数组中是否含有这个整数[1P38]。
按书中解题思路,理解下来就是一个递归,从右上角元素开始出发(理解上左下角也一样,理解下来选取的数字的点就是两个方向遍历是不同的增大/减小的顺序。)
上code:
#coding:utf-8
#剑指offer面试题3
from typing import Any, Union
from numpy import *
def findNumber(a, number):
isExist = False
if len(a) == 0 or number > a[a.shape[0]-1,a.shape[1]-1] or number < a[0,0]or str(number).isnumeric()!=True:
isExist = False
else:
while number != a[0,a.shape[1]-1]:
if number < a[0,a.shape[1]-1]:
a = a[:,:a.shape[1]-1]
findNumber(a, number)
elif number > a[0,a.shape[1]-1]:
a = a[1:,:]
findNumber(a, number)
else:
isExist = True
break
if number == a[0,a.shape[1]-1]:
isExist = True
return isExist
测试代码:
from findNumber2Arrays import problem3
from numpy import *
import numpy as np
if __name__ == '__main__':
a = mat([[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]])
number = a.max()
number = a.min()
a = ""
#number = a[divmod(np.argmax(a), a.shape[1])[0],a.shape[1]-1] #求取该矩阵最大值
isExist = problem3.findNumber(a, number)
print(isExist)
但是啊,递归这种方式不友好了,我们改成循环吧:
def findNumberV2(a,number):
isExist = False
# print(type(number), len(a)==0 , str(number).isnumeric())
if type(number)!=int or len(a)==0 or str(number).isnumeric()==False:
isExist = False
else:
row = 0
line = a.shape[1]-1
print(len(a)==0 , a[0,0],a[a.shape[0]-1, a.shape[1]-1])
if len(a)==0 or number < a[0,0] or number > a[a.shape[0]-1, a.shape[1]-1]:
return isExist
while number != a[row,line]:
if number > a[row,line]:
row = row + 1
elif number < a[row,line]:
line = line-1
else:
isExist = True
break
if number == a[row,line]:
isExist = True
return isExist
if __name__ == '__main__':
from numpy import *
import numpy as np
a = mat([[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]])
number = a.max()
number = a.min()
print (number)
# number = 0
# number = ""
#number = a[divmod(np.argmax(a), a.shape[1])[0],a.shape[1]-1] #求取该矩阵最大值
# isExist = problem3.findNumber(a, number)
isExist = findNumberV2(a, number)
print(isExist)
运行下,我了个去,报错!!感觉没问题啊,debug了下,发现,
type(number)是
def findNumberV2(a,number):
isExist = False
# print(type(number)!=np.int, len(a)==0 , str(number).isnumeric()==False)
if len(a)==0 or str(number).isnumeric()!=True:
isExist = False
else:
row = 0
line = a.shape[1]-1
print(len(a)==0 , a[0,0],a[a.shape[0]-1, a.shape[1]-1])
if len(a)==0 or number < a[0,0] or number > a[a.shape[0]-1, a.shape[1]-1]:
return isExist
while number != a[row,line]:
if number > a[row,line]:
row = row + 1
elif number < a[row,line]:
line = line-1
else:
isExist = True
break
if number == a[row,line]:
isExist = True
return isExist
if __name__ == '__main__':
from numpy import *
import numpy as np
a = mat([[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]])
number = a.max()
number = a.min()
print (number)
# number = 0
# number = ""
#number = a[divmod(np.argmax(a), a.shape[1])[0],a.shape[1]-1] #求取该矩阵最大值
# isExist = problem3.findNumber(a, number)
isExist = findNumberV2(a, number)
print(isExist)
为啥type(number)是
>>> a = np.mat([[1,2,3],[2,3,4]])
>>> a.min()
1
>>> type(a.min())
<class 'numpy.int32'>
>>> type(a.min)
<class 'method'>
>>> type(a.min())=='np.int(32)'
False
>>> b=1
>>> type(b)
<class 'int'>
>>> type(b)==int
True
>>> type(a.min())==np.int32
True
Ref:
[1] 剑指offer
[2] https://blog.csdn.net/u013713117/article/details/53965572
[3] https://blog.csdn.net/zhning12l/article/details/78664495