[検索バイナリ]Let code 240.Search a 2D Matrix II
15113 ワード
道路標識240号
左から右、上から下の順に並べられた行列でターゲット値を検索
バイナリ検索は2次元検索 が可能だと思います.行列[m][n]はfirst m,first n,last m,last nに拡張され,mid−>mid m,mid n をそれぞれ計算する. targetが5である場合、まずlastを中間値9からより小さい上部と左側に移動し、次に9より大きい左側に移動し、 を継続する.
は陳探索と同じ原理だと思いますので、最初はそう確信して解きました.例外が出てきましたが、なぜこうなったのかよく考えてみると、当然左上隅が9より小さいに違いありませんが、黄色の部分ももっと小さい数字があるかもしれないので、すべて探索したとは思えないので、無理です...ハッハッハッハッハッハッハッハッハッハッハッ
完全なプールの1つは右上または左下から始まり、col値とrow値を小さくまたは大きく調整します.
右上から
図に示すように、15からtargetより小さい場合、下にtargetより大きい場合、左に移動して解き、範囲を超えた場合falseを返す.
これは上と異なる理由として、targetが20であれば15より大きいので、底から下を向いているときは、15から左が除外されているので、このようにすると、左と下だけを考えて、右と上が通る場所なので、すでに追及されていると考えられます.
最終的にこの問題の鍵は標準がどこにあるかです...
バイナリナビゲーションではないので複雑度はO(m+n)である.
これは、各ローにバイナリナビゲーションを適用して検索する方法にすぎません.
複雑さは最悪の場合O(nlogm)ですが、真ん中で見つけたらまあまあだと思いますが、試してみましたが、実は上のコードが似ています.
左から右、上から下の順に並べられた行列でターゲット値を検索
試してみる。
class Solution:
def searchMatrix(self, matrix, target: int) -> bool:
m, n = len(matrix), len(matrix[0])
first_m, first_n = 0, 0
last_m, last_n = m - 1, n - 1
while first_m <= last_m and first_n <= last_n:
mid_m, mid_n = first_m + (last_m - first_m) // 2, first_n + (last_n - first_n) // 2
if matrix[mid_m][mid_n] == target:
return True
elif matrix[mid_m][mid_n] > target:
if mid_m - 1 < 0 :
last_m, last_n = mid_m, mid_n - 1
elif mid_n -1 < 0 :
last_m, last_n = mid_m - 1, mid_n
elif matrix[mid_m - 1][mid_n] > matrix[mid_m][mid_n - 1]:
last_m, last_n = mid_m - 1, mid_n
else:
last_m, last_n = mid_m, mid_n - 1
else:
if mid_m + 1 > last_m:
first_m, first_n = mid_m, mid_n + 1
elif mid_n + 1 > last_n:
first_m, first_n = mid_m + 1, mid_n
elif matrix[mid_m + 1][mid_n] < matrix[mid_m][mid_n + 1]:
first_m, first_n = mid_m + 1, mid_n
else:
first_m, first_n = mid_m, mid_n + 1
return False
答えを出す。
完全なプールの1つは右上または左下から始まり、col値とrow値を小さくまたは大きく調整します.
右上から
class Solution:
def searchMatrix(self, matrix, target: int) -> bool:
row, col = 0, len(matrix[0]) - 1
while row < len(matrix) and col > -1:
if matrix[row][col] == target :
return True
elif matrix[row][col] > target:
col = col - 1
else:
row = row + 1
return False
図に示すように、15からtargetより小さい場合、下にtargetより大きい場合、左に移動して解き、範囲を超えた場合falseを返す.
これは上と異なる理由として、targetが20であれば15より大きいので、底から下を向いているときは、15から左が除外されているので、このようにすると、左と下だけを考えて、右と上が通る場所なので、すでに追及されていると考えられます.
最終的にこの問題の鍵は標準がどこにあるかです...
バイナリナビゲーションではないので複雑度はO(m+n)である.
説明する。
これは、各ローにバイナリナビゲーションを適用して検索する方法にすぎません.
class Solution:
def searchMatrix(self, matrix, target: int) -> bool:
rows = len(matrix)
for row in range(rows):
first, last = 0, len(matrix[0])-1
while first <= last:
mid = first + (last - first) // 2
if matrix[row][mid] == target:
return True
elif matrix[row][mid] > target:
last = mid - 1
else:
first = mid + 1
return False
複雑さは最悪の場合O(nlogm)ですが、真ん中で見つけたらまあまあだと思いますが、試してみましたが、実は上のコードが似ています.
Reference
この問題について([検索バイナリ]Let code 240.Search a 2D Matrix II), 我々は、より多くの情報をここで見つけました https://velog.io/@rmswjdtn/이진탐색-Leet-code-240.-Search-a-2D-Matrix-IIテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol