私はバイナリ検索を使用します。 b
より大きい最初の要素、またはb
より小さい最後の要素のいずれかを見つける必要があります。あるインデックスであるj
でバイナリ検索でより大きい最初の要素のインデックスが見つかりました。それから、私たちの答えはb [j - 1]、b [j]などです。これはO(logN)時間で機能します。
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
if a[j] > b:
return (None if j == 0 else a[j-1]), a[j]
else:
return a[j], (None if j >= n - 1 else a[j + 1])
if __name__ == '__main__':
a = [4,5,6,8,9,15,16,18,54,60]
b = 24
print find(a, 24)
print find(a, 3)
print find(a, 4)
print find(a, 7)
print find(a, 60)
短いアプローチ:
import bisect
def find(a, b):
n, j = len(a), bisect.bisect_left(a, b)
return ((None if j == 0 else a[j-1]), a[j]) if a[j] > b else (a[j], (None if j >= n - 1 else a[j + 1]))
重要:配列はb
、2つの連続した数字の間にあるインスタンスが1つしかないと仮定すると、ソート順に
申し訳ありませんが、あなたの質問はありません。配列を見ると、配列がソートされていて、18が最初に小さいもの、54が最初に最も高いものであることがわかります。 –
私はそれが私が望んだとは思わない... –
これまでに私の返信を試みた? –