347. 前 K 个高频元素
hashmap+自建堆
class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
int[] heap=new int[k];
int cnt=0;
Heap classHeap=null;
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
int key=entry.getKey();
int value=entry.getValue();
if(cnt<k){
heap[cnt]=key;
cnt++;
if(cnt==k){
classHeap=new Heap(heap,map);
}
}
else{
int min=classHeap.getMin();
if(value>min){
classHeap.delMin();
classHeap.add(key);
}
}
}
return classHeap.data;
}
}
class Heap{
int[] data;
int size=0;
HashMap map;
Heap(int[] data,HashMap map){
this.data=data;
size=data.length;
this.map=map;
Heapify();
}
int delMin(){
int num=(Integer)map.get(data[0]);
swap(0,size-1);
size--;
percolateDown(0);
return num;
}
void add(int x){
data[size]=x;
size++;
Heapify();
}
int getMin(){
return (Integer)map.get(data[0]);
}
void Heapify(){
for(int i=(size-2)/2;i>=0;i--)
percolateDown(i);
}
int properParent(int x,int y,int z){
int min=x;
if(y<size&&(Integer)map.get(data[y])<(Integer)map.get(data[min]))
min=y;
if(z<size&&(Integer)map.get(data[z])<(Integer)map.get(data[min]))
min=z;
return min;
}
void percolateDown(int pos){
int j;
while(pos!=(j=properParent(pos,2*pos+1,2*pos+2))){
swap(pos,j);
pos=j;
}
}
void swap(int x,int y){
if(x==y)return;
data[x]=data[x]^data[y];
data[y]=data[x]^data[y];
data[x]=data[x]^data[y];
}
}
hashmap+快排(随机选哨兵)--和哨兵固定选第一个相比,本题没差
class Solution {
HashMap<Integer,Integer> map=new HashMap<>();
int[] data;
public int[] topKFrequent(int[] nums, int k) {
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
data=new int[map.size()];
int m=0;
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
int key=entry.getKey();
data[m]=key;
m++;
}
quickSort(0,data.length-1,k);
return Arrays.copyOfRange(data,0,k);
//return data;
}
void quickSort(int left,int right,int k){
if(left>=right)return;
int pos=(int)(Math.random()*(right-left+1))+left;
int pivot=data[pos];
int val=(Integer)map.get(data[pos]);
swap(left,pos);
int i=left;
int j=right;
while(i<j){
while(i<j&&(Integer)map.get(data[j])<=val)j--;
data[i]=data[j];
while(i<j&&(Integer)map.get(data[i])>=val)i++;
data[j]=data[i];
}
data[i]=pivot;
if(i>k)quickSort(left,i-1,k);//左边
if(i<k)quickSort(i+1,right,k);//右边
}
void swap(int x,int y){
if(x==y)return;
data[x]=data[x]^data[y];
data[y]=data[x]^data[y];
data[x]=data[x]^data[y];
}
}

浙公网安备 33010602011771号