课程名称:JavaScript版数据结构与算法
课程章节:第10章 数据结构之“堆”
主讲老师:lewis
今天学习的内容包括:
10-4 LeetCode:347. 前 K 个高频元素——返回出现频率最高的K个元素。
10-5 LeetCode:23. 合并K个排序链表——最小堆的堆顶就是新链表的下一个节点,以此处理即可。
10-6 堆-章节总结——堆是一种特殊的完全二叉树。
10-7 【勤于思考,夯实学习成果】阶段思考题——完成对应作业。
1、将元素循环插入最小堆。
2、通过h.size()判断堆是否大于K,如果大于K,将堆顶推出,直到只剩下 size 等于 K。
3、返回第K个高频元素,即堆顶。
nums.forEach(n=>{ h.insert(n) if(h.size() > k){ h.pop() } })
1、构建一个最小堆,并依次把链表头插入堆中。
2、弹出堆顶接到输出链表,并将堆顶所在链表的新链表头插入堆中。
3、等堆元素全部弹出,合并工作就完成了。
while (h.size()){ const n = h.pop() p.next = n p = p.next if(n.next) h.insert(n.next) }
1、堆是一种特殊的完全二叉树。
2、所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。
3、JS 中通常用数组表示堆。
4、堆能高效、快速地找出最大值和最小值,时间复杂度:O(1)。
5、找出第K个最大(小)元素。
1、最小堆插入数据时,做对比交换shiftUp。
insert(value){ this.heap.push(value) this.shiftUp(this.heap.length-1) } shiftUp(index){ if(index === 0) return const parentIndex = this.getParentIndex(index) if(this.heap[parentIndex] > this.heap[index]){ this.swap(parentIndex,index) this.shiftUp(parentIndex) } }
2、两个元素互换,在排序算法中也常用到。
swap(i,j){ const temp = this.heap[i] this.heap[i] = this.heap[j] this.heap[j] = temp }
3、将堆顶推出后,将尾元素放入堆顶,跟原子节点比对互换。
pop(){ this.heap[0] = this.heap.pop() this.shiftDown(0) } shiftDown(index){ const leftIndex = this.getLeftIndex(index) const rightIndex = this.getRightIndex(index) if(this.heap[leftIndex] < this.heap[index]){ this.swap(leftIndex,index) this.shiftDown(leftIndex) } if(this.heap[rightIndex] < this.heap[index]){ this.swap(rightIndex,index) this.shiftDown(rightIndex) } }
今天学完了 数据结构之“堆”,理论知识已经会了,怎么在实际工作中使用,如何使用我还是模糊的,慢慢来吧,一步一个脚印,今天先到这把,对自己说一句,加油😀~
坚持打卡,坚持学习!明天见💪~