单调栈我没有看透,当时没想到。其实单调栈问题的特点是很明显的。一般来说,单调栈问题需要在数学关系上进行分析,例如:我们需要找到一个非凹子序列,即我们需要找到两个子序列,一个在左边单调递增,一个在右边单调递减右边,所以用两个单调栈分别从左到右和从右到左预处理序列。非凹序列应该只有这三种类型的单调栈。一段时间后:遍历到i的时候,i总是会被压入栈中,并且始终保证从栈顶到栈底的降序。因此,在入栈之前,先从栈顶开始,将高于i(大于等于)的全部弹出。即,单调堆栈是一种预处理技术。用时间处理一个长度为的序列,你会得到该元素最近的比自己小的相邻元素/比自己大的元素/以这个元素结尾的递增或递减子序列的长度等等,这很神奇。按理说,想要得到这些信息,至少需要十、十个小时。拿一张动图和一个经典的例子来解释。我们有一个长度为5的序列:34275,我们想找到每个数字左边第一个比它本身小的数字。我们知道它们是:没有3没有22。如何设计算法让计算机自动找到这些数字呢?请看下面的动画。因此,我们可以总结其属性如下。例子:找左边最近的比自己小的数来源:AcWing在线题库[3]给定一个长度为N的整数序列,输出每个比它小的数左边第一个数,如果是不存在,输出?1。输入格式第一行包含整数N,表示序列的长度。第二行有N个整数,代表整数序列。输出格式一共一行,包括N个整数,其中第i个数表示第i个数左边第一个比它小的数,不存在则输出-1。分析:首先想到两层循环,暴力的方法;然后想着优化哪里(类似双指针的思想)注意一个属性,如果i
