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

来源:互联网 发布:惠普网络驱动官方下载 编辑:程序博客网 时间:2024/06/06 01:23

题目

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;};

阅读全文
0 0
原创粉丝点击