边工作边刷题:70天一遍leetcode: day 57
H-Index I/II
要点:
- 一般规律:参见图 https://snag.gy/apYLHV.jpg:个数i和citations的关系。如果按citations值从大到小排序,越向右citation越小,而i越大。条件的后半部分限制了必须找到i和citations的临界点,也就是第一个i坐标>=citations的就是所求,因为左边(就是到第i个为止)都有i<citations(即i+1<=citations)。必然都满足前半部分条件,第i+1个开始满足后半部分条件(i越向右,citations越小)。
- binary search:假设降序排列,根据定义,如果是citations[mid]>=mid+1,那么这个mid和左边都是符合前半部分条件的,后半部分条件(n-i要小于citation[i])还不定。所以要继续向右找符合后半的临界点(因为citation值变小了,n-i也变小了,所以是不定的),所以这题本质和first bad version一样。注意II是升序排序,所以条件是citations[mid]>=n-mid,结果也是n-mid。
- I用bucket解: bucket就相当于累加的排序。
class Solution(object):
def hIndex(self, citations):
"""
:type citations: List[int]
:rtype: int
"""
if not citations: return 0
n = len(citations)
low,high=0, n-1
mid = low + (high-low)/2
while low < high:
if citations[mid]>=n-mid:
high = mid
else:
low = mid+1
mid = low + (high-low)/2
return n-mid if citations[mid]>=n-mid else 0