劍指offer - 二維陣列中的查詢
阿新 • • 發佈:2018-11-20
題目描述
在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。方法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