LeetCode-406. 根据身高重建队列

1、题目描述:

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

    示例 1:

    输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
    输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
    解释:
    编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。
    编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。
    编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。
    编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
    编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。
    编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
    因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。
    

    示例 2:

    输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
    输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]
    

    提示:

    • 1 <= people.length <= 2000
    • 0 <= hi <= 106
    • 0 <= ki < people.length
    • 题目数据确保队列可以被重建

    2、代码:

    代码1:比较优美的风格

    class Solution {
    public:
        vector> reconstructQueue(vector>& people) {
            // 排序:按身高降序,身高相同则按k升序
            sort(people.begin(), people.end(), [](const vector& a, const vector& b) {
                if (a[0] == b[0]) {
                    return a[1] < b[1];
                }
                return a[0] > b[0];
            });
            
            vector> queue;
            for (const auto& person : people) {
                queue.insert(queue.begin() + person[1], person);
            }
            
            return queue;
        }
    };

     

     代码2:平易近人的风格

    class Solution
    {
    public:
        vector> reconstructQueue(vector>& people)
        {
            // 排序:按身高从大到小排序,遇到身高相等的,按ki从小到大排序
            sort(people.begin(), people.end(), [](vector& a, vector& b) {
                if (a[0] == b[0]) {
                    return a[1] < b[1];
                }
                return a[0] > b[0];
            });
            vector> queue;
            for (int i = 0; i < people.size(); i++) {
                queue.insert(queue.begin() + people[i][1], people[i]);
            }
            return queue;
        }
    };

    3、解题思路:

            题目是让我们根据每个人的身高和他们前面应该有多少个更高或相等的人来重新排列队列。输入的people数组是打乱顺序的,我们要构造出正确的队列。我记得之前好像做过类似的题目,或者看过解法。可能涉及到排序和插入的策略。比如说,先处理高的人,然后依次插入到适当的位置。因为高的人不会影响后面插入的矮的人的位置,或者说矮的人插入时,已经排好的高的人的数量就是他们前面可能的高的人数。

            那具体怎么操作呢?先按照身高从高到低排序,如果身高相同的话,ki小的排在前面。这样,当我们依次插入每个人的时候,他们的ki值就是他们应该插入的位置。例如,一个高个子,他的ki是0,那他就放在最前面。当后面有比他矮的人时,他们的ki值决定了前面有多少比他高的,这时候插入到对应的位置就不会影响到已经排好的高个子的顺序因为矮个子插入的位置前面的都是比他高的或者相等的。

            排序已经处理完了,那么怎么插入呢?插入时我们需要按照ki从低到高排序,遇到 ki 相等的情况时,我们就将 hi 小的排在前面,这样子就满足矮个子插入的位置,前面的,都是比他高的,或者相等的人 这个条件

    具体步骤:

    1. 排序策略:首先将输入数组按身高降序排序,如果身高相同,则按前面需要的人数(k值)升序排序。这样处理可以确保在插入每个人时,已经处理过的人的身高都大于或等于当前处理的人,从而保证插入位置的正确性。

    2. 插入策略:遍历排序后的数组,将每个人插入到结果队列的指定k值位置。由于已经处理的人的身高都大于或等于当前处理的人,插入到k值的位置时,前面正好有k个满足条件的人。

    你可能感兴趣的:(力扣,leetcode,算法,职场和发展)