给定排序列表L的整数(开头的最低值),不同彼此,返回L [i] == i for i> ; = 0
>>> count_occur([-5,-2,0,3,8])
1
>>> count_occur([-5,-2,2,3,8])
2
>>> count_occur([-5,-2,0,4,8])
0
问题是我应该在最坏情况上以时间复杂度O(logn)实现它。
我可以在O(logn)on和平均情况下实现它,但显然它不够好。
任何帮助将不胜感激!
答案 0 :(得分:0)
L[i] == i
只能对i
的连续值范围内为true。 (你能明白为什么吗?)因此,我们可以通过二进制搜索L[i] - i == 0
的最左边和最右边的值,在O(log(n))最坏情况下解决这个问题。
使用bisect
模块进行二进制搜索:
import bisect
class HelperList(object):
"""Lazily computes l[i] - i to determine values."""
def __init__(self, l):
super(HelperList, self).__init__()
self.l = l
def __len__(self):
return len(self.l)
def __getitem__(self, i):
return self.l[i] - i
def count_occur(l):
helperlist = HelperList(l)
leftmost = bisect.bisect_left(helperlist, 0)
if l[leftmost] != leftmost:
return 0
return bisect.bisect_right(helperlist, 0) - leftmost