既昨天把H-index做了之后,本次接着做H-index II,题目要求发生了变化,首先输入list已经是一个排序好的升序序列了。其次要求时间复杂度为O(log n)了。用2分法来继续做了。无非看下中间的数字与指定值比较来决定递归前面还是后面。代码如下:
#coding=utf-8
def hIndex(citations):
"""
:type citations: List[int]
:rtype: int
"""
global m, lens
m = 0
lens = len(citations)
def choose(x):
global m, lens
if x == []:
return 0
elif len(x) == 1:
if x[0] >= lens - m:
return lens - m
else:
return lens - m - 1
else:
if x[len(x) / 2] >= lens - m - len(x) / 2:
return choose(x[:len(x) / 2])
else:
#剩余list为2个数的情况
if len(x) == len(x) / 2 + 1:
return lens - m - len(x)
else:
m = m + len(x) / 2 + 1
return choose(x[len(x) / 2 + 1:])
return choose(citations)
print hIndex([])