据网友爆料,京东某组为了不让实习生下班走,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;
}给大家推荐一下我自己的网站,上面不仅有各种技术文章和学习教程,还提供了程序员学习需要的各种资料书籍下载,
大家可以点击左下角【阅读原文】去看一下~

875

被折叠的 条评论
为什么被折叠?



