406-Queue-Reconstruction-by-Height

TAG: 贪婪

原题

Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k), where h is the height of the person and k is the number of people in front of this person who have a height greater than or equal to h. Write an algorithm to reconstruct the queue.

Note:
The number of people is less than 1,100.

Example

Input:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

Output:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

思路

先思考大家高度都是一样的情况,比如[7,0]和[7,1]这样两个人,正确的排序方法就是让k更大的人往后排。

这时,我们推广一下,如果加入一个更矮的人,比如[6,1],那么他应该放哪里呢,显然应该放在[7,0]和[7,1]之间,最后形成了[7,0][6,1][7,1]这样的序列。

如果我们加入一个更高的人呢?比如[8,0],显然要构成[7,0][7,1][8,0]

通过观察我们可以发现,插入更矮的人,是不会改变已经按高度排好队的序列的,只是更矮的人会插入到这些人之间,再思考一下,矮的人要插入到什么位置呢?

由于条件限制,k所表示的是这个人前面有几个人,k=1,前面有1个,k=2,前面有两个。

综合以上,当我们在一个按高度排序好的队列中,插入一个更矮的人,就直接放在第k个位置上。

这样,我们就可以将原来的数组,先按高度h逆序排(高个子的在前面),然后再按k顺序排。

然后,再建立一个新的数组,依次的从排好的原数组中取出元素,插入到当前项的第k个位置上。

想想看,第一个插入进来的,一定是最高的那个[8,0],它左边的人最少(为0),第二个插入进来的,一定是和第一个人一样高或者矮于第一个人的人,它的k一定是1。8,0

第三个人如果更加矮,因为现在数列中有两个人了,k必然是1,或者2,否则的话,题目给的数据就是错的,无法正确的处理了。

可以继续推理下去……

要是还是没有理解,可以再参考一下原题的解答:406. Queue Reconstruction by Height

这道题是属于那种没有思路真是难想出来的那种

代码如下:

public int[][] reconstructQueue(int[][] people) {
    Arrays.sort(people, new Comparator<int[]>() {

        @Override
        public int compare(int[] o1, int[] o2) {
            return o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0];
        } 
    });

    List<int[]> output = new LinkedList();
    for (int[] p : people) {
        output.add(p[1], p);
    }
    return output.toArray(new int[people.length][2]);
}

更多干货内容,欢迎关注我的公众号:好奇码农君
关注了之后就可以在手机上随时随地查看文章啦

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理