从有序序列中求最大 不大于目标 的数的下标的二分查找怎么写比较优雅?

本身这个题挺简单的,但是如果增加这样一个要求怎么写:
如果序列中有多个等于目标的数,则可以传入一个flag参数,来决定返回等于目标的数最大下标还是最小下标
举个例子:
binsearch([1,3,3],3,"max")返回2
binsearch([1,3,3],3,"min")返回1
binsearch([1,1],2,"max")和binsearch([1,1],2,"min")都返回1
就是只有当数列中有多个等于目标的数时flag参数才有意义。
我写的只考虑flag=="min"的代码,我觉得最后几行if已经很不优雅了,flag=="max"怎么也写不对
defbinsearch(a,target,flag="min"):
'''Findtheindexofthemaxonenotgreaterthantarget'''
l,r=0,len(a)-1
while(lmid=l+(r-l)/2
ifa[mid]>=target:
r=mid
else:
l=mid+1
ifa[l]==target:returnl
ifa[r]==target:returnr
ifa[r]ifa[l]return-1
assert(binsearch([1,3],1)==0)
assert(binsearch([1,3],3)==1)
assert(binsearch([1,3],2)==0)
assert(binsearch([1,1],2)==1)
assert(binsearch([1,1,3],1)==0)
assert(binsearch([2,2],1)==-1)
assert(binsearch([1,3,5],1)==0)
assert(binsearch([1,3,5],5)==2)
assert(binsearch([1,3,5,5],5)==2)
assert(binsearch([1,1,1,2,2,2,3,4,5,5],2)==3)
#assert(binsearch([1,3],1,"max")==0)
#assert(binsearch([1,3],3,"max")==1)
#assert(binsearch([1,3],2,"max")==0)
#assert(binsearch([1,1],2,"max")==0)
#assert(binsearch([1,1,3],1,"max")==1)
#assert(binsearch([2,2],1,"max")==-1)
#assert(binsearch([1,3,5],1,"max")==0)
#assert(binsearch([1,3,5],5,"max")==2)
#printbinsearch([1,3,5,5],5,"max")
#assert(binsearch([1,3,5,5],5,"max")==3)
月关宝盒
浏览 426回答 2
2回答

达令说

我后来又想了想,同时参考了楼上@brayden的思想,把两种功能的实现完全分开,重新写了一个defbinsearchmax(a,target):l,r=0,len(a)-1while(l
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript