如何使用二进制搜索编写代码:
def floorofx(L, x):
pass
喜欢为每个元素定义低,高,中。如,
Input: L = [11, 12, 13, 14, 15, 20, 27, 28], x = 17
Output: 15
15是L
中最小的元素,小于17。
Input: L = [11, 12, 13, 14, 15, 16, 19], x = 20
Output: 19
19是L
中小于20的最大元素。
Input: L = [1, 2, 8, 10, 10, 12, 19], x = 0
Output: -1
由于楼层不存在,输出为-1。
有人可以帮我吗?
答案 0 :(得分:0)
您可以简单地使用bisect
模块并减少获得的索引。
from bisect import bisect_right
def floorofx(L, x):
idx = bisect_right(L,x)
return L[idx-1] if idx > 0 else -1
这会产生以下结果(对于您的给定样本输入):
>>> floorofx(L = [11, 12, 13, 14, 15, 20, 27, 28], x = 17)
15
>>> floorofx(L = [11, 12, 13, 14, 15, 16, 19], x = 20)
19
>>> floorofx(L = [1, 2, 8, 10, 10, 12, 19], x = 0)
-1
请注意 L
必须排序,如果 -1
是L
的元素,则无法制作区分“未找到”和-1作为结果。由于我们使用二进制搜索,因此算法在 O(log n)中运行。