LeetCode 劍指 Offer 04. 二維陣列中的查詢(Python、線性查詢)
阿新 • • 發佈:2021-03-08
文章目錄
方法一:不斷縮小範圍
根據陣列兩個維度上的遞增特性,可以總結出這樣的演算法,如果 matrix[i][j]
>target
,那麼搜尋的列範圍就可以縮小到 j
。
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if not matrix:
return False
i = 0
j = 0
m = len (matrix)
n = len(matrix[0])
while i < m and j < n:
if matrix[i][j] == target:
return True
elif matrix[i][j] > target:
n = j
i += 1
j = 0
else:
j += 1
if j == n:
i += 1
j = 0
return False
方法二:線性查詢
由於給定的二維陣列具備每行從左到右遞增以及每列從上到下遞增的特點,當訪問到一個元素時,可以排除陣列中的部分元素。
從二維陣列的右上角開始查詢。如果當前元素等於目標值,則返回 true
。如果當前元素大於目標值,則移到左邊一列。如果當前元素小於目標值,則移到下邊一行。
可以證明這種方法不會錯過目標值。如果當前元素大於目標值,說明當前元素的下邊的所有元素都一定大於目標值,因此往下查詢不可能找到目標值,往左查詢可能找到目標值。如果當前元素小於目標值,說明當前元素的左邊的所有元素都一定小於目標值,因此往左查詢不可能找到目標值,往下查詢可能找到目標值。
- 若陣列為空,返回
false
- 初始化行下標為 0,列下標為二維陣列的列數減 1
- 重複下列步驟,直到行下標或列下標超出邊界
- 獲得當前下標位置的元素
num
- 如果
num
和target
相等,返回true
- 如果
num
大於target
,列下標減 1 - 如果
num
小於target
,行下標加 1
- 獲得當前下標位置的元素
- 迴圈體執行完畢仍未找到元素等於 target ,說明不存在這樣的元素,返回
false
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if not matrix:
return False
m = len(matrix)
n = len(matrix[0])
i = 0
j = n - 1
while i < m and j >= 0:
if matrix[i][j] == target:
return True
elif matrix[i][j] > target:
j -= 1
else:
i += 1
return False
複雜度分析
- 時間複雜度: O ( n + m ) O(n+m) O(n+m)。訪問到的下標的行最多增加 m m m 次,列最多減少 n n n 次,因此迴圈體最多執行 n + m n + m n+m 次。
- 空間複雜度: O ( 1 ) O(1) O(1)。