算法面试通关 40 讲
覃超
Sophon Tech 创始人,前 Facebook 工程师,卡内基梅隆大学计算机硕士
78356 人已学习
新⼈⾸单¥68
课程目录
已完结/共 62 讲
第二章:理论讲解+面试题实战 (53讲)
算法面试通关 40 讲
登录|注册
留言
47
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 11 | 面试题:返回数据流中的第K大元素
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 合格程序员的第一步:算法与数据结构
02 | 如何事半功倍地学习算法与数据结构
03 | 如何计算算法的复杂度
04 | 如何通过LeetCode来进行算法题目练习
05 | 理论讲解:数组&链表
06 | 面试题:反转一个单链表&判断链表是否有环
07 | 理论讲解:堆栈&队列
08 | 面试题:判断括号字符串是否有效
09 | 面试题:用队列实现栈&用栈实现队列
10 | 理论讲解:优先队列
11 | 面试题:返回数据流中的第K大元素
12 | 面试题:返回滑动窗口中的最大值
13 | 理论讲解:哈希表
14 | 面试题:有效的字母异位词
15 | 面试题:两数之和
16 | 面试题:三数之和
17 | 理论讲解:树&二叉树&二叉搜索树
18 | 面试题:验证二叉搜索树
19 | 面试题:二叉树&二叉搜索树的最近公共祖先
20 | 理论讲解:二叉树遍历
21 | 理论讲解:递归&分治
22 | 面试题:Pow(x,n)
23 | 面试题:求众数
24 | 理论讲解:贪心算法
25 | 面试题:买卖股票的最佳时机
26 | 理论讲解:广度优先搜索
27 | 理论讲解:深度优先搜索
28 | 面试题:二叉树层次遍历
29 | 面试题:二叉树的最大和最小深度
30 | 面试题:生成有效括号组合
31 | 理论讲解:剪枝
32 | 面试题:N皇后问题
33 | 面试题:数独问题
34 | 理论讲解:二分查找
35 | 面试题:实现一个求解平方根的函数
36 | 理论讲解:字典树
37 | 面试题:实现一个字典树
38 | 面试题:二维网格中的单词搜索问题
39 | 理论讲解:位运算
40 | 面试题:统计位1的个数
41 | 面试题:2的幂次方问题&比特位计数问题
42 | 面试题:N皇后问题的另一种解法
43 | 理论理解:动态规划(上)
44 | 理论理解:动态规划(下)
45 | 面试题:爬楼梯
46 | 面试题:三角形的最小路径和
47 | 面试题:乘积最大子序列
48 | 面试题:股票买卖系列
49 | 面试题:最长上升子序列
50 | 面试题:零钱兑换
51 | 面试题:编辑距离
52 | 理论讲解:并查集
53 | 面试题:岛屿的个数&朋友圈(上)
54 | 面试题:岛屿的个数&朋友圈(下)
55 | 理论讲解: LRU Cache
56 | 面试题:设计和实现一个LRU Cache缓存机制
57 | 理论讲解:布隆过滤器
58 | 课程重点回顾
59 | FAQ答疑&面试中切题四件套
60 | 回到起点:斐波拉契数列
61 | 白板实战番外篇:斐波拉契数列
62 | 结课测试&最后的一些经验分享
登录 后留言

全部留言(47)

  • 最新
  • 精选
zhimin
PHP 最小堆实现第K大元素 class MinHeap extends SplHeap { //用最小堆存储第K大元素 public function compare( $value1, $value2 ) { return ( $value2 - $value1 ); } } class KthLargest { public $k; public $heap; /** * @param Integer $k * @param Integer[] $nums */ function __construct($k, $nums) { $this->k = $k; $this->heap = new MinHeap(); foreach($nums as $num) { $this->add($num); } } /** * @param Integer $val * @return Integer */ function add($val) { if($this->heap->count()<$this->k){ $this->heap->insert($val); }else{ if($val>$this->heap->top()){ $this->heap->insert($val); $this->heap->extract(); } } return $this->heap->top(); } }

作者回复: nice

2019-11-09
3
niubility
这个题面试真遇到过,当时回答的也是 维护一个 k 长度的数组,每次加入都进行排序,先跟最小的比,如果比最小的都小就直接抛弃.比最小的大就挨个与数组中元素比较. 时间复杂度是 n*k

作者回复: 你提议的算法就是相对比较简单朴素的算法,O(n*k) 速度太慢,必须要 O(n) 的算法才能通过面试的。

2018-10-30
2
firstblood
上面那个Go语言的有问题,他不能保证一直都是满足小顶堆的限制的,因为push的时候调用的是自己的方法而不是堆的方法,所以不会检测。下面是我写的 type IntHead []int func (i IntHead) Len() int { return len(i)} func (In IntHead) Less(i ,j int) bool { return In[i] < In[j]} func (In IntHead) Swap(i, j int) { In[i], In[j] = In[j], In[i] } func (In *IntHead) Push(x interface{}) { *In = append(*In, x.(int)) } func (In *IntHead) Pop() interface{} { old := *In n := len(old) x := old[n -1] *In = old[0:n-1] return x } type KthLargest struct { K int H *IntHead } func Constructor(k int, nums []int) KthLargest { min := &IntHead{} heap.Init(min) kth := KthLargest{K:k, H:min} for _, num := range nums { kth.Add(num) } return kth } func (this *KthLargest) Add(val int) int { if this.H.Len() == 1 && (*this.H)[0] == 0 && val == -1 { min := &IntHead{-1,0} heap.Init(min) this.H = min } if this.H.Len() < this.K { heap.Push(this.H, val) } else if (*this.H)[0] < val { heap.Pop(this.H) heap.Push(this.H, val) } return (*this.H)[0] } }

作者回复: 赞👍🏻

2019-01-08
1
霜花香似海
今天看到一个算法测试题,讲到了优先级队列,大顶堆和小顶堆,而且我还通过课程的理解讲给了同事,竟然给他讲明白了,很有成就感

作者回复: 👍🏻赞

2018-12-21
1
davix
老师,学习课程时,是不是不推荐使用不支持heap的语言,比如c?否则精力花在自己实现heap上,没有必要。

作者回复: 不用自己去实现,对的,建议选用高级语言,自己实现的heap,特别是二插堆,性能比较有限。

2019-01-12
Derek
GO语言版本实现: package main import ( "container/heap" "fmt" ) type IntHeap []int func (h IntHeap) Len() int { return len(h) } func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *IntHeap) Push(x interface{}) { *h = append(*h, x.(int)) } func (h *IntHeap) Pop() interface{} { old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x } // return the minimum func (h *IntHeap) Peek() interface{} { return (*h)[0] } type KthLargest struct { minHeap *IntHeap k int } func Constructor(k int, nums []int) KthLargest { h := &IntHeap{} heap.Init(h) kth := KthLargest{minHeap: h, k: k} for _, v := range nums { kth.Add(v) } return kth } func (this *KthLargest) Add(val int) int { if this.minHeap.Len() < this.k { this.minHeap.Push(val) } else if this.minHeap.Peek().(int) < val { heap.Remove(this.minHeap, 0) this.minHeap.Push(val) } return this.minHeap.Peek().(int) } /** * Your KthLargest object will be instantiated and called as such: * obj := Constructor(k, nums); * param_1 := obj.Add(val); */ func main() { k := 3 nums := []int{4, 5, 8, 2} obj := Constructor(k, nums) fmt.Println(obj.Add(3)) fmt.Println(obj.Add(5)) fmt.Println(obj.Add(10)) fmt.Println(obj.Add(9)) fmt.Println(obj.Add(4)) }

作者回复: 👍🏻👍🏻

2018-12-13
Hurt
老师 假如使用优先队列的方式来实现 那么如何计算实际复杂度呢 不用考虑优先队列的实现的 时间复杂对吗

作者回复: 需要的。有效队列自己的时间复杂度也考虑在里面了。

2018-12-11
Geek_949848
老师 ,请问一下用python实现的话有内建的miniheap吗?

作者回复: Python没有纯原生的,但是有公认几个不错的heap和collection库。

2018-11-16
Geek_fb3db2
miniheap是个什么概念 和代码里面的优先队列啥关系 感觉不是很清楚 内部是如何保证最小元素在最上面

作者回复: Min heap 就是小顶堆,可以保证最小元素始终在最上面。

2018-11-15
achenbj
作者好,如果问题的发起者说不能用 java 现成的 PriortyQueue 的话是不是还需要单独实现这个排序的算法呢?

作者回复: 是的。但是一般来说priority queue不会让人来手动实现。因为工业级标准肯定要用fibonacci heap ,实现很复杂。

2018-11-15
收起评论