406 Queue Reconstruction by Height

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.

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]]

Note:

The number of people is less than 1,100.

解释下题目:

这题看了半天没看懂....其实他的意思应该是原来有这么一个二维数组,就是上面的output,然后每个数组都符合这么一个规则:第一个数字是身高,第二个是在它前面比它高(或者等于它,下略)的人的个数。比如第一个[5,0] 它是第一个,所以在它前面没人比它高。第二个因为身高是7,显然他前面没人比它高;然后第三个身高是5,显然前面身高比它高的有5(平)和7,所以是2。然后它把这个数组打乱了,让你还原,这样可能比较好理解吧。

1. 贪心

实际耗时:36ms

public int[][] reconstructQueue(int[][] people) {
    if (people == null || people.length == 0 || people[0].length == 0) {
        return new int[0][0];
    }

    // 首先按照身高进行排序,如果身高一样则按照后面的数字大小排序
    Arrays.sort(people, (o1, o2) -> {
        if (o1[0] == o2[0]) {
            return o1[1] - o2[1];
        } else {
            return o2[0] - o1[0];
        }
    });

    ArrayList<int[]> tmp = new ArrayList<>();
    for (int[] person : people) {
        tmp.add(person[1], new int[]{person[0], person[1]});
    }

    int[][] res = new int[people.length][2];
    int i = 0;
    for (int[] k : tmp) {
        res[i][0] = k[0];
        res[i++][1] = k[1];
    }

    return res;
}

  我一开始想法很简单:显然一开始需要对数组中的第二个,也就是前面有多少人比它高进行排序,然后就死在这里了,这样是做不出来的。因为比这个数高的那些数字,不一定全在它前面。后来去看了答案,觉得特别不错,但是其实要我想还真的想不出来:首先对数组中的第一个排序,按照从大到小的顺序,如果第一个数字相同,则按照第二个数字从小到大的顺序排。然后按照规则把它插入list中就可以得到解。

时间复杂度O(nlogn)
空间复杂度O(n)

推荐阅读更多精彩内容