leetcode456, 查找123模式

960阅读 0评论2021-03-24 stolennnxb
分类:C/C++

今天这道每日一题使用单调队列有点绕,特此记录下

题意就是给一个数组,问,有没有3个下标i, j, k, 在满足 i < j < k 的情况下,a_i< a_k < a_j?
单调栈的解题思路就是用单调栈记录当前已经遍历过的最有可能的j的下标,另外记录一个a_k,满足a_k < a_j, 且k > j, 直到找到下标i为止,详情见代码:

点击(此处)折叠或打开

  1. class Solution {
  2. public:
  3. bool find132pattern(vector<int>& nums) {
  4.     int a_k = INT_MIN;
  5.     int n = nums.size();
  6.     stack<int> s;
  7.     for (int i = n-1; i >=0; --i) {
  8.         if (nums[i] >= a_k) {
  9.             // 当当前的下标>=a_k的时候,进到这个分支就是要更新j的值
  10.             while (!s.empty() && nums[s.top()] < nums[i]) {
  11.                 a_k = nums[s.top()];// 弹出a_k
  12.                 s.pop();
  13.             }
  14.             s.push(i); // 当前的下标比a_k的下标小,但是值比a_k大
  15.         } else {
  16.             return true;
  17.         }
  18.     }
  19.     return false;
  20. }
  21. };


上一篇:leetcode滑动窗口(239题)
下一篇:关于http协议格式