414周赛·第二题 - 3281. 范围内整数的最大得分
题目链接 | 3281. 范围内整数的最大得分 |
---|---|
思路 | 最大化最小值=>二分法 |
题解链接 | 二分答案:最大化最小值(Python/Java/C++/Go) |
关键点 | 二分模板:迭代范围;推荐“开区间” |
时间复杂度 | \(O(n\log n + n \log \frac{\max(start)+d-\min(start)}{n-1})\) |
空间复杂度 | \(O(1)\) |
代码实现:
class Solution:
def maxPossibleScore(self, start: List[int], d: int) -> int:
start.sort()
def check(score):
x = -inf
for s in start:
x = max(x+score, s)
if x > s+d:
return False
return True
left, right = 0, (start[-1] + d - start[0]) // (len(start)-1) + 1
while left + 1 < right:
mid = (left+right) // 2
if check(mid):
left = mid
else:
right = mid
return left
Python-标准库实现
class Solution:
def maxPossibleScore(self, start: List[int], d: int) -> int:
start.sort()
def check(score):
score += 1
x = -inf
for s in start:
x = max(x+score, s)
if x > s+d:
return False
return True
right = (start[-1]+d-start[0]) // (len(start)-1)
return bisect_left(range(right), True, key=check)