剑指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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值