グラフの二分探索について
概要
- X軸・Y軸を独立に考えることで、グラフ上の二分探索を行うこともできる
- 二分探索は連続的な大小が成立するときを発送しがちであるが、
false
,true
の境い目を探すこともできるlo
,hi
のパラメータは最大(or 最小)の判別関数を満たすindex
を得ることができる
具体例
- 概要
- 2Dグラフ上に
黒い模様があるとき
に、それを囲む最小の四角形の面積
を求める - dfsで模様のindexを計算してもよいが、二分探索でも可能
- 黒い模様は一つしかない前提
- 2Dグラフ上に
def minArea(image: List[List[str]], x: int, y: int) -> int:
# 最小のcheck_funを満たすindexを返す
# lo == hiでbreakとなる
def binary_search(lo, hi, check_fun):
while lo < hi:
mid = (lo + hi) // 2
if check_fun(mid):
hi = mid
else:
lo = mid + 1
return lo
top = binary_search(0, x, lambda x: '1' in image[x])
bottom = binary_search(x, len(image), lambda x: '1' not in image[x])
left = binary_search(0, y, lambda y: any(row[y] == '1' for row in image))
right = binary_search(y, len(image[0]), lambda y: all(row[y] == '0' for row in image))
print(top, bottom)
print(left, right)
return (bottom - top) * (right - left
minArea(image = [["0","0","1","0"],["0","1","1","0"],["0","1","0","0"]], x = 0, y = 2) # 6
"""
0 3
1 3
"""