分析
最值的最值可以考虑二分 找到单调性!!! 怎么找? 我们分析一下 如果单个袋子球得最大值越大,是不是操作得次数越小? 反之,最大值越小,是不是操作得越大; 我们构建一个函数可以通过给定单个袋子得最大值求出其最小操作次数 然后我们要求最小得最大值 所以我们判断cal_ops(mid) 如果这个值小于等于maxOps,说明最大值还可以更小,所以r 取 mid,是可以成功得 反之,如果大于maxOps,操作数过多,说明要增大最大值,此时mid已经凉凉 所以要l = mid + 1 最后返回最小值所以返回l
ac code
class Solution:
def minimumSize(self, nums: List[int], maxOperations: int) -> int:
def cal_ops(x):
'''x:单个袋子的最大值'''
res = 0
for num in nums:
if num > x:
res += (num - 1) // x
return res
l, r = 1, 10 ** 9
if cal_ops(l) <= maxOperations:
return l
while l < r:
mid = l + (r - l) // 2
if cal_ops(mid) <= maxOperations:
r = mid
else:
l = mid + 1
return l
总结
最值的最值考虑二分 一般是一个函数具有某个单调性 然后二分x,得到最贴近最值的y
|