题目链接 | 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 = -inffor s in start:x = max(x+score, s)if x > s+d:return Falsereturn Trueleft, right = 0, (start[-1] + d - start[0]) // (len(start)-1) + 1while left + 1 < right:mid = (left+right) // 2if check(mid):left = midelse:right = midreturn left
Python-标准库实现
class Solution:def maxPossibleScore(self, start: List[int], d: int) -> int:start.sort()def check(score):score += 1x = -inffor s in start:x = max(x+score, s)if x > s+d:return Falsereturn Trueright = (start[-1]+d-start[0]) // (len(start)-1)return bisect_left(range(right), True, key=check)