首页 » 技术分享 » 【贪心】B_011 根据身高重建队列(h 降序 k 升序)

【贪心】B_011 根据身高重建队列(h 降序 k 升序)

 

一、题目描述

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (h, k) 表示,其中 h 是这个人的身高,k 是排在这个人前面且身高大于或等于 h 的人数。 编写一个算法来重建这个队列。

注意:总人数少于1100人。

输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

在这里插入图片描述

二、题解

方法一:对身高排序

错误思想:仅对身高降序排列后,插入对应的位置。

public int[][] reconstructQueue(int[][] people) {
    Arrays.sort(people, (e1, e2) -> e2[0] - e1[0]);
    List<int[]> list = new ArrayList<>();
    for (int[] p : people) {
        list.add(p[1], p);
    }
    return list.toArray(new int[list.size()][2]);
}
[[9,0],[7,0],[1,9],[3,0],[2,7],[5,3],[6,0],[3,4],[6,2],[5,2]]
输出:[[3,0],[6,0],[7,0],[5,2],[3,4],[6,2],[5,3],[2,7],[9,0],[1,9]]
预期:[[3,0],[6,0],[7,0],[5,2],[3,4],[5,3],[6,2],[2,7],[9,0],[1,9]]

例子表明,对同一身高 h 的人,应该按 k 升序排列才符合题目逻辑。因为 k 表示 i 位置有多少人的身高 >= h[i],所以,我们应该保证身高相同的人的先后顺序。

public int[][] reconstructQueue(int[][] people) {
    Arrays.sort(people, (e1, e2) -> e1[0] == e2[0] ? e1[1]-e2[1] : e2[0]-e1[0]);
    List<int[]> list = new ArrayList<>();
    for (int[] p : people) {
        list.add(p[1], p);
    }
    return list.toArray(new int[list.size()][2]);
}

复杂度分析

  • 时间复杂度:

    O

    (

    n

    l

    o

    g

    n

    )

    O(nlogn)

    O(nlogn)

  • 空间复杂度:

    O

    (

    n

    )

    O(n)

    O(n)

转载自原文链接, 如需删除请联系管理员。

原文链接:【贪心】B_011 根据身高重建队列(h 降序 k 升序),转载请注明来源!

0