题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法1:
暴力破解,遍历所有元素,比较得知是否含有目标元素,若有,则返回True,若不存在则在最后返回False。
时间复杂度 n * n
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
width, height = len(array[0]), len(array)
for i in range(width):
for j in range(height):
if array[i][j] == target:
return True
return False
运行结果:
运行时间:436ms,占用内存:6004k
方法2:
把每一行看成有序数组,利用二分查找,遍历每一行得到答案。时间复杂度 nlogn
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
width, height = len(array[0]), len(array)
for i in range(height):
left, right = 0, width - 1
while left <= right:
mid = (left + right) // 2
if array[i][mid] == target:
return True
elif array[i][mid] > target:
right = mid - 1
else:
left = mid + 1
return False
运行结果:
运行时间:354ms,占用内存:5856k
方法3:
利用二维数组从上到下,从左到右递增的规律,选取左下角(也可以是右上角)的元素Array[row][column]作为当前元素与target比较,当target小于当前元素时,target必定在当前元素所在列的上边,即row-1,当target大于当前元素时,target必定在当前行的右面,即column+1。时间复杂度 n
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
row, column = len(array) - 1, 0
while row >= 0 and column < len(array[0]):
current = array[row][column]
if current == target:
return True
elif current < target:
column += 1
else:
row -= 1
return False
运行结果:
运行时间:287ms,占用内存:5860k
方法4:
遍历每一行,使用in判断是否含有target。
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
for i in range(len(array)):
if target in array[i]:
return True
return False
运行结果:
运行时间:431ms,占用内存:5760k