查看: 396|回复: 2
收起左侧

[Leetcode] 请问一道 stream k largest element的最优解

|只看干货
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   91% (22)
 
 
8% (2)    👎

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

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

x

Given an infinite stream of integers, find the kth largest element at any point of time.
本题是从头开始依次找到第k个大的元素,看下例子就能看懂啦
Example:

输入  = [10, 20, 11, 70, 50, 40, 100, 5, .......]
k = 3
输出 = [*, *, 10, 11, 20, 40, 50, 50, ........]
这个是我的答案,我不知道是最优嘛,这个写的对不?
复杂度的话我这个是 time O(n * klogn) 嘛?
space: O(n)

  1. import heapq
  2. def kLargest(stream, k):
  3. n = len(stream)
  4. res = ['-' for _ in range(n)]
  5. if k >= n: return max(stream)
  6. for i in range(k, n+1):
  7.   maxs = heapq.nlargest(k, stream[:i])
  8.   res[i-1] = maxs[-1]
  9. return res
  10. stream1 = [10, 20, 11, 70, 50, 40, 100, 5, 12,80]
  11. print(kLargest(stream1, 3))
复制代码






评分

参与人数 1大米 +3 收起 理由
14417335 + 3

查看全部评分


上一篇:请问大家觉得刷题需要找人一起刷吗?
下一篇:find pairs with max sum that is less than k from lists
thrillerの空 2021-7-22 16:57:25 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   98% (60)
 
 
1% (1)    👎
你用的是built-in的函数库,对于heapq.nlargest()这个函数,根据下面这篇文章的分析:

heapq模块中的两个函数——nlargest()和nsmallest()

这个方法会把原数组转换成heap,那么插入每个元素是O(logn),插入n个元素一共O(nlogn),加上最后取出k个元素,最后的复杂度:

O(nlogn) + O(klogn) = O(nlogn)

所以你写的方法复杂度是O(nlogn),不是O(n * klogn),space的话,新开了一个heap,n个元素,那就是O(n)

至于是不是最优,按照我的理解,已经是哦。最坏情况k = n,不是相当于把数组排序,然后取出n个数嘛?那全排序的下界是已知的:Ω(nlogn),所以你用的这个内置函数在时间复杂度上已经是最优了。

评分

参与人数 1大米 +5 收起 理由
14417335 + 5

查看全部评分

回复

使用道具 举报

本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   78% (334)
 
 
21% (89)    👎
不用每次都heapify
你maintain一个size k 的heap就行了 klogk

有个小trick是:这类题如果做出来复杂度和排序一样了,那肯定有点问题
回复

使用道具 举报

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

本版积分规则

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