LeetCode 456: 132 Pattern (Monotonic Stack)
LeetCode 456Source: https://leetcode.com/problems/132-pattern/
English
Scan from right to left. Maintain a decreasing stack as candidates for "3". Also track mid, the best candidate for "2" popped from stack. If current number is smaller than mid, we found nums[i] < mid < someRight, so a 132 pattern exists.
class Solution {
public boolean find132pattern(int[] nums) {
int mid = Integer.MIN_VALUE;
Deque<Integer> st = new ArrayDeque<>();
for (int i = nums.length - 1; i >= 0; i--) {
if (nums[i] < mid) return true;
while (!st.isEmpty() && nums[i] > st.peek()) {
mid = st.pop();
}
st.push(nums[i]);
}
return false;
}
}func find132pattern(nums []int) bool {
mid := -(1 << 60)
st := []int{}
for i := len(nums) - 1; i >= 0; i-- {
if nums[i] < mid {
return true
}
for len(st) > 0 && nums[i] > st[len(st)-1] {
mid = st[len(st)-1]
st = st[:len(st)-1]
}
st = append(st, nums[i])
}
return false
}class Solution {
public:
bool find132pattern(vector<int>& nums) {
int mid = INT_MIN;
vector<int> st;
for (int i = (int)nums.size() - 1; i >= 0; --i) {
if (nums[i] < mid) return true;
while (!st.empty() && nums[i] > st.back()) {
mid = st.back();
st.pop_back();
}
st.push_back(nums[i]);
}
return false;
}
};class Solution:
def find132pattern(self, nums: List[int]) -> bool:
mid = float('-inf')
st = []
for x in reversed(nums):
if x < mid:
return True
while st and x > st[-1]:
mid = st.pop()
st.append(x)
return Falsevar find132pattern = function(nums) {
let mid = -Infinity;
const st = [];
for (let i = nums.length - 1; i >= 0; i--) {
if (nums[i] < mid) return true;
while (st.length && nums[i] > st[st.length - 1]) {
mid = st.pop();
}
st.push(nums[i]);
}
return false;
};中文
从右往左扫描,维护一个单调递减栈作为“3”的候选;同时维护 mid 作为已弹出的“2”候选最大值。若当前值 nums[i] < mid,就找到了 nums[i] < mid < 右侧某个值,存在 132 模式。
class Solution {
public boolean find132pattern(int[] nums) {
int mid = Integer.MIN_VALUE;
Deque<Integer> st = new ArrayDeque<>();
for (int i = nums.length - 1; i >= 0; i--) {
if (nums[i] < mid) return true;
while (!st.isEmpty() && nums[i] > st.peek()) {
mid = st.pop();
}
st.push(nums[i]);
}
return false;
}
}func find132pattern(nums []int) bool {
mid := -(1 << 60)
st := []int{}
for i := len(nums) - 1; i >= 0; i-- {
if nums[i] < mid {
return true
}
for len(st) > 0 && nums[i] > st[len(st)-1] {
mid = st[len(st)-1]
st = st[:len(st)-1]
}
st = append(st, nums[i])
}
return false
}class Solution {
public:
bool find132pattern(vector<int>& nums) {
int mid = INT_MIN;
vector<int> st;
for (int i = (int)nums.size() - 1; i >= 0; --i) {
if (nums[i] < mid) return true;
while (!st.empty() && nums[i] > st.back()) {
mid = st.back();
st.pop_back();
}
st.push_back(nums[i]);
}
return false;
}
};class Solution:
def find132pattern(self, nums: List[int]) -> bool:
mid = float('-inf')
st = []
for x in reversed(nums):
if x < mid:
return True
while st and x > st[-1]:
mid = st.pop()
st.append(x)
return Falsevar find132pattern = function(nums) {
let mid = -Infinity;
const st = [];
for (let i = nums.length - 1; i >= 0; i--) {
if (nums[i] < mid) return true;
while (st.length && nums[i] > st[st.length - 1]) {
mid = st.pop();
}
st.push(nums[i]);
}
return false;
};
Comments