欢迎关注公众号:python大视界 一起进步,共同成长
题目:二维数组的查找
问题描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:题目要求查询数组中是否含有某个数,这个数组的特点在于每行每列都是递增的,有两个方法来解决这个问题。
方法一:既知是二维数组,获得二维数组的行数和列数,然后逐次遍历数组,若这个数存在,则返回true,否则为false。时间复杂度为O(N*2),
实现代码如下。
# -*- coding: utf-8 -*-
"""
@Time : 2021/8/16 12:04
@Author : LYP
@FileName: pyOffer01.py
@SoftWare: PyCharm
"""
import numpy as np
#方法一:遍历数组,逐个查找
def numInArray(num ,array):
col,row=array.shape
isHave = False
for i in range(0,col):
for j in range(0,row):
if array[i][j] == num:
isHave= True
return isHave
x = np.array([[1,2,5],[2,3,7],[3,4,5],[2,5,8]])
getNum=int(input("请输入一个数:"))
isHave=numInArray(getNum,x)
print (isHave )
上述的代码中,代码输入一个数,判断这个数是否存在于数组中,按题目要求,可以输入二维数组X,在代码中已经存在二维数组。判断3是否在数组中。
判断10是否在数组中。
方法二:我们已经知道数组的特点在于从上到下,从左到右均为递增的,那么,从右上或者左下开始查找。从右上开始查找:如果数组中的数比这个整数大,向左移动一位,如果数组中的数比这个数小,向下移动一位,时间复杂度为 O ( n )。
实现代码如下。
#方法二,顺序查找
def FindNum(num,array):
row,col=array.shape
ishave=False
i,j=0,col-1
while j >=0 and i <row:
if array[i][j]>num:
j=j-1
elif array[i][j] <num:
i=i+1
else:
ishave=True
break
return ishave
x = np.array([[1,2,5,10],[2,3,7,11],[3,4,5,13],[2,5,8,15]])
Num=int(input("请输入一个数:"))
ishave=FindNum(Num,x)
print (ishave)
上述代码中,先从二位数组右上角数与目标比较,如果大于目标数,则向左移动,直到找到小于目标数的数,然后向下遍历。判断15是否在数组中。
判断20是否在数组中。