09-06美团机器学习编程题思路

第一题:图的遍历

图片说明

  • 思路:假设最后需要回归根节点,那么无论怎么遍历,每条边都会被访问两次,总路程总是2(n-1);如果只需要遍历所有节点,则访问完最后一个叶子节点无需返回,要是总路程最小,那么最终访问的叶子节点应该距离根节点最远;如果树的最大深度为h,那么总路程最少需要2(n-1)-h。
  • 代码:BFS计算树的最大深度,时间复杂度O(V+E)=O(n)
from collections import defaultdict
n = input()
adj = defaultdict(list)
for i in xrange(n-1):
    x,y = map(int, raw_input().split())
    adj[x-1].append(y-1)
    adj[y-1].append(x-1)
level = -1
color = [0] * n
color[0] = 1
q = [0]
while q:
    level += 1
    qq = []
    for pre in q:
        for pre_adj in adj[pre]:
            if color[pre_adj] == 0:
                color[pre_adj] = 1
                qq.append(pre_adj)
    q = qq
print 2 * (n-1) - level

第二题:最长全1串

图片说明

  • 思路:动态规划,设dp[i][k]表示以下标i结尾且最多变换k次的最长1串长度,最终最大长度=max(dp[i][K]),i=0,1,...,n-1;时间复杂度O(kn),状态转移方程可以写作:
dp[i][k] = dp[i-1][k]+1; 如果s[i] == '1', i > 0
dp[i][k] = dp[i-1][k-1] + 1; 如果s[i] =='0',i > 0, k > 0
dp[i][k] = [k!=0 or s[i]=='1']; 如果i == 0
dp[i][k] = dp[i-1][k] + 1;如果s[i] == '1',k = 0,i > 0
dp[i][k] = 0;如果s[i] == '0', k = 0
  • 改进:考虑dp[i][k]只与当前层和上一层有关,可以用滚动数组将空间复杂度减少至O(n)
  • 代码:
N, K = map(int, raw_input().split())
s = ''.join(raw_input().split())
dp = [-1] * N
for k in xrange(K+1):
    tmp = [k!=0 or s[0]=='1'] * N
    for i in xrange(1,N):
        tmp[i] = tmp[i-1] + 1 if s[i] == '1' else dp[i-1] + 1
    dp = tmp
print max(dp)

仅为个人思路,第二题使用二维DP,超出内存限制,未验证滚动数组解法是否可以AC。

#机器学习##美团##笔试题目##题解#
全部评论
第二题滚动数组C++27 Python45,并不可以AC
点赞 回复 分享
发布于 2018-09-07 00:04
滚动数组只能优化空间,时间复杂度还是会炸呀
点赞 回复 分享
发布于 2018-09-11 20:38
第二题直接记录0数量。然后遍历一遍On就过了。典型滑动窗口,只是窗口只能增大,而不是从1开始。
点赞 回复 分享
发布于 2018-09-07 01:12
图的遍历这个题目的思路真的很好啊!佩服,当时我是按照求最短路径的方法想通过迪杰斯特拉算法的想法去做结果方向就想错了。。。还是对问题的思考不够啊
点赞 回复 分享
发布于 2018-09-07 00:06
两题都ac了吗 宝贝
点赞 回复 分享
发布于 2018-09-07 00:02

相关推荐

今天 18:09
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 12:05
俺不中了,BOSS遇到了一个hr,我觉得我咨询的问题都很正常吧,然后直接就被拒绝了???
恶龙战士:你问的太多了,要不就整理成一段话直接问他,一个一个问不太好
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务