根据身高重新排列人的算法的正确性?

时间:2013-11-30 04:10:44

标签: algorithm correctness

你得到两个数组,第一个数组包含代表人物高度的整数,第二个数组包含他面前有多少人站在身高高度并形成队列的位置。

  • 高度是独特的意味着没有两个人可以拥有相同的高度。

实施例 -

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)的复杂性。我们可以做得更好,这个算法的正确性怎么样?

1 个答案:

答案 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)时间内解决此问题。