程式碼隨想錄演算法訓練營第十二天|150.逆波蘭表示式求值、239.滑動視窗最大值、347.前k個高頻元素

清源风起时發表於2024-07-04

這三道題倒是有點意思的

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 };

相關文章