① 往下搜尋前:先看現在是不是答案 / 到底了
① 往下搜尋
③ 左右合併判斷
碰到 p/q
↑ return
左找 右找
↖ ↗
都有?
↓
有 → 回 node
沒有 → 回有找到的那邊
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) { // 找出出現次數最高的 k 個數字
unordered_map<int, int> count; // num → 出現次數
count.reserve(nums.size()); // 預留空間,減少重新配置
for (int num : nums) // 一個一個看 nums
++count[num]; // num 每出現一次就 +1
vector<vector<int>> bucket(nums.size() + 1); // index = 出現次數
for (auto& [num, freq] : count) // 看每個 num 和它的頻率
bucket[freq].push_back(num); // 把 num 放進對應頻率的 bucket
vector<int> answer; // 最後答案
answer.reserve(k); // 答案一定只需要 k 個
for (int freq = nums.size(); freq >= 1; --freq) { // 從最高頻率往下找
for (int num : bucket[freq]) { // 看這個頻率有哪些數字
answer.push_back(num); // 放進答案
if (answer.size() == k) // 已經找到 k 個
return answer; // 直接結束,不再往下掃
}
}
return answer; // 題目保證有答案
}
};