剑指offer之面试题3--二维数组中的查找(Python版本)

题目:给定一个二维数组中,每一行都是按从左到右递增的顺序排序,每一列都按从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和
一个整数,判断数组中是否含有这个整数[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

猜你喜欢

转载自blog.csdn.net/woai8339/article/details/81590901