列表

详情


NC384. 132序列

描述

给定一个长度为 n 的整数数组 nums ,请问其中是否存在满足 132 排列的子序列。
132排列的子序列指数组中存在 满足 1 \le i \lt j \lt k \le len(nums) \ ,且 nums_k \lt nums_j , nums_i \lt nums_k\

数据范围: ,数组中的数满足

示例1

输入:

[1,2,3,2,1]

输出:

true

示例2

输入:

[82,78,12,42,65]

输出:

false

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 32ms, 内存消耗: 4208KB, 提交时间: 2022-07-09

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return bool布尔型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
#include <stdbool.h>
#include <limits.h>

int stack[100000];
int top = -1;
bool find132Subseq(int* nums, int numsLen ) {
    int i, min;
    int t = INT_MIN;
    for (i = numsLen - 1; i >= 0; i--) {
        if (nums[i] < t) {
            return true;
        }
        while (top != -1 && stack[top] < nums[i]) {
            t = stack[top--];
        }
        stack[++top] = nums[i];
    }
    return false;
}


// bool find132Subseq(int* nums, int numsLen ) {
//     int t = 0;
//     int stack[100000], sTop = 0;
//     for (int i = numsLen - 1; i >= 0; i--) {
//         if (nums[i] < t) {
//             return true;
//         }
//         while ((sTop != 0) && (nums[i] > stack[sTop - 1])) {
//             t = stack[sTop-1];
//             sTop--;
//         }
//         stack[sTop++] = nums[i];
//     }
    
//     return false;
// }




C++ 解法, 执行用时: 32ms, 内存消耗: 4336KB, 提交时间: 2022-08-02

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool find132Subseq(vector<int>& nums) {
        // write code here
      int n = nums.size();
      stack<int> stk;
      int k = INT_MIN; // 记录 2
      // 枚举 1
      for (int i = n - 1; i >= 0; i --)
      {
        int a = nums[i]; // 1
        if (a < k) return true; // 1 < 2
        // stk.top() 是 3
        while(stk.size() && stk.top() < a) {
          k = max(k, stk.top()); // 2 尽可能取最大
          stk.pop();
        }
       // 作为 3 入栈
        stk.push(a);
      }
      return false;
    }
};

C++ 解法, 执行用时: 34ms, 内存消耗: 4224KB, 提交时间: 2022-05-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool find132Subseq(vector<int>& nums) {
        // write code here
        int n = nums.size();
        if(n<3) return false;
        vector<int> lMin(n);
        stack<int> stk;
        lMin[0] = nums[0];
        for(int i=1; i<n; i++)
            lMin[i] = min(lMin[i-1], nums[i]);
        for(int i=n-1; i>=0; i--)
        {
            if(nums[i] == lMin[i])
                continue;
            while(!stk.empty() && stk.top()<=lMin[i])
                stk.pop();
            if(!stk.empty() && stk.top()<nums[i])
                return true;
            stk.push(nums[i]);
        }
        return false;
    }
};

C++ 解法, 执行用时: 34ms, 内存消耗: 4420KB, 提交时间: 2022-07-02

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool find132Subseq(vector<int>& nums) {
        // write code here
        stack<int> st;
        st.push(nums[0]);
        for(int i=1;i<nums.size();i++)
        {
            int ctl=-1;
            while(!st.empty()&&(st.top()>nums[i]))
            {
                if(st.size()>=2)
                {
                    ctl=0;
                }
                st.pop();
            }
            if(!st.empty())
            {
                ctl++;
            }
            if(ctl==1)
            {
                return true;
            }
            st.push(nums[i]);
        }
        return false;
    }
};

C 解法, 执行用时: 36ms, 内存消耗: 4216KB, 提交时间: 2022-05-23

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return bool布尔型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
#include<limits.h>
int stack[100000];
int top=-1;
bool find132Subseq(int* nums, int numsLen ) {
    // write code here
    int i,min;
    int t=INT_MIN;
    for(i=numsLen-1;i>=0;i--)
    {
         if(nums[i]<t)
             return true;
        while(top!=-1&&stack[top]<nums[i])
            t=stack[top--];
        stack[++top]=nums[i];
    }
    return false;
}
   
        

上一题