二分算法:练习题目25

题目:范围内整数的最大得分

给你一个整数数组 start 和一个整数 d,代表 n 个区间 [start[i], start[i] + d]

你需要选择 n 个整数,其中第 i 个整数必须属于第 i 个区间。所选整数的 得分 定义为所选整数两两之间的 最小 绝对差。

返回所选整数的 最大可能得分 

示例 1:

输入: start = [6,0,3], d = 2

输出: 4

解释:

可以选择整数 8, 0 和 4 获得最大可能得分,得分为 min(|8 - 0|, |8 - 4|, |0 - 4|),等于 4。

示例 2:

输入: start = [2,6,13,13], d = 5

输出: 5

解释:

可以选择整数 2, 7, 13 和 18 获得最大可能得分,得分为 min(|2 - 7|, |2 - 13|, |2 - 18|, |7 - 13|, |7 - 18|, |13 - 18|),等于 5。

提示:

  • 2 <= start.length <= 105
  • 0 <= start[i] <= 109
  • 0 <= d <= 109

参考答案:

class Solution:
    def maxPossibleScore(self, start: List[int], d: int) -> int:
        # start[i] > 0,因此从小到大排序的话两个元素差就是最小差们
        # 两个数字相隔尽量均匀,才可能达到最大的得分
        start.sort()
        def check(score):
            first = start[0]
            for i,s in enumerate(start):
                if i == 0:
                    continue
                if first + score > s + d:
                    return False
                if first + score <= s:
                    first = s
                else:
                    first = first + score
            return True
        left = 0
        right = (start[-1] + d - start[0])//(len(start) - 1)
        while left <= right:
            mid = left + (right - left)//2
            if check(mid):
                left = mid + 1
            else:
                right = mid - 1
        return left - 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值