题目解析
本题中能效k其实和果林面积fields[i]是强相关的,比如用例1中fields = [5,7,9,15,10]:
能效k取5的话,则面积5的果林只需要1天,其他大于面积5的果林需要Math.ceil(fields[i] / k)
能效k取7的话,则面积5、7的果林只需要1天,其他大于面积7的果林需要Math.ceil(fields[i] / k)
因此,k的取值范围其实就是果林最小面积min ~ 最大面积max之间,我们完全可以遍历min~max之间的所有可能给k,然后求出能效k施肥完所有果林需要的天数spend,然后求出spend===n的所有情况中最小的k作为题解。
但是,本题min~max之间有1 ≤ fields[i] ≤ 10^9,并且求解每种k对应的spend都需要遍历1 ≤ fields.length ≤ 10^4次,因此上面算法的时间复杂度是10^9 * 10^4 = 10^13,这是必然超时的。
因此,我们可以采用二分查找的方式来找k,即每次取min、max的中间值作为k,如果k能效需要的spend时间和指定天数n时间的关系:
- spend > n:说明k能效太低了,花费的时间超过了n,因此要提高k,即min = k,这样下次二分查找的值就会增大k
spend < n:说明k能效太高了,花费的时间少于n,因此要降低k,即max = k,这样下次二分查找的值就会减小kspend === n:说明k能效刚刚好,花费的时间等于n,但是此时可能并非最优解,我们还需继续找更小

已下架不支持订阅
298






