查看: 1521| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 采购两个类型的零件A和B

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

评分

参与人数 2大米 +22 收起 理由
阿满 + 2 很有用的信息!
14417335 + 20

查看全部评分


上一篇:面向面试Java学习大纲
下一篇:leetcode 224. Basic Calculator 很绝望的超时求助帖
推荐
mint0715 2019-5-22 09:06:08 | 只看该作者
全局:
刷题网 一千零二十九
回复

使用道具 举报

🔗
lalxyy 2019-5-1 23:33:04 | 只看该作者
全局:
只是想了一下,没测试。

首先对于k个公司中每个公司的tuple比如(1, 10)指定一个id. 这一步应该是需要编成list或者map/dict.
1+1的case:维护两个list a[2]和b[2],length都是2,分别指产品A和B的最低报价id和次最低报价id. 然后遍历一次所有公司,拿到A和B的最低价格的公司id和次最低的公司id. 这个过程是 O(k). 然后尝试(a[0], b[0]), (a[1], b[0]), (a[0], b[1])哪个和最小,遇到同一个公司id则忽略。
m+n的case:维护两个min-heap,各自capacity是m+n. 分别存储A和B的前(m+n)个最低报价的公司id. 模仿k-th largest number,遍历所有k个公司,拿到两个产品的最低的(m+n)个报价,这个过程是 O(k + log(m + n))。然后从两个堆中小一点的堆顶开始merge两个堆(删堆顶元素),遇到已经出现的公司id则忽略。每一次删元素是 O(log(m + n)),一直到分别选出m和n个产品。这个过程最坏情况是 O((m + n) * log(m + n)),最好情况是 O(max(m, n) * log(m + n)).

补充内容 (2019-5-1 23:33):
m+n的case的遍历过程是O(k * log(m + n))

补充内容 (2019-5-1 23:45):
merge两个堆的过程我想的是类似于merge sort后期合并的过程
回复

使用道具 举报

🔗
lalxyy 2019-5-2 10:28:27 | 只看该作者
全局:
按照之前的想法写了一个1+1的:

  1. def case_one_plus_one(company_list):
  2.     if len(company_list) < 2:
  3.         return []

  4.     a = [0, 1] if company_list[0][0] < company_list[1][0] else [1, 0]
  5.     b = [0, 1] if company_list[0][1] < company_list[1][1] else [1, 0]
  6.     for index, c in enumerate(company_list):
  7.         if c[0] <= company_list[a[0]][0]:
  8.             a[0] = index
  9.         elif c[0] <= company_list[a[1]][0]:
  10.             a[1] = index
  11.         if c[1] <= company_list[b[0]][1]:
  12.             b[0] = index
  13.         elif c[1] <= company_list[b[1]][1]:
  14.             b[1] = index

  15.     print(a)
  16.     print(b)
  17.     if a[0] != b[0]:
  18.         return company_list[a[0]][0] + company_list[b[0]][1]
  19.     else:
  20.         return min(company_list[a[0]][0] + company_list[b[1]][1], company_list[a[1]][0] + company_list[b[0]][1])

  21. if __name__ == '__main__':
  22.     company_list = [(7, 80), (24, 89), (101, 95), (168, 101)]
  23.     case_one_plus_one(company_list)
复制代码

补充内容 (2019-5-2 11:18):
len < 2 应该是return 0
回复

使用道具 举报

全局:
lalxyy 发表于 2019-5-1 23:33
只是想了一下,没测试。

首先对于k个公司中每个公司的tuple比如(1, 10)指定一个id. 这一步应该是需要编 ...

然后从两个堆中小一点的堆顶开始merge两个堆(删堆顶元素)
能再詳細解釋一下嗎?沒太想明白
回复

使用道具 举报

🔗
lalxyy 2019-5-22 09:39:24 | 只看该作者
全局:
TTTWangTingting 发表于 2019-5-22 07:04
然后从两个堆中小一点的堆顶开始merge两个堆(删堆顶元素)
能再詳細解釋一下嗎?沒太想明白

我记得刷题网有merge两个array的原型。忘了题目叫什么。可以参考这个操作。
回复

使用道具 举报

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

本版积分规则

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