题目:
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;
};