簡體   English   中英

如何獲取 k min 元素的原始索引

[英]How to get k min element's original index

我有一個像 {40,78,56,98,1,-9} 這樣的數組,這個數組的大小可能很大。 我想獲得第一個 K min 元素的索引。 我可以使用 min-heap/priority-queue 以非常好的時間復雜度獲得 K min 個元素。 但我不知道如何獲得他們的索引。 請以某些方式指導我,我可以解決我的問題。

我曾嘗試使用 TreeMap 來獲得相同的結果,但是如果數組變大,那會花費太多時間。

示例輸入:{40,78,56,98,1,-9},K = 2 輸出:{5,4}

好的,我假設您想要以下內容:獲取給定數組的前 2 分鍾元素的索引。 它可以實現如下:

 int[] array = {5,75,73,4,78,6,4,3,4,3,64};
 // stream the array of integers, box them, sort them by comparing values of their indexes, unbox them, limit only first 2 and get them to array.
 int[] getIndexes = IntStream.range(0, array.length).boxed().sorted(Comparator.comparing(i -> array[i])).mapToInt(i->i).limit(2).toArray();

如果允許您使用優先級隊列,則可以通過創建類 Pair 並在初始化優先級隊列時傳遞比較器來在優先級隊列中添加值和索引。 Pair 類可以如下所示:

class Pair {
    Pair(int val, int idx){
        this.val = val;
        this.idx = idx;
    }
    int val;
    int idx;
}
  1. 您可以創建一個最大堆並向其中添加前k 個元素。
  2. 從第(k + 1) 個元素開始遍歷數組。
  3. 檢查最大元素(即堆的根)是否小於第(k + 1)個元素,如果小於,則刪除最大元素並將新元素添加到堆中創建新的 Pair 對象。
  4. 執行第 3 步,直到到達數組的末尾。

您可以按如下方式初始化優先級隊列:

Queue<Pair> maxHeap = new PriorityQueue<>(k, (pair1, pair2) -> -Integer.compare(pair1.val, pair2.val));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM