牛客网剑指offer在线编程01二维数组中的查找

题目描述

(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列是允许的不能停止。
牛客网剑指offer在线编程01二维数组中的查找

代码实现

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))