1. 程式人生 > 其它 >347. 前 K 個高頻元素(桶排序、堆排序)

347. 前 K 個高頻元素(桶排序、堆排序)

給你一個整數陣列 nums 和一個整數 k ,請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]
示例 2:

輸入: nums = [1], k = 1
輸出: [1]

提示:

1 <= nums.length <= 105
k 的取值範圍是 [1, 陣列中不相同的元素的個數]
題目資料保證答案唯一,換句話說,陣列中前 k 個高頻元素的集合是唯一的

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/top-k-frequent-elements
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

顧名思義,桶排序的意思是為每個值設立一個桶,桶內記錄這個值出現的次數(或其它屬 性),然後對桶進行排序。針對樣例來說,我們先通過桶排序得到三個桶 [1,2,3,4],它們的值分別 為 [4,2,1,1],表示每個數字出現的次數。5.4 練習 – 23/143 – 緊接著,我們對桶的頻次進行排序,前 k 大個桶即是前 k 個頻繁的數。這裡我們可以使用各種 排序演算法,甚至可以再進行一次桶排序,把每個舊桶根據頻次放在不同的新桶內。針對樣例來說, 因為目前最大的頻次是 4,我們建立 [1,2,3,4] 四個新桶,它們分別放入的舊桶為 [[3,4],[2],[],[1]], 表示不同數字出現的頻率。最後,我們從後往前遍歷,直到找到 k 箇舊桶。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
	unordered_map<int, int> counts;
	int max_count = 0;
	for (const int & num : nums) {
	max_count = max(max_count, ++counts[num]);
	}
	vector<vector<int>> buckets(max_count + 1);
	for (const auto & p : counts) {
	buckets[p.second].push_back(p.first);
	}
	vector<int> ans;
	for (int i = max_count; i >= 0 && ans.size() < k; --i) {
		for (const int & num : buckets[i]) {
			ans.push_back(num);
			if (ans.size() == k) {
				break;
			}
		}
	}
	return ans;
    }
};