Leetcode每日一题-456.132模式

// 简易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
}
posted @ 2021-03-24 10:25  blog_zhangtong  阅读(28)  评论(0)    收藏  举报