假设我们有n种床型,并调查了n个人。 令B = {b1,。 。 。 ,bn}是二维空间中n个点的集合,代表床的尺寸 类型。我们写bi =(bi(x),bi(y)),其中bi(x)代表床型i的长度,bi(y)表示其宽度。 同样,我们用P = {p1,。。表示n个人的要求。 。 。 ,pn},其中n个点的集合 二维空间,我们也写pj =(pj(x),pj(y)),其中pj(x)和pj(y)是人j的长度 和宽度要求。 点碧 当且仅当bi(x)≥pj(x)并且bi(y)≥pj(y)时,才与点pj兼容。相容性 的 是它兼容的P的点数,如果兼容,我们写comp(bi)= k k点为p。
我们将从更简单的一维情况开始,即P = {p1,。 。 。 ,pn}和B = {b1,。。 。 。 ,bn}是 一维空间中的点(多个点可能具有相同的值)。您的任务是设计一个 O(n log n)时间算法,计算B中每个点与P的兼容性。
我当时正在考虑使用二进制搜索来定位索引,该索引的B值大于P(已排序)的值,并且索引位置+1应该是与我所床兼容的人数寻找。我使用for循环遍历代表床的元组集合,并通过集合P进行二元搜索,以找到索引并在每个最终步骤进行打印以输出。
def binarySearch(arr,l,r,x):
if r >= 1: #base case size must be greater or equal to 1
mid = (r-1)//2 + 1
if float(arr[mid][1] == float(x)) and float(arr[mid+1][1] == float(x)) and mid <= r-1:
mid += 1
elif float(arr[mid][1]) <= float(x) and float(arr[mid+1][1]) > float(x):
return mid
if float(arr[mid][1]) >= float(x):
# if arr[mid][1] <= x:
return binarySearch(arr,l,mid-1,x)
else:
return binarySearch(arr,mid+1,r,x)
else:
return -1
for i in range(len(b)): #p is set of sorted persons and b is set of beds
x = b[i][1]
numCompatible = binarySearch(p,0,len(p),x) + 1
print(b[i][0],numCompatible)
我收到一个错误:
“ RecursionError:在比较中超出了最大递归深度”,预期输出为 b1 10 b10 5 b11 11 b12 5 b13 5 b14 15 b15 13 b16 5 b2 3 b3 9 b4 10 b5 12 b6 9 b7 10 b8 4 b9 3