滴滴~每日算法速递!
Posted Dream丶Killer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滴滴~每日算法速递!相关的知识,希望对你有一定的参考价值。
题一、开幕式焰火
「力扣挑战赛」开幕式开始了,空中绽放了一颗二叉树形的巨型焰火。
给定一棵二叉树 root
代表焰火,节点值表示巨型焰火这一位置的颜色种类。请帮小扣计算巨型焰火有多少种不同的颜色。
示例 1:
输入:
root = [1,3,2,1,null,2]
输出:3
解释:焰火中有 3 个不同的颜色,值分别为 1、2、3
示例 2:
输入:
root = [3,3,3]
输出:1
解释:焰火中仅出现 1 个颜色,值为 3
提示
1 <= 节点个数 <= 1000
1 <= Node.val <= 1000
解题思路 + 代码
题目的意思很好理解,遍历二叉树获取每个节点的颜色值,去重返回长度即可。那么代码实现就可以先定义一个集合用来保存遍历获取的颜色值的唯一值,这里遍历二叉树使用深度遍历的方式,递归终止条件为 node
为 None
。即遍历到叶子结点后,记录对应 node
的 val
值,开始回溯。二叉树遍历完成后,直接返回len(res)
即为颜色种类。
def numColor(self, root):
"""
:type root: TreeNode
:rtype: int
"""
res = set()
def DFS(node):
if not node: return
DFS(node.left)
DFS(node.right)
res.add(node.val)
DFS(root)
return len(res)
题二、下载插件
小扣打算给自己的 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
你的点赞、收藏是对我最大的支持!
对于刚入门 Python
或是想要入门 Python
的小伙伴,可以通过下方小卡片联系作者,一起交流学习,都是从新手走过来的,有时候一个简单的问题卡很久,但可能别人的一点拨就会恍然大悟,由衷的希望大家能够共同进步。
以上是关于滴滴~每日算法速递!的主要内容,如果未能解决你的问题,请参考以下文章
每日面经AmazonMicrosoftGoogle等最新面经速递!
每日面经BloombergMicrosoft等公司最新面经速递!
每日面经LinkedInMicrosoftSpectrum最新面经速递!