我會使用二進制搜索。您需要查找大於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]))
重要:數組應該是有序
對不起,我不明白你的問題。如果你看一個數組,你會發現它是排序的,而18是第一個最小的,54是第一個最高的。 –
嗯,我不認爲這就是我想要的... –
曾經嘗試過我的回覆? –