为了不让实习生下班走,故意每晚9:30开会

据网友爆料,京东某组为了不让实习生下班走,leader特意安排了一个会,每晚9:30开会。就是因为觉得大家下班太早了,所以才故意这么安排的,并且只能线下参加。

这leader也是够无耻的,想加班自己加就好的,非要拉着大家一起加。想开会早上也有大把时间,非要等到9:30之后,开完会估计也10点多了,回去洗洗估计都11点多了。

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第456题:132 模式,难度是中等。

给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。

如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false 。

示例1:

输入:nums = [1,2,3,4]

输出:false

解释:序列中不存在 132 模式的子序列。

示例2:

输入:nums = [3,1,4,2]

输出:true

解释:序列中有 1 个 132 模式的子序列: [1, 4, 2] 。

  • n == nums.length

  • 1 <= n <= 2 * 10^5

  • -10^9 <= nums[i] <= 10^9

问题分析

这题让判断数组中是否存在132模式的子序列,所谓的132模式,就是在一个含有3个元素的子序列中,第一个元素小于最后一个元素,最后一个小于中间的元素。

这题我们还可以使用单调栈来解决,从栈底到栈顶是单调递减的。在使用单调栈之前,我们首先使用一个数组leftMin来记录每一个元素左边最小的值。

然后再从右往左遍历数组,如果当前元素小于等于栈顶元素,就让当前元素入栈。如果当前元素大于栈顶元素,说明当前元素类似于 “3” ,我们通过while循环在栈中找到最大的 “2”,然后在通过数组leftMin判断前面是否有 “1” 即可。

JAVA:

// 从后往前遍历,找到32之后,在判断前面是否有1,这样就可以判断132
public boolean find132pattern(int[] nums) {
    int n = nums.length;
    // 初始化一个数组来存储每个位置左侧的最小值
    int[] leftMin = newint[n];
    leftMin[0] = Integer.MAX_VALUE;
    // leftMin[i]表示数组nums[i]左边的最小值。
    for (int i = 1; i < n; i++)
        leftMin[i] = Math.min(leftMin[i - 1], nums[i - 1]);

    Stack<Integer> stk = new Stack<>();
    // 单调栈,从栈底到栈顶是递减的,也就是数组从右到左降序存放到栈中。
    for (int i = n - 1; i >= 0; i--) {
        int numsk = Integer.MIN_VALUE;
        while (!stk.isEmpty() && stk.peek() < nums[i])
            numsk = stk.pop();
        // 如果上面的while循环能执行,说明遇到了 3 ,也就是当前数字nums[i],
        // 出栈的就是 2 ,然后判断 2 前面是否有 1 。
        if (leftMin[i] < numsk)// 132
            returntrue;
        // 将当前元素压入栈中
        stk.push(nums[i]);
    }
    returnfalse;
}

C++:

// 从后往前遍历,找到32之后,在判断前面是否有1,这样就可以判断132
public:
    bool find132pattern(vector<int> &nums) {
        int n = nums.size();
        // 初始化一个数组来存储每个位置左侧的最小值
        vector<int> leftMin(n, 0);
        leftMin[0] = INT_MAX;
        // leftMin[i]表示数组nums[i]左边的最小值。
        for (int i = 1; i < n; i++)
            leftMin[i] = min(leftMin[i - 1], nums[i - 1]);

        stack<int> stk;
        // 单调栈,从栈底到栈顶是递减的,也就是数组从右到左降序存放到栈中。
        for (int i = n - 1; i >= 0; i--) {
            int numsk = INT_MIN;
            while (!stk.empty() && stk.top() < nums[i]) {
                numsk = stk.top();
                stk.pop();
            }
            // 如果上面的while循环能执行,说明遇到了 3 ,也就是当前数字nums[i],
            // 出栈的就是 2 ,然后判断 2 前面是否有 1 。
            if (leftMin[i] < numsk)// 132
                returntrue;
            // 将当前元素压入栈中
            stk.push(nums[i]);
        }
        returnfalse;
    }

给大家推荐一下我自己的网站,上面不仅有各种技术文章和学习教程,还提供了程序员学习需要的各种资料书籍下载,

大家可以点击左下角【阅读原文】去看一下~

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值