347. 前 K 個高頻元素
1.想法
利用Map存儲每個數(shù)的頻次,<key,value>-><num,frequency>,然后將數(shù)據(jù)讀出,存儲在兩個int的數(shù)組里面,一個int[] tag代表了這個數(shù)字,然后int[] frequency代表了數(shù)字的頻次,然后根據(jù)frequency調(diào)整tag,利用frequency建立大根堆或者小根堆,輸出前k或者后k個數(shù).
堆排序:http://www.reibang.com/p/1977402d9277
2.代碼
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> result = new ArrayList<>();
Map<Integer,Integer> res = new HashMap<>();
//先記錄每個數(shù)字的頻次
for(int i=0;i<nums.length;i++){
res.put(nums[i],res.getOrDefault(nums[i],0)+1);
}
int[] tags = new int[res.size()];
int[] frequency = new int[res.size()];
int i = 0;
Iterator iterator = res.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry item = (Map.Entry) iterator.next();
tags[i] = (int) item.getKey();
frequency[i++] = (int) item.getValue();
}
builtMinHeap(tags,frequency,k);
for(int index = tags.length-1;index>tags.length-1-k;index--){
result.add(tags[index]);
}
return result;
}
//建立小根堆,當后k個數(shù)排序完成時,算法結束
private void builtMinHeap(int[] tags, int[] frequency, int k) {
int count = 0;
for(int i=tags.length/2-1;i>-1;i--){
dealSnap(tags,frequency,i,tags.length);
}
while(count<k){
swap(tags,frequency,tags.length-1-count,0);
dealSnap(tags,frequency,0,tags.length-1-count);
count++;
}
}
//調(diào)整過程
private void dealSnap(int[] tags, int[] frequency, int start, int end) {
if(2*start+1>=end){
return;
}else if(2*(start+1)>=end){
if(frequency[2*start+1]>=end){
swap(tags,frequency,2*start+1,start);
}
}else{
if(frequency[start]>=frequency[2*start+1]&&frequency[start]>=frequency[2*(start+1)]){
return;
//左子樹最大,交換后去排列左邊
}else if(frequency[2*start+1]>=frequency[start]&&frequency[2*start+1]>=frequency[2*(start+1)]){
swap(tags,frequency,2*start+1,start);
dealSnap(tags,frequency,2*start+1,end);
//右子樹最大榨乎,交換后去排列右邊
}else{
swap(tags,frequency,2*(start+1),start);
dealSnap(tags,frequency,2*(start+1),end);
}
}
}
//交換過程
private void swap(int[] tags, int[] frequency, int i, int j) {
int tempTag = tags[i];
int tempFraquency = frequency[i];
tags[i] = tags[j];
frequency[i] = frequency[j];
tags[j] = tempTag;
frequency[j] = tempFraquency;
}