239. 滑动窗口最大值
主要思路:用队列维护滑动窗口,使队列内的值是递减序列,这样出口处的值就是最大值
关键点在注释的两个地方
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
deque<int> window;
vector<int> vec;
for (int i = 0; i < n; i++)
{
// 保证队列出口是最大值
while (!window.empty() && nums[i] > window.back())
window.pop_back();
window.push_back(nums[i]);
if (i > k - 2)
{
int tmp = window.front();
vec.push_back(tmp);
// 判断窗口是否到了需要滑动的位置
if (!window.empty() && window.front() == nums[i - k + 1])
window.pop_front();
}
}
return vec;
}
347. 前 K 个高频元素
可以用堆排序,也可以考虑桶排序
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> counts;
int max_count = 0; //出现的最大次数
for (auto num : nums){
max_count = max(++counts[num], max_count);
}
vector<vector< >> buckets(max_count + 1);
for (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 (int num : buckets[i]){
ans.push_back(num);
if (ans.size() == k)
break;
}
}
return ans;