找出乙個陣列中的前k個高頻元素

2021-10-01 11:53:21 字數 1838 閱讀 7600

給定乙個非空的整數陣列,返回其**現頻率前 k 高的元素。

例如,給定陣列 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]。

注意:你可以假設給定的 k 總是合理的,1 ≤ k ≤ 陣列中不相同的元素的個數。

第一步基本都是一致的,需要統計出每個元素的出現次數 :先遍歷一遍陣列,以陣列的值做key存放到map中,初始value為1,當有相同的key時,把value加1,然後map中的value就是每個元素的出現次數了.

方式1:簡單暴力一點 , 然後對map中的value進行一次全排序,然後輸出前k個高頻的元素即可.

方式2:採用最小堆優化一下 , 構建乙個容量為k的最小堆 , 遍歷map中的value ,堆的數量小於k時新增 , 等於k之後,用新的value與堆中的最小值進行pk, 大於堆中的最小值就新增進堆,不大於就丟棄 , 遍歷完map之後,輸出堆中的元素就是前k大的元素了.

方式3:採用桶排序 , 構建n+1個桶, 每個桶裡放乙個陣列 , (為什麼是陣列?因為可能2出現了5次,3也出現了5次,所以5這個桶需要用陣列盛放) ,然後把value對應的key填入對應的桶中 , 前k個高頻元素就從桶的結束位置倒敘遍歷k個元素即可. 桶排序就是典型的空間換時間.

方式4:借用了快速排序的思想,我們要找出前k個元素,構建乙個從大到小的陣列, 在排序的過程中,如果能找到乙個基準值,前面的都比基準值大,這個基準值又是k,那麼就說明,前面的資料就是前k個高頻元素了.

全排序法:

public listtopkfrequent(int nums, int k) 

// 對元素按照頻率進行降序排序

list> list = new arraylist<>(freqmap.entryset());

collections.sort(list, new comparator>()

});// 取出前k個元素

int count = 0;

listret = new arraylist<>();

for (map.entryentry : list)

}return ret;

}

最小堆法:

public listtopkfrequent(int nums, int k) 

// 遍歷map,用最小堆儲存頻率最大的k個元素

priorityqueuepq = new priorityqueue<>(new comparator()

});for (integer key : map.keyset()) else if (map.get(key) > map.get(pq.peek()))

}// 取出最小堆中的元素

listret = new arraylist<>();

while (!pq.isempty())

return ret;

}

桶排序法

public listtopkfrequent(int nums, int k) 

// 桶排序

list bucket = new list[nums.length + 1];

for (integer key : int2freqmap.keyset())

bucket[freq].add(key);

}// 逆序(頻次由高到低)取出元素

listret = new arraylist<>();

for (int i = nums.length; i >= 0 && ret.size() < k; --i) else }}

}return ret;

}

前 K 個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...

前k個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...

前 K 個高頻元素

題目 給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。eg 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 eg 輸入 nums 1 k 1 輸出 1 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log n n...