1.優先キューの実装
優先度付きキューの実装では、ヒープデータ構造を選択でき、最大の優先度付きキューは大きなヒープを使用でき、最小の優先度付きキューは小さなヒープで実装できます。ヒープは、図に示すようにバイナリツリーです。未満。原則は、最小の優先度キューで以下に説明されています。最小優先度キューには、通常、セットSへの要素の挿入、セットS内で最小のキーを持つ要素の返却、セットS内で最小のキーを持つ要素の返却と削除などが含まれます。
挿入操作
挿入操作では、要素をセットSに挿入し、最初に要素をすべての要素の次の位置に配置してから、次の例に示すように「フロート」操作を実行します(下の図の例に注意してください)。は小さな山であり、写真はJava PriorityQueueの深い理解からのものです)
操作を削除します
優先キューで、キューが空でない場合は、セットの最初の要素、つまり添え字0の要素を削除してから、セットの最後の要素を添え字0の位置に移動します。新しい要素は「シンク」操作。次の図の例(注、ただし原則は同じです。図はJava PriorityQueueの詳細な理解から得られたものです)
ライブ学習と使用:
アルゴリズムの問題:
题目描述:
对于一个数组,寻找其前K个最小的元素
import java.util.Comparator;
import java.util.PriorityQueue;
class Solution {
public void getLeastNumbers(int[] arr, int k) {
int[] num = new int[k];
//Queue<Integer> queue = new PriorityQueue<>((v1, v2) -> v2 - v1);
PriorityQueue<Integer> queue = new PriorityQueue<>(k, new Comparator<Integer>() {
@Override
public int compare(Integer t1, Integer t2) {
return t2 - t1;
}//大根堆
});
for (int value : arr) {
if (queue.size() < k)
queue.offer(value);
else {
if (value < queue.peek()) {
queue.poll();
queue.offer(value);
}
}
}
for (int i = 0; i < k; i ++){
num[i] = queue.poll();
}
for(int i=0;i<k;i++)
System.out.print(num[i]+" ");
//return num;
}
public static void main(String[] args) {
Solution s=new Solution();
int []arr={
4,5,1,6,2,7,3,8};
int k=4;
s.getLeastNumbers(arr,4);
}
}
返回结果:4 3 2 1