此题和 774 Minimize Max Distance to Gas Station 非常类似,用二分法的思想非常巧妙。
在所有的候选分数中,第K个数会是什么呢?假设是M。我们如果想试探一个M是否成立的话,需要计算所有小于等于M的分数的个数。显然,这个是可以计算出来的:只要遍历所有的nums的元素作为分子,可以很快在nums里确定对应的临界分母,使得分数小于等于M。因此count+=数组里大于等于这个临界分母的个数
。
另外考虑,M一定会有下界A[0]/A[n-1]
;其次它也有上界,存在于所有的相邻两个数所组成的分数A[i-1]/A[i]
中的一个。PS:粗糙一点,直接设置上下姐是(0,1)的话也没有问题。
于是二分夹逼的思路就呼之欲出了。根据left
,right
,得到mid
,试探小于等于mid
的分数的个数,并以此相应更新left
和right
。最后得到的mid
,表示小于等于mid
的分数个数恰好为K
。
有了这个mid
,再遍历一遍nums
的所有元素作为分子,找到对应的临界分母。取出所有“分子/分母”里最接近mid的那个就是最终答案。