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)
posted @ 2024-09-09 01:19  WrRan  阅读(5)  评论(0编辑  收藏  举报