代码随想录算法训练营第十二天|150.逆波兰表达式求值、239.滑动窗口最大值、347.前k个高频元素

这三道题倒是有点意思的

150题还好 就是读元素 然后进行相应的操作

复制代码
 1 class Solution {
 2 public:
 3     int evalRPN(vector<string>& tokens) {
 4         vector<int>Stack;
 5         int tmp;
 6         for(int i=0;i<tokens.size();i++){
 7             if(tokens[i] =="+"){
 8                 tmp = Stack[Stack.size()-2]+Stack[Stack.size()-1];
 9                 Stack.pop_back();
10                 Stack.pop_back();
11                 Stack.push_back(tmp);
12             }
13             else  if(tokens[i] =="-"){
14                 tmp = Stack[Stack.size()-2]-Stack[Stack.size()-1];
15                 Stack.pop_back();
16                 Stack.pop_back();
17                 Stack.push_back(tmp);
18             }
19             else  if(tokens[i] =="*"){
20                 tmp = Stack[Stack.size()-2]*Stack[Stack.size()-1];
21                 Stack.pop_back();
22                 Stack.pop_back();
23                 Stack.push_back(tmp);
24             }
25             else  if(tokens[i] =="/"){
26                 tmp = Stack[Stack.size()-2]/Stack[Stack.size()-1];
27                 Stack.pop_back();
28                 Stack.pop_back();
29                 Stack.push_back(tmp);
30             }
31             else{
32                 Stack.push_back(stoi(tokens[i]));
33             }
34         }
35         return Stack.back();
36     }
37 };
复制代码

239滑动窗口我一开始理解错题目了,以为是求滑动窗口的和的最大值,就离谱,然后琢磨半天用单调队列处理。

复制代码
 1 class Solution {
 2 public:
 3     vector<int> maxSlidingWindow(vector<int>& nums, int k) {
 4         deque<int> dq; // 双端队列,用于存储窗口内元素的索引
 5         vector<int> result; // 存储每个窗口的最大值
 6 
 7         // 处理初始的第一个窗口
 8         for (int i = 0; i < k; ++i) {
 9             // 对滑入的元素进行入队操作,保持队列单调递减
10             while (!dq.empty() && nums[dq.back()] < nums[i]) {
11                 dq.pop_back(); // 移除所有小于当前元素的元素
12             }
13             dq.push_back(i); // 将当前元素的索引加入队列
14         }
15         result.push_back(nums[dq.front()]); // 第一个窗口的最大值
16 
17         // 处理剩余的元素
18         for (int i = k; i < nums.size(); ++i) {
19             // 移除滑出窗口的元素
20             if (!dq.empty() && dq.front() == i - k) {
21                 dq.pop_front();
22             }
23 
24             // 对滑入的元素进行入队操作,保持队列单调递减
25             while (!dq.empty() && nums[dq.back()] < nums[i]) {
26                 dq.pop_back();
27             }
28             dq.push_back(i); // 将当前元素的索引加入队列
29 
30             // 当前窗口的最大值
31             result.push_back(nums[dq.front()]);
32         }
33 
34         return result;
35     }
36 };
复制代码

347题只会写呆方法,哈希再排序,堆是真不会。

复制代码
 1 class Solution {
 2 public:
 3     vector<int> topKFrequent(vector<int>& nums, int k) {
 4     // 哈希表记录每个元素的出现次数
 5     unordered_map<int, int> frequencyMap;
 6     for (int num : nums) {
 7         frequencyMap[num]++;
 8     }
 9 
10     // 将哈希表中的元素转存到一个vector中进行排序
11     vector<pair<int, int>> freqVec(frequencyMap.begin(), frequencyMap.end());
12 
13     // 按照出现次数从大到小进行排序
14     sort(freqVec.begin(), freqVec.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
15         return a.second > b.second;
16     });
17 
18     // 输出前k个高频元素
19     vector<int> result;
20     for (int i = 0; i < k; ++i) {
21         result.push_back(freqVec[i].first);
22     }
23 
24     return result;
25     }
26 };
复制代码

 

posted @   清源风起时  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示