一个图案化阵列给定一个整数数组P [1..N],我们要建立一个数组S [1..N]:在P [1创建以线性时间
其中成员。 .i-1]大于P [i],我们选择具有最大指数的P [k](1 < = k < i < = n)。 S [i]将保持P [k]的值。如果在P [1..i-1]中没有大于P [i]的数字,我们在S [i]中放置0。
显然,S []中的第一个元素将为0,因为之前没有元素。其他可以通过数组P []迭代找到,但是,这将需要O(n^2)
,因为它是系列1+2+...+n=[1/2n(n+1)]
的总和。
有没有办法在线性时间做到这一点?我曾考虑过使用堆栈,因为它有助于以更大的值提取最高索引,但是,我尝试实现它的任何方式仍然需要我通过创建的堆栈,所以实际上更糟 - 时间到创建堆栈,并弹出时间,直到达到所需的元素,一遍又一遍。也许还有另一种方式?
任何想法/建议/提示如何做到这一点?
实例:
P[5,4,9,7,8]-->S[0,5,0,9,9]
P[1,5,2,3]-->S[0,0,5,5]
澄清:
我们应该分配给S [I]的最高索引数目,仍然大于P [i]于P [1。 .I-1]。例如,假设P [8,2,1]。虽然8是最大的值,S [3]将保持值2,因为它是最高的索引号,仍然大于P [3]。 - > S [0,8,2]。
编辑:
我相信我有一个O(n)的溶液中,使用堆栈。在伪代码中的想法:
BuildS(P[])
Temp-StackNIL
for(i<--1 up to n)
while(Temp-Stack≠NIL)
if(P[i]<=top[Temp-Stack])
pop(Temp-Stack) //goes back to while
else
S[i]<--top[Temp-Stack]
push(Temp-Stack,P[i]) //goes back to for
S[i]<--0 //out of while
push(Temp-Stack,P[i]) //goes back to for
我说得对吗?
@ user3386109是不是在这种情况下解决了以前的问题?对我来说不像是一个骗局。 – axelduch
我已经浏览过其他问题 - 我将编辑我的问题以进一步阐明它为什么不重复。 @ user3386109 – Studentmath
这个问题和其他问题的唯一区别在于你从数组的最后***开始迭代到开始。 – user3386109