[Leetcode] 406. Queue Reconstruction by Height 解题报告

本文介绍了一种基于插入排序思想的算法,用于解决特定条件下的队列重构问题。该算法通过对人员按照身高和前后顺序进行排序,然后逐一插入目标队列中来实现。适用于人数不多于1100的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

思路

这道题目其实是插入排序的变种:我们首先对数组元素按照h和k进行排序,但是排序的规则比较特殊:越高的人越往前排,但是如果两个人的身高相同,则k小的人排在前面。这样排序之后我们就可以依次对有序数组内的元素进行插入:当处理到第i个人的时候,我们只需要将其插入到当前结果的第k个位置即可,这是因为比他高或者和他一样高但k小的人都已经在结果集中了,所以该人的位置一定是当前结果集的第k个。很巧妙有没有?

由于插入排序在最坏情况下的时间复杂度是O(n^2),所以该算法的时间复杂度也就是O(n^2)。

代码

class Solution {
public:
    vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
        sort(people.begin(), people.end(), pairComp);
        vector<pair<int, int>> ret;
        for(int i = 0; i < people.size(); ++i) {
            ret.insert(ret.begin() + people[i].second, people[i]);
        }
        return ret;
    }
private:
    struct pairCompare {
        bool operator() (pair<int, int>& a, pair<int, int>& b) {
            return a.first == b.first ? a.second < b.second : a.first > b.first;
        }
    } pairComp;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值