n * mの2次元配列では、各行は左から右への昇順でソートされ、各列は上から下への昇順でソートされます。関数を完成させ、そのような2次元配列と整数を入力し、配列に整数が含まれているかどうかを判断してください。
例:
既存のマトリックスは次のとおりです。
[
[1、4、7、11、15]、
[2、5、8、12、19]、
[3、6、9、16、22]、
[10、13、14、17、24]、
[ 18、21、23、26、30 ]
]
ターゲット= 5の場合、trueを返します。target = 20の場合、falseを返します。
制限:
0 <= n <= 1000
0 <= m <= 1000
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
アイデア1:暴力
直接の2層円形ブルートフォース検索で十分であり、トラバース時にいくつかの最適化を行うようにソートされます。
時間の複雑さ:O(n * m)
スペースの複雑さ:O(1)
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if matrix == [] or matrix == [[]]:
return False
# 暴力
max_j = len(matrix[0])
i = 0
j = 0
while i < len(matrix) and matrix[i][0] <= target:
j = 0
while j < max_j:
if matrix[i][j] == target:
return True
if matrix[i][j] > target:
max_j = j
j += 1
i += 1
return False
アイデア2:線形検索の右上隅(または左下隅)
アイデア1で使用された元の配列のソート情報は十分ではありません。右上隅から検索を開始することを検討できます。ターゲット値がそれよりも小さい場合、列の後ろの値は大きくなり、それを考慮する必要はありません。列を直接除外します。ターゲット値がそれよりも大きい場合、明らかに同じ行がそれよりも小さい場合、ジャンプする必要があります次の行はこの行を除外します;それらが等しい場合、検索は直接終了します。
同様に、左下から検索を開始すると、操作の考え方は右上と同じです。
時間の複雑さ:O(n + m)
スペースの複雑さ:O(1)
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if matrix == [] or matrix == [[]]:
return False
# 线性查找: 右上角
i = 0
j = len(matrix[0]) - 1
while i < len(matrix) and j >= 0:
if target == matrix[i][j]:
return True
elif target > matrix[i][j]:
i += 1
else:
j -= 1
return False