你得到两个数组,第一个数组包含代表人物高度的整数,第二个数组包含他面前有多少人站在身高高度并形成队列的位置。
实施例 -
A:3 2 1
B:0 1 1
这意味着在身高3的人面前没有人站立,身高2的人在他面前有一个人身高更高的他,类似于身高1的人。你的任务安排他们输出应该。 3 1 2
我的方法
1.根据人的频率(较高的人数)对人进行分类。
2.现在将每个人的位置固定在适当的位置。例如:
3 1 2 4
0 2 1 0
排序后
3 4 2 1
0 0 1 2
现在我们看到第一个和第二个人在正确的位置,所以我们将第三个人移动到第二个位置(基准指数1),因为他在他之前只有一个更高的位置。
3 2 4 1
0 1 0 2
现在对于第4个人我们只是把它放在第3位
3 2 1 4
0 1 2 0
最终答案。
我认为它有O(n ^ 2)的复杂性。我们可以做得更好,这个算法的正确性怎么样?
答案 0 :(得分:0)
序列B的最左边的值总是0--站在队列前面的那个人在他之前没有人。
每当序列B在左边有一个连续的0-s序列时,队列的那部分就会自行排序。
所以,当你有,左边是k连续0-s,(k + 1)-st位置有值t,(t必然<= k), 那些k人中最右边的人比站在那个(k + 1)st posn的人高。
例如: 假设
A:'5''3''6''9''1''4' B:0 0 0 2 0 1
最左边3的高度是'5'&lt; '3'&lt; '6',
并且因为'9'的值是2,所以高度'9'的值比其中的那个短 这些中最右边的2和高于另一个3.所以,只需将'9'移动到2个位置并将其值更新为0.
您可以使用在阵列上实现的链接列表在 O(n)时间内解决此问题。