406. 根据身高重建队列 https://leetcode-cn.com/problems/queue-reconstruction-by-height/
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)
表示,其中h
是这个人的身高,k
是排在这个人前面且身高大于或等于h
的人数。 编写一个算法来重建这个队列。
注意:
总人数少于1100人。
示例输入: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 输出: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
思路,花费了很多时间,发现有点向冒泡排序,每个计算当前前面高于自己的人数,和目标进行比较,如果大于目标,后移,小于目标,迁移。同时更新times。直到所有的times符合应有的位置。
刚开始,临时计算times,时间复杂度为n^3,通过预先计算times,可降低到n^2.
class Solution {
public:
static bool mycmp(pair<int, int> a,pair<int, int> b) {
if(a.first!=b.first) return a.first>b.first;
else return a.second>b.second;
}
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
vector<pair<int, int>> res;
int n=people.size();
vector<int> times(n+10,0);
if(n<=1) return people;
sort(people.begin(),people.end(),mycmp);
bool exchage;
int cnt=0;
bool used=false;
for(int i=0; i<n; i++) {
cnt=0;
for(int j=0; j<i; j++)
if(people[j].first>=people[i].first) {
cnt++;
}
times[i]=cnt;
}
do {
exchage=false;
for(int i=0; i<n; i++) {
if(i+1<n&×[i]<people[i].second) {
//swap(i,i+1,people);
if(people[i].first<=people[i+1].first) {
times[i]++;
}
if(people[i].first>=people[i+1].first) {
times[i+1]--;
}
int f=people[i+1].first;
int s=people[i+1].second;
int t=times[i+1];
people[i+1].first=people[i].first;
people[i+1].second=people[i].second;
times[i+1]=times[i];
people[i].first=f;
people[i].second=s;
times[i]=t;
exchage=true;
}
if(i-1>=0&×[i]>people[i].second) {
//swap(i,i+1,people);
if(people[i].first<=people[i-1].first) {
times[i]--;
}
if(people[i].first>=people[i-1].first) {
times[i-1]++;
}
int f=people[i-1].first;
int s=people[i-1].second;
int t=times[i-1];
people[i-1].first=people[i].first;
people[i-1].second=people[i].second;
times[i-1]=times[i];
people[i].first=f;
people[i].second=s;
times[i]=t;
exchage=true;
}
}
} while(exchage);
return people;
}
};
看了答案,感觉自己太傻了!
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
if (people.size() >= 1100)
{
throw invalid_argument("people size is invalid.");
}
sort(people.begin(), people.end(), [](const pair<int, int>& p1, const pair<int, int>& p2)
{
return p1.first > p2.first || (p1.first == p2.first && p1.second < p2.second);
});
vector<pair<int, int>> result;
for (auto pair : people)
{
result.insert(result.begin() + pair.second, pair);
}
return result;
}
};