前言
今天是topK问题,还是采用了堆,有个要注意的就是权重问题,举个例子,10的权重计算时会重复计算到5的权重,为此,为了减少计算,方法二采用了记忆化的和手段。
题目
源码
class Solution {
// 计算权重,无记忆
public int getF(int num){
int count=0;
while(num!=1){
if(num%2==1){
num += (num<<1)+1;
}else{
num >>=1;
}
count++;
}
return count;
}
// 记忆化
private Map<Integer,Integer>map;
public int getW(int num){
if(num==1){
return 0;
}
if(map.containsKey(num)){
return map.get(num);
}
int count=0;
while(num!=1){
if(num%2==1){
num += (num<<1)+1;
}else{
num >>=1;
}
count++;
}
map.put(num,count);
return count;
}
// top k最小堆
public int getKth(int lo, int hi, int k) {
Queue<int []> ans=new PriorityQueue<>((o1,o2)->o1[1]!=o2[1]?o2[1]-o1[1]:o2[0]-o1[0]);
map=new HashMap<>();
for(int i =lo;i<=hi;++i){
ans.offer(new int[]{i,getW(i)});
if(i-lo+1>k){
ans.poll();
}
}
return ans.peek()[0];
}
}