monkeymonkey
2017-10-12 23:17:30 +08:00
LZ 的题目确实描述不清楚。
猜测是有一个空的大顶堆,按顺序插入一系列数字,最后形成一个堆(题目给出),求能够生成题目所给堆的数字插入顺序。
比如[27,12,18],
1. 先有空堆[]
2. 插入 12, 变成[12]
3. 插入 18,sift up 18,变成[18,12]
4. 插入 27,sift up 27,变成[27,12,18]
所以 12,18,27 是一个解
但是 18,12,27 也是一个解。
由此可知,解可能不唯一。
提供一个思路:
比如[45,24,27,2,16]
既然是最大堆,那我们从最顶上,也就是最大的数 45 开始,假设 45 是最后一个插入的数。
由 siftup 的性质可知,最后一个数从下往上走过的路径只能是 16->24->45.
把 45 与 24 交换,发现 24 比 27 小,大顶堆不成立,所以不是 45。
然后测试这条路上的 24,与 16 交换,并且从堆中移除,发现得到的新堆[45,16,27,2]是一个合格的大顶堆。
所以最后一个数是 24。
同理得到倒数第二个数是 16。
依次类推求出一个解,但是有可能只是其中一个解。