LeetCode—406.根据身高重建队列(Queue Reconstruction by Height)——分析及代码(Java)

LeetCode—406.根据身高重建队列[Queue Reconstruction by Height]——分析及代码[Java]

一、题目

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (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]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 贪心算法

(1)思路

因为个子低的人相对于个子高的人是“看不见”的,即个子低的人所站位置,对个子更高的人的 k 无影响。而身高 h 的个数是有限的,因此可从身高最高的人开始,从高到低将每种身高的人插入第 k 个位置,完成排序。

具体实现步骤为:
1)将所有人按身高 h 分组,并在各组内按 k 进行排序;
2)从 h 最高的组开始,在每组中依次将成员插入第 k 个位置。

(2)代码

class Solution {
    
    
    public int[][] reconstructQueue(int[][] people) {
    
    
        Arrays.sort(people, new Comparator<int[]>() {
    
    
            @Override
            public int compare(int[] p1, int[] p2) {
    
    
                return p1[0] == p2[0] ? p1[1] - p2[1] : p2[0] - p1[0];
            }
        });

        List<int[]> ans = new LinkedList<>();
        for (int[] p : people) {
    
    
            ans.add(p[1], p);
        }

        int len = people.length;
        return ans.toArray(new int[len][2]);
    }
}

(3)结果

执行用时:10 ms, 在所有 Java 提交中击败了 63.37% 的用户;
内存消耗:40.8 MB, 在所有 Java 提交中击败了 38.40% 的用户。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/103431358