题目描述
(1) 在一个二维数组中(每个一维数组的长度相同)
(2) 每一行都按照从左到右递增的顺序排序
(3)每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
什么是二维数组,python中并没有数组的概念,列表相当于数组,二维列表即为二维数组
思路1
对于题目描述中的二维数组,其实是由4个一维数组组成。首先第一个循环,对二维列表进行遍历,每次取出一个数组;其次第二个循环,对取出的一维数组中的元素进行遍历,判断单个元素是否和目标查找值相等。虽然可以实现题目的要求,但是没有用到题目中一些的条件,比如:每行每列递增。
代码实现
import numpy as np
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
for row in range(len(array)):
arr = array[row]
# 对于每一行(一维数组),在这个一维数组中查找target。
for index in range(len(array[0])):
if arr[index] == target:
return True
return False
if __name__=="__main__":
s = Solution()
ar = np.array([[1,4,7],[2,5,8],[3,6,9]])
x=10
print(s.Find(x,ar))
思路2
选取右上角元素,
元素大于Key–》剔除整列,
元素小于key–》剔除整行*/
注意点就是循环的条件对于row行 从上0开始递增,停止的条件是小于行的长度对于column列,从右边列的长度开始递减,停止的条件是大于等于零(因为查询最右下角的元素时,第0列是允许的不能停止。
代码实现
import numpy as np
class Solution:
# array 二维列表
def Find(self, target, array):
# 主要思路:首先选取右上角的数字,如果该数字大于target,
#则该列全大target,删除该列;
# 如果该数字小于target,则该行全小于target,删除该行。
found = False
row = len(array)
if row:
col = len(array[0])
else:
col = 0
if(row>0 and col>0):
i = 0
j = col - 1
while(i<row and j>=0):
if array[i][j] == target:
found = True
break
elif array[i][j] > target:
j -= 1
elif array[i][j] < target:
i += 1
return found
if __name__=="__main__":
s = Solution()
ar = np.array([[1,4,7],[2,5,8],[3,6,9]])
x=10
print(s.Find(x,ar))