//大顶堆 function up (index){ let father = Math.floor((index-1)/2) //获取父节点的下标 // 如果是大顶堆的话,当父节点的值小于当前节点的值时就要交换节点。二叉树用数组arr储存。 while(father>=0&&arr[father]<arr[index]){ [arr[index],arr[father]] = [arr[father],arr[index]] //交换子节点的值和父节点的值。 index = father father = Math.floor((index-1)/2) } }
//大顶堆 function down(index){ if(!arr[index*2+1]) return //如果不存在左子树的话就不下沉了 //如果右子树不存在的话就选左子树否则比较左子树以及右子树的大小谁大选谁 let son = arr[index*2+2]?arr[index*2+1]>arr[index*2+2]?index*2+1:index*2+1:index*2+1 while(son<arr.length&&arr[index]<arr[son]){ [arr[index],arr[son]] = [arr[son],arr[index]] index = son son = arr[index*2+2]?arr[index*2+1]>arr[index*2+2]?index*2+1:index*2+1:index*2+1 } }
var topKFrequent = function(nums, k) { let map = new Map() let quque = new root() for(let num of nums){ map.set(num,(map.get(num)||0)+1) } for(let array of map.entries()){ quque.push(array) if(quque.size()>k){ quque.pop() } } return quque.arr.map((a)=>a[0]) };
class Quque{ constructor(quque=[],compare=(a,b)=>a-b){ this.compare = (a,b)=>compare(this.arr[a],this.arr[b]) this.quque = quque this.arr = [] } build(){ this.quque.forEach((a)=>this.push(a)) this.quque = [] } up(index){ let father = Math.floor((index-1)/2) while(father>=0&&this.compare(index,father)>0){ [this.arr[father],this.arr[index]] = [this.arr[index],this.arr[father]] index = father father = Math.floor((index-1)/2) } } down(index){ let sonindex = this.arr[index*2+2]?this.arr[index*2+1]<this.arr[index*2+2]?index*2+2:index*2+1:index*2+1 while(this.compare(index,sonindex)<0){ [this.arr[index],this.arr[sonindex]] = [this.arr[sonindex],this.arr[index]] index = sonindex sonindex = this.arr[index*2+2]?this.arr[index*2+1]<this.arr[index*2+2]?index*2+2:index*2+1:index*2+1 } } push(val){ this.arr.push(val) this.up(this.arr.length-1) } pop(){ let val = this.arr[0]/2 this.arr[0] = val this.down(0) return val } }
var halveArray = function(nums) { let sum = 0,quque = new Quque(nums),res =0 quque.build() nums.forEach((a)=>{ sum+=a }) let target = sum/2 while(sum>target){ let value = quque.pop() sum -= value res++ } return res