楼主: 14417335
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 最方便的寓所

全局:
Lunluen 发表于 2019/03/31 02:19:45


有个test case错了
应该是5
[mw_shl_code=python,true]    def test_3(self):
        street = [
         ...

应该不是错了,而是题目定义不同,这题有的面经要求是distance sum最小,有的面经要求是到最远的requirement 最小,稍微看了下你的码,应该是用distance sum的问法,我的solution 是解是到最远最短的问法,distance sum 答案最小要给5,最远最小就是4了
回复

使用道具 举报

🔗
mhsasd 2019-3-31 10:21:44 | 只看该作者
全局:
neozhang9233 发表于 2019-3-29 09:20
粘一个个人的答案,无论是求距离和还是最远都可以用这个方法,速度为O(nk),k为requires项数。

[mw_sh ...

有个问题和楼主讨论下。假设n是block的数量,先不说createMap的复杂度,就算是或者可以优化成nk吧。
第二步找最小距离的时候,两个for loop就是nk复杂度,寻找单个required的最小距离复杂度worse case也是n啊。所以worse case O(kn^2)? (比方说每个block都有所有的required facility。)
回复

使用道具 举报

🔗
jerrygenius 2019-4-1 06:27:49 | 只看该作者
全局:
先做个 req->block#的mapping,
然后再来就每次找离得最近的req在哪儿就行了。因为我们只考虑1.靠左最近的 2.靠右最近的。所以每次遇到第二个小于当前block #的index把最前面的那个index就pop出去。然后每次是常数项查询。
最后的timecomplexity 大概是 o(n*k*2) -> o(n*k)
  1. from collections import defaultdict
  2. from collections import deque
  3. def xuangongyu(street,requirement):
  4.     reqset = set(requirement)
  5.     map_a_s = defaultdict(deque)
  6.     for i,block in enumerate(street):
  7.         for item in block:
  8.             if item in reqset:
  9.                 map_a_s[item].append(i)
  10.     print(map_a_s)
  11.     res = []
  12.     globalmin = len(street)
  13.     for i,block in enumerate(street):
  14.         localmax = 0
  15.         for item in reqset:
  16.             print(map_a_s)
  17.             popflag = False
  18.             itemmin = len(street)
  19.             for ri,v in enumerate(map_a_s[item]):
  20.                 itemmin = min(itemmin,abs(i-v))
  21.                 if v <= i and ri != 0:
  22.                     popflag = True
  23.                 elif v > i:
  24.                     break
  25.             if popflag: map_a_s[item].popleft()
  26.             localmax = max(itemmin,localmax)
  27.         if localmax < globalmin:
  28.             res = [street[i]]
  29.         elif localmax == globalmin:
  30.             res.append(street[i])
  31.         globalmin = min(globalmin,localmax)
  32.     return globalmin,res
复制代码

评分

参与人数 1大米 +3 收起 理由
14417335 + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
umialpha 2019-4-3 10:22:16 | 只看该作者
全局:
neozhang9233 发表于 2019-3-29 09:20
粘一个个人的答案,无论是求距离和还是最远都可以用这个方法,速度为O(nk),k为requires项数。

[mw_sh ...

这个方法复杂度是不止O(nk)哦,因为求getMinLen不是O(1)
回复

使用道具 举报

🔗
neozhang9233 2019-4-5 08:18:45 | 只看该作者
全局:
umialpha 发表于 2019-4-3 10:22
这个方法复杂度是不止O(nk)哦,因为求getMinLen不是O(1)

getMinLen()的速度取决于requires在road上的平均数量,我当时说因为在真是的例子里,也不可能一条街每栋房子都是麦当劳,就把他近似看成1了,细究起来,如果非要说O(n)我觉得也是可以吧,哈哈哈哈哈,说话的艺术
回复

使用道具 举报

🔗
zdzapple 2019-4-15 15:23:33 | 只看该作者
全局:
neozhang9233 发表于 2019-4-5 08:18
getMinLen()的速度取决于requires在road上的平均数量,我当时说因为在真是的例子里,也不可能一条街每栋 ...

这个可以使用binary search稍微提升下吧?

list中的位置是排序的,直接将当前block的index在其中搜索,找到之前之后的元素,比较下大小
回复

使用道具 举报

全局:
第四题 是给一个1D array吗 然后里面包括各种各种 比如[学校,医院,0,0,0,餐厅,咖啡馆] 这样的输入?
回复

使用道具 举报

🔗
douch 2019-5-5 10:49:11 | 只看该作者
全局:
毛线666 发表于 2019-3-29 08:16
个人观点,仅供参考:
1. 33天能到200分是基于每天都登陆签到,答对问题并且不花任何积分的情况下。 对 ...

说得好! 我也觉得设高限不是很方便 特别是在职刷题跳槽的
回复

使用道具 举报

🔗
douch 2019-5-5 10:51:13 | 只看该作者
全局:
kaipeng21 发表于 2019-3-28 07:15
**** 本内容被作者隐藏 ****

还是这个例子讲的清楚 给你加米了 可是加米的原因写错了 :(
回复

使用道具 举报

🔗
wklglider 2019-6-8 11:44:11 | 只看该作者
全局:
neozhang9233 发表于 2019-4-5 08:18
getMinLen()的速度取决于requires在road上的平均数量,我当时说因为在真是的例子里,也不可能一条街每栋 ...

复杂度应该是O(nf) f is the total number of facilities.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表