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

被折叠的 条评论
为什么被折叠?



