题目截图
题目分析
- 最大化最小值 or 最小化最大值 = 二分
- check函数怎么写,假定我们知道当前的最大值,怎么看是否正确
- 由于所有数只能向左边增加,所以倒序遍历
- 遇到比limit大的,加到remain中
- 遇到比limit小的,减轻remain的负担
- 最后nums[0]无法改变,看看nums[0] + remain和limit的大小即可
ac code
class Solution:
def minimizeArrayValue(self, nums: List[int]) -> int:
n = len(nums)
def check(limit):
remain = 0
for i in range(n - 1, 0, -1):
if nums[i] > limit:
remain += (nums[i] - limit)
else:
remain = max(0, remain - (limit - nums[i]))
return nums[0] + remain <= limit
l, r = 0, max(nums)
while l < r:
mid = (l + r) // 2
if check(mid):
r = mid
else:
l = mid + 1
return l
总结
- 二分确实也想到了
- 二分最难的就是这个check的编写
- 参数就是确定了这个值,然后怎么判断能否成功呢
- 在这里往往要写一个精妙的贪心