八月来啦,二零二一年玩了三分之二,要开始学习啦!,给自己定个小目标,每天至少一道剑指offer算法题!
**题目:**在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
0 <= array.length <= 500
0 <= array[0].length <= 500
示例1:
输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true
示例2:
输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
说明:不存在3,返回false
解法1:暴力解法
class Solution:
# array 二维列表
def Find(self, target, array):
for arr in array:
if target in arr:
return True
return False
**思路:**直接遍历数组,如果数组中存在则返回true,不存在则返回false
解法2:从右上角的值开始搜索
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
#方法二 从右上角开始进行搜索
if not array:
return False
rows = len(array)
columns = len(array[0])
row = 0
column = columns - 1
while row < rows and column >= 0:
if array[row][column] == target:
return True
if array[row][column] > target:
column -= 1
else:
row += 1
return False
思路:
右上角的值为每一行最大值,比较每一行最大值与target的关系,若每行最大值等于target,则返回True,若最大值大于target,则列减1,比较每行次大值与target的关系;当target大于每行较大值时,遍历下一行