给n个数,连续n个数的长度为n,连续n个数里有一个最小的值,ans[n]就是所有长度为n的连续数产生的最小值中的最大的
输出ans1到ansn,即长度为1,2,3,4,5,。。。。。n的最大的值
思路:首先对每一个数a[i],找到它一左一右第一个比他小的数。设为l,r.
可以用栈o(N)求出。
那么在长度len=r-l-1 这些数中a[i]是最小的,于是ans[len]=max(ans[len],a[i])
最后ans保证左边的比右边大,更新一下
代码:http://paste.ubuntu.com/11520736/
PS:
给n个数,l[i]表示第i个数左侧离它最近的比他小的数的位置
怎么用o(n)的方法来求数组l
怎么用o(n)的方法来求数组l
stack s // initially empty
for i = 1 to n
while s is not empty and a[s.top()] >= a[i]
do s.pop()
if s is empty
then l[i] = 0
otherwise
l[i] = s.top()
s.push(i)