代码随想录算法训练营第十二天|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 };
自在飞花轻似梦

浙公网安备 33010602011771号