小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
【每日打卡系列】
LeetCode简单题 200 道
题目描述
小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:
- 使用当前带宽下载插件
- 将带宽加倍(下载插件数量随之加倍)
请返回小扣完成下载
n个插件最少需要多少分钟。
注意:实际的下载的插件数量可以超过 n 个
示例 1:
输入:n = 2
输出:2
解释:
以下两个方案,都能实现 2 分钟内下载 2 个插件
方案一:第一分钟带宽加倍,带宽可每分钟下载 2 个插件;第二分钟下载 2 个插件
方案二:第一分钟下载 1 个插件,第二分钟下载 1 个插件
示例 2:
输入:n = 4
输出:3
解释:
最少需要 3 分钟可完成 4 个插件的下载,以下是其中一种方案:
第一分钟带宽加倍,带宽可每分钟下载 2 个插件;
第二分钟下载 2 个插件;
第三分钟下载 2 个插件。
提示
1 <= n <= 10^5
解题思路
题目看了 3 遍,愣是没看出是啥意思,然后自己测试了一下 n = 8 ,结果等于 4,瞬间懂了。
重新捋一遍题目,以 n = 8 为例:
- 第一分钟带宽加倍,当前一次能下 2 个,
- 第二分钟带宽加倍,当前一次能下 4 个,
- 第三分钟带宽加倍,当前一次能下 8 个,
- 第四分钟下载 8 个插件。
解题关键在于,在能一次下载完之前,所有时间全部加倍,直至
一次下载数量 >= n,这样时间就是最短的,思路搞清楚了,代码实现起来非常简单。
def leastMinutes(self, n):
"""
:type n: int
:rtype: int
"""
res = 0
while 2**res < n:
res += 1
return res + 1
今日打卡完成,目前进度 2/200。