mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-28 22:51:54 +08:00
103 lines
2.3 KiB
Markdown
Executable File
103 lines
2.3 KiB
Markdown
Executable File
# [456. 132 Pattern](https://leetcode.com/problems/132-pattern/)
|
||
|
||
|
||
## 题目
|
||
|
||
Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence a**i**, a**j**, a**k** such that **i** < **j** < **k** and a**i** < a**k** < a**j**. Design an algorithm that takes a list of n numbers as input and checks whether there is a 132 pattern in the list.
|
||
|
||
**Note**: n will be less than 15,000.
|
||
|
||
**Example 1**:
|
||
|
||
Input: [1, 2, 3, 4]
|
||
|
||
Output: False
|
||
|
||
Explanation: There is no 132 pattern in the sequence.
|
||
|
||
**Example 2**:
|
||
|
||
Input: [3, 1, 4, 2]
|
||
|
||
Output: True
|
||
|
||
Explanation: There is a 132 pattern in the sequence: [1, 4, 2].
|
||
|
||
**Example 3**:
|
||
|
||
Input: [-1, 3, 2, 0]
|
||
|
||
Output: True
|
||
|
||
Explanation: There are three 132 patterns in the sequence: [-1, 3, 2], [-1, 3, 0] and [-1, 2, 0].
|
||
|
||
|
||
## 题目大意
|
||
|
||
|
||
给定一个整数序列:a1, a2, ..., an,一个 132 模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有 132 模式的子序列。注意:n 的值小于 15000。
|
||
|
||
|
||
## 解题思路
|
||
|
||
|
||
- 这一题用暴力解法一定超时
|
||
- 这一题算是单调栈的经典解法,可以考虑从数组末尾开始往前扫,维护一个递减序列
|
||
|
||
|
||
|
||
## 代码
|
||
|
||
```go
|
||
|
||
package leetcode
|
||
|
||
import (
|
||
"fmt"
|
||
"math"
|
||
)
|
||
|
||
// 解法一 单调栈
|
||
func find132pattern(nums []int) bool {
|
||
if len(nums) < 3 {
|
||
return false
|
||
}
|
||
num3, stack := math.MinInt64, []int{}
|
||
for i := len(nums) - 1; i >= 0; i-- {
|
||
if nums[i] < num3 {
|
||
return true
|
||
}
|
||
for len(stack) != 0 && nums[i] > stack[len(stack)-1] {
|
||
num3 = stack[len(stack)-1]
|
||
stack = stack[:len(stack)-1]
|
||
}
|
||
stack = append(stack, nums[i])
|
||
fmt.Printf("stack = %v \n", stack)
|
||
}
|
||
return false
|
||
}
|
||
|
||
// 解法二 暴力解法,超时!
|
||
func find132pattern1(nums []int) bool {
|
||
if len(nums) < 3 {
|
||
return false
|
||
}
|
||
for j := 0; j < len(nums); j++ {
|
||
stack := []int{}
|
||
for i := j; i < len(nums); i++ {
|
||
if len(stack) == 0 || (len(stack) > 0 && nums[i] > nums[stack[len(stack)-1]]) {
|
||
stack = append(stack, i)
|
||
} else if nums[i] < nums[stack[len(stack)-1]] {
|
||
index := len(stack) - 1
|
||
for ; index >= 0; index-- {
|
||
if nums[stack[index]] < nums[i] {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
``` |