【每日算法打卡】LCS 01. 下载插件

205 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

【每日打卡系列】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。