239.滑动窗口最大值
代码如下:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
deque<int> dq; // 双端队列,存储元素的索引
for (int i = 0; i < nums.size(); i++) {
// 移除窗口外的元素
while (!dq.empty() && dq.front() < i - k + 1) {
dq.pop_front();
}
// 移除队列尾部小于当前元素的元素,以确保队列头部始终是最大的
while (!dq.empty() && nums[i] >= nums[dq.back()]) {
dq.pop_back();
}
// 将当前元素的索引加入双端队列
dq.push_back(i);
// 窗口已经形成
if (i >= k - 1) {
ans.push_back(nums[dq.front()]);
}
}
return ans;
}
};
完整代码如下:
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
deque<int> dq; // 双端队列,存储元素的索引
for (int i = 0; i < nums.size(); i++) {
// 移除窗口外的元素
while (!dq.empty() && dq.front() < i - k + 1) {
dq.pop_front();
}
// 移除队列尾部小于当前元素的元素,以确保队列头部始终是最大的
while (!dq.empty() && nums[i] >= nums[dq.back()]) {
dq.pop_back();
}
// 将当前元素的索引加入双端队列
dq.push_back(i);
// 窗口已经形成
if (i >= k - 1) {
ans.push_back(nums[dq.front()]);
}
}
return ans;
}
};
int main() {
vector<int> nums;
nums.push_back(1);
nums.push_back(3);
nums.push_back(-1);
// nums.push_back(3);
// nums.push_back(5);
// nums.push_back(3);
// nums.push_back(6);
// nums.push_back(7);
Solution sol;
vector<int> ans = sol.maxSlidingWindow(nums, 1);
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << " ";
}
cout << endl;
deque<int> d;
d.push_back(1);
d.push_front(2);
int i = d.front();
cout << i << endl;
}
347.前K个高频元素
代码如下:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> frequency; // 用来统计每个数字出现的频率
vector<int> result; // 用来存储结果
// 统计每个数字出现的频率
for (int num : nums) {
frequency[num]++;
}
// 创建一个最小堆(优先队列),按照频率从小到大排序
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minHeap;
// 遍历频率哈希表
for (auto& entry : frequency) {
minHeap.push({entry.second, entry.first});
// 如果堆的大小超过 k,弹出最小频率的元素
if (minHeap.size() > k) {
minHeap.pop();
}
}
// 将堆中的元素(即频率最高的 k 个元素)添加到结果中
while (!minHeap.empty()) {
result.push_back(minHeap.top().second);
minHeap.pop();
}
// 结果是逆序的,需要反转一下
reverse(result.begin(), result.end());
return result;
}
};
完整代码如下:
#include <iostream>
#include <vector>
#include <unordered_map>
#include <priority_queue>
using namespace std;
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> frequency; // 用来统计每个数字出现的频率
vector<int> result; // 用来存储结果
// 统计每个数字出现的频率
for (int num : nums) {
frequency[num]++;
}
// 创建一个最小堆(优先队列),按照频率从小到大排序
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minHeap;
// 遍历频率哈希表
for (auto& entry : frequency) {
minHeap.push({entry.second, entry.first});
// 如果堆的大小超过 k,弹出最小频率的元素
if (minHeap.size() > k) {
minHeap.pop();
}
}
// 将堆中的元素(即频率最高的 k 个元素)添加到结果中
while (!minHeap.empty()) {
result.push_back(minHeap.top().second);
minHeap.pop();
}
// 结果是逆序的,需要反转一下
reverse(result.begin(), result.end());
return result;
}
};
int main() {
return 0;
}
今毕。