训练题:滑动窗口最大值

题目:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/

思路:k个数里的最大值,首先想到堆,不过搞半天没出路,转移到考虑队列的数据结构。
max队列,快速获取当前队列的最大值。

  • 时间复杂度:O(n)
  • 空间复杂度:考虑返回值:O(n);不考虑返回值O(k)。
  1. class MaxQueue {
  2. public:
  3. MaxQueue() {
  4. }
  5. int max_value() {
  6. if(maxQueue.empty()) return -1;
  7. return maxQueue.front();
  8. }
  9. void push(int value) {
  10. dataQueue.push(value);
  11. for(; !maxQueue.empty() && maxQueue.back() < value; maxQueue.pop_back());
  12. maxQueue.push_back(value);
  13. }
  14. int pop() {
  15. if(dataQueue.empty()) return -1;
  16. int ret = dataQueue.front();
  17. dataQueue.pop();
  18. if(maxQueue.front() == ret) maxQueue.pop_front();
  19. return ret;
  20. }
  21. private:
  22. queue<int> dataQueue;
  23. deque<int> maxQueue;
  24. };
  25. class Solution {
  26. public:
  27. vector<int> maxSlidingWindow(vector<int>& nums, int k) {
  28. if(k > nums.size() || nums.empty()) return {};
  29. const auto size = nums.size();
  30. vector<int> ret;
  31. MaxQueue q;
  32. int idx;
  33. for(idx = 0; idx < k; ++idx) q.push(nums[idx]);
  34. ret.push_back(q.max_value());
  35. for(; idx < size; ++idx){
  36. q.push(nums[idx]);
  37. q.pop();
  38. ret.push_back(q.max_value());
  39. }
  40. return ret;
  41. }
  42. };

训练题:max队列

题目:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/

  1. class MaxQueue {
  2. public:
  3. MaxQueue() {
  4. }
  5. int max_value() {
  6. if(maxQueue.empty()) return -1;
  7. return maxQueue.front();
  8. }
  9. void push_back(int value) {
  10. dataQueue.push(value);
  11. for(; !maxQueue.empty() && maxQueue.back() < value; maxQueue.pop_back());
  12. maxQueue.push_back(value);
  13. }
  14. int pop_front() {
  15. if(dataQueue.empty()) return -1;
  16. int ret = dataQueue.front();
  17. dataQueue.pop();
  18. if(maxQueue.front() == ret) maxQueue.pop_front();
  19. return ret;
  20. }
  21. private:
  22. queue<int> dataQueue;
  23. deque<int> maxQueue;
  24. };

训练题:min栈

题目:http://t.cn/A6VtAJtX

  1. class MinStack {
  2. public:
  3. /** initialize your data structure here. */
  4. MinStack() {
  5. }
  6. void push(int x) {
  7. stk.push(x);
  8. // 如果minStk栈顶的最小值没比待插入的x更小,那就要更新最小值了。
  9. if(minStk.empty() || x <= minStk.top()) minStk.push(x);
  10. }
  11. void pop() {
  12. if(stk.empty()) return;
  13. if(stk.top() == minStk.top()) minStk.pop();
  14. stk.pop();
  15. }
  16. int top() {
  17. return stk.top();
  18. }
  19. int min() {
  20. return minStk.top();
  21. }
  22. private:
  23. stack<int> minStk;
  24. stack<int> stk;
  25. };

训练题:压栈/弹栈序列

题目:http://t.cn/A6qva3VL

方法一

  1. bool validateStackSequences( vector<int> &pushed, vector<int> &popped )
  2. {
  3. if( pushed.size() != popped.size() ) { return false; }
  4. stack<int> stk;
  5. int popIdx = 0;
  6. for( const auto &i : pushed )
  7. {
  8. stk.push( i );
  9. while( !stk.empty() && stk.top() == popped[popIdx] )
  10. {
  11. stk.pop();
  12. ++popIdx;
  13. }
  14. }
  15. return stk.empty();
  16. }

方法二:模拟法

  1. bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
  2. if(pushed.size() != popped.size()) return false;
  3. const auto size_push = pushed.size();
  4. const auto size_pop = popped.size();
  5. stack<int> s;
  6. int popIdx = 0;
  7. for(int pushIdx = 0; popIdx < size_pop;)
  8. {
  9. for(; (s.empty() || s.top() != popped[popIdx]) && pushIdx < size_push; ++pushIdx )
  10. s.push(pushed[pushIdx]);
  11. if(!s.empty() && s.top() == popped[popIdx]){
  12. s.pop();
  13. ++popIdx;
  14. }
  15. else if(pushIdx == size_push) return false;
  16. }
  17. return popIdx == size_pop;
  18. }

训练题:两个栈实现队列

题目:http://t.cn/A6yvWVAG

  1. class CQueue
  2. {
  3. public:
  4. CQueue()
  5. {
  6. }
  7. void appendTail( int value )
  8. {
  9. stack1.push( value );
  10. }
  11. int deleteHead()
  12. {
  13. if( stack2.empty() ) for( ; !stack1.empty(); stack1.pop() ) { stack2.push( stack1.top() ); }
  14. int ret = -1;
  15. if( !stack2.empty() )
  16. {
  17. ret = stack2.top();
  18. stack2.pop();
  19. }
  20. return ret;
  21. }
  22. private:
  23. stack<int> stack1;
  24. stack<int> stack2;
  25. };