// 简易stack
type stack struct {
values []int
top int
}
func find132pattern(nums []int) bool {
/*
nums需满足索引:
i < j < k 时, ai < ak < aj
分析:
1. 有效性:若nums.length<3,一定不满足
2. 由最后一个元素开始进行判断:
首先寻找 j < k时, ak < aj的关系
可以想到通过栈结构来维护, 不断将 nums[i] 入栈,如果存在一个 ak<aj的关系,那么存储ak,再将aj入栈
*/
// 有效性判断
if len(nums) < 3 {
return false
}
// 初始化ak, stack
// ak初始 = min,只有当存在 之前出现的值 < 之后出现的值即 ak < aj时, 才给ak赋上元素值
ak, stack := math.MinInt32, stack{make([]int, len(nums)), -1}
// 循环判断
for i := len(nums) - 1; i >= 0; i-- {
// 往前遍历发现nums[i] < ak时,说明 存在 i < j < k, ai < ak < aj了
if nums[i] < ak {
return true
}
// 如果栈不为空, 且当前值>栈顶值,那么就说明 ak<aj存在了 栈里面的值是之前出现过的
// 循环给ak赋值,保证 ak是当前满足关系的 ak最大值
for stack.top > -1 && nums[i] > stack.values[stack.top]{
ak = stack.values[stack.top]
stack.top--
}
// 循环结束以后,将当前值作为 aj入栈
stack.top++
stack.values[stack.top] = nums[i]
}
// 如果遍历完不满足关系,那么返回false
return false
}