题目
在学校里,一群小朋友排成一排,每个小朋友都有自己的身高。每个小朋友都想知道自己前面第一个比自己高的小朋友是谁,这个小朋友就是他的“大朋友”。
现在,请写一个程序,根据每个小朋友的身高,生成一个列表。列表中每个位置代表每个小朋友的“大朋友”位置,如果没有找到“大朋友”,则用0表示。
输入描述:
第一行包含一个整数N,表示小朋友的数量。
第二行包含N个整数,表示每个小朋友的身高。
输出描述:
输出N个整数,表示每个小朋友的“大朋友”位置。
示例:
输入:
2
100 95
输出:
0 0
说明:
第一个小朋友的身高是100,站在队尾,没有比他身高更高的小朋友,因此输出第一个值为0。
第二个小朋友站在队首,也没有比他身高更高的小朋友,所以输出第二个值为0。
输入:
8
123 124 125 121 119 122 126 123
输出:
1 2 6 5 5 6 0 0
说明:
123的“大朋友”是1号位置上的124。
124的“大朋友”是2号位置上的125。
125的“大朋友”是6号位置上的126。
解题思路
可以采用单调递减栈的方法来解决这个问题。在遍历小朋友的身高时,我们维护一个单调递减的栈,如果当前小朋友的身高大于栈顶小朋友的身高,我们将栈顶小朋友出栈并记录其好朋友的位置。最后,栈中剩余的小朋友就是没有好朋友的小朋友