当前位置: 首页 > Web前端 > JavaScript

【算法】Heap

时间:2023-03-27 14:52:15 JavaScript

堆的分类MaxHeapMinHeap在MaxHeap中,每个节点的值总是大于等于它的任意一个子节点的值在MinHeap中,每个节点的值总是小于或等于其任意子节点的值堆最大的特点是最大值或最小值位于堆顶,查找一个数据的最大值或最小值只需要O(1)的时间放。如果面试题需要找一个动态数据集合中的最大值或者最小值,那么可以考虑使用堆来解决问题。最小堆常用于查找数据集中值最大的k个元素,而最大堆则用于查找数据集中值最小的k个元素。数据流第K大数字varKthLargest=function(k,nums){this.k=k;this.heap=newMinHeap();for(constxofnums){this.add(x);}};KthLargest.prototype.add=function(val){this.heap.offer(val);if(this.heap.size()>this.k){this.heap.poll();}returnthis.heap.peek();};classMinHeap{constructor(data=[]){this.data=data;this.comparator=(a,b)=>a-b;this.heapify();}heapify(){如果(this.size()<2)返回;for(leti=1;i0){constparentIndex=(index-1)>>1;如果(this.comparator(this.data[index],this.data[parentIndex])<0){this.swap(index,parentIndex);指数=父索引;}else{休息;}}}swap(index1,index2){[this.data[index1],this.data[index2]]=[this.data[index2],this.data[index1],];}poll(){if(this.size()===0){返回空值;}constresult=this.data[0];constlast=this.data.pop();if(this.size()!==0){this.data[0]=last;这个.bubbleDown(0);}返回结果;}bubbleDown(index){constlastIndex=this.size()-1;while(true){constleftIndex=index*2+1;constrightIndex=index*2+2;让findIndex=索引;如果(leftIndex<=lastIndex&&this.comparator(this.data[leftIndex],this.data[findIndex])<0){findIndex=leftIndex;}if(rightIndex<=lastIndex&&this.comparator(this.data[rightIndex],this.data[findIndex])<0){findIndex=rightIndex;}我发现ex!==findIndex){this.swap(index,findIndex);索引=查找索引;}else{休息;}}}}给出频率最高的k个数,给定一个整数数组nums和一个整数k,请返回频率最高的k个元素,可以任意顺序返回答案。/***@param{number[]}nums*@param{number}k*@return{number[]}*/vartopKFrequent=function(nums,k){constmap=newMap();for(constnofnums)map.set(n,1+(map.get(n)||0));constarr=[];for(constkvofmap)arr.push(kv);返回arr.sort((a,b)=>b[1]-a[1]).slice(0,k).map((a)=>a[0]);};给定两个按升序排列的整数数组,从两个数组中各取一个数u和v组成一个数对(u,v),请找出最小的k个数对。例如输入两个数组[1,5,13,21]和[2,4,9,15],最小的3对分别是(1,2),(1,4),(2,5)。API解决方案/***@param{number[]}nums1*@param{number[]}nums2*@param{number}k*@return{number[][]}*/varkSmallestPairs=function(nums1,nums2,k){让res=[];for(leti=0;i{returna[0]+a[1]-(b[0]+b[1]);})。slice(0,k);};总结堆可以分为最大堆和最小堆。最大值总是在最大堆的堆顶,最小值总是在最小堆的堆顶。因此,只需要O(1)的时间就可以得到堆中的最大值或最小值。堆通常用于解决与查找数据集中的k个最大值或最小值相关的问题。通常,最大堆用于寻找数据集中的k个最小值,最小堆用于寻找数据集中的k个最大值。参考文章JS刷leetcode

最新推荐
猜你喜欢