題目連結 | 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)