1 題目描述、要求
題目描述:
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
題目要求:
時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32M,其他語言64M
2 分析及題解
2.1 方法一:暴力法
直接循環遍歷數組中的每個元素,當遇到輸入整數與所遍歷元素相等時返回True,否則繼續遍歷,若最終遍歷完不存在相等情況,返回False。算法時間複雜度O(m*n)
#暴力法1:所謂的一行代碼,開闢了新數組空間
class Solution:
# array 二維列表
def Find(self, target, array):
# write code here
return True if target in [i for arr in array for i in arr] else False
#暴力法二:雙重for循環遍歷,和上面原理是一樣
class Solution:
# array 二維列表
def Find(self, target, array):
# write code here
for i in array:
for j in i:
if target == j:
return True
return False
結果:
2.2 方法二:右上元素移動法(左下同理)
需要緊扣題目中的左到右,上到下遞增
假設給定如圖數組,輸入整數位7,從右上角開始遍歷,若元素小於輸入整數,此時解可能位於該元素下方(第一行左側數都比4小),同理,若是元素大於輸入整數,那麼解只能位於元素左側,依次遍歷,直到找到相等值或者遍歷結束。算法時間複雜度O(m+n)
class Solution:
# array 二維列表
def Find(self, target, array):
# write code here
rows = 0
cols = len(array)- 1
while rows <=len(array[0])-1 and cols >= 0:
if array[rows][cols] == target:
return True
if array[rows][cols] < target:
rows += 1
else:
cols -= 1
return False
結果: