(一).基础概念
优先级队列,也称为堆。在前面介绍数据结构章节介绍过了,所以这里就不多介绍了,直接上题目。
(二).具体题目
1.最后一块石头的重量
1046. 最后一块石头的重量 - 力扣(LeetCode)

解法:使用优先级队列

java
class Solution {
public int lastStoneWeight(int[] stones) {
PriorityQueue<Integer> priorityQueue=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for(int x:stones){
priorityQueue.add(x);
}
while (priorityQueue.size()>1){
int v1=priorityQueue.poll();
int v2=priorityQueue.poll();
if (v1-v2!=0){
priorityQueue.add(v1-v2);
}
}
return priorityQueue.size()>=1?priorityQueue.peek():0;
}
}
2.数据流中的第K大元素
703. 数据流中的第 K 大元素 - 力扣(LeetCode)

解法:使用优先级队列

java
class KthLargest {
PriorityQueue<Integer> priorityQueue=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
int size;
public KthLargest(int k, int[] nums) {
size=k;
for (int i = 0; i < nums.length; i++) {
priorityQueue.add(nums[i]);
if (priorityQueue.size()>k){
priorityQueue.poll();
}
}
}
public int add(int val) {
priorityQueue.add(val);
if (priorityQueue.size()>size){
priorityQueue.poll();
}
return priorityQueue.peek();
}
}
3.前K个高频单词

解法:使用优先级队列

java
public List<String> topKFrequent(String[] words, int k) {
HashMap<String,Integer> hashMap=new HashMap<>();
for(String word:words){
hashMap.put(word,hashMap.getOrDefault(word,0)+1);
}
PriorityQueue<Map.Entry<String,Integer>> priorityQueue=new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if (o1.getValue().compareTo(o2.getValue())==0){
return o2.getKey().compareTo(o1.getKey());
}
return o1.getValue().compareTo(o2.getValue());
}
});
for(Map.Entry<String,Integer> entry:hashMap.entrySet()){
priorityQueue.add(entry);
if (priorityQueue.size()>k){
priorityQueue.poll();
}
}
List<String> list=new ArrayList<>();
for (int i = 0; i < k; i++) {
list.add(priorityQueue.poll().getKey());
}
Collections.reverse(list);
return list;
}
4.数据流的中位数

解法:使用优先级队列

java
class MedianFinder {
PriorityQueue<Integer> leftQueue;
PriorityQueue<Integer> rightQueue;
public MedianFinder() {
leftQueue=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
rightQueue=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
}
public void addNum(int num) {
if (leftQueue.size()==rightQueue.size()){
if (leftQueue.isEmpty() || num<=leftQueue.peek()){
leftQueue.add(num);
}else{
rightQueue.add(num);
leftQueue.add(rightQueue.poll());
}
}else{
if (num<=leftQueue.peek()){
leftQueue.add(num);
rightQueue.add(leftQueue.poll());
}else {
rightQueue.add(num);
}
}
}
public double findMedian() {
if (leftQueue.size()>rightQueue.size()){
return leftQueue.peek();
}else{
return (leftQueue.peek()+rightQueue.peek())/2.0;
}
}
}