首页 > 试题广场 >

132序列

[编程题]132序列
  • 热度指数:506 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 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
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;
    }
};
发表于 2022-07-01 12:11:06 回复(0)
public boolean find132Subseq (ArrayList<Integer> arr) {
        // write code here
        Integer[] nums = arr.toArray(new Integer[0]);
        int min = nums[0];
        int max = nums[1]>nums[0]?nums[1]:nums[0];
        for(int i=2;i<nums.length;i++){
            if(nums[i]>min&&nums[i]<max){
                return true;
            } else if(nums[i]>min){
                max=Math.max(max,nums[i]);
            } else if(nums[i]<min){
                min=Math.min(min,nums[i]);
                max=min;
            }
            
        }
        return false;
        
    }

发表于 2022-06-30 17:44:05 回复(0)
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return bool布尔型
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/eae8142169a74ad7884bb5dca3264128?tpId=196&tqId=40515&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D8%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=&title=
    算法:
        132序列:i < j < k 且 nums[i] < nums[k] < nums[j],这里我们借助单调不减栈stack,存储元素的下标,使用flag表示是否存在逆序对
        遍历nums:
            若栈不空 且 存在逆序对:
                flag置为True,弹出栈顶
            若找到逆序对:
                将stack中对应元素与nums[i]相等的下标,全部弹出
                若此时stack仍存在元素,说明满足132序列;否则重置flag=False
        遍历结束,返回False
    复杂度:
        时间复杂度:O(n)
        空间复杂度:O(n)
    """

    def find132Subseq(self, nums):
        # write code here
        n = len(nums)
        stack, flag = [], False

        for i in range(n):
            while stack and nums[stack[-1]] > nums[i]: # 找到逆序对nums[k] < nums[j],需要再判断是否满足nums[i] < nums[k]
                flag = True # flag表示是否找到逆序对
                stack.pop()
            if flag:
                while stack and nums[stack[-1]] == nums[i]: # 比如[1, 2, 1]不合符条件
                    stack.pop()
                if stack: # [2, 3, 1]
                    return True
                else: # 比如[3, 2, 1],属于无效逆序对,重置flag = False
                    flag = False
            stack.append(i)

        return False


if __name__ == "__main__":
    sol = Solution()

    # nums = [1, 2, 3, 2, 1]

    # nums = [82, 78, 12, 42, 65]

    # nums = [2, 2, 2, 2]

    nums = [1, 2, 1]

    res = sol.find132Subseq(nums)

    print res

发表于 2022-06-27 14:11:57 回复(0)

问题信息

难度:
3条回答 1633浏览

热门推荐

通过挑战的用户

查看代码