视频讲解:https://www.bilibili.com/video/BV1EA411675Y/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0406.根据身高重建队列.html#思路
力扣题目:https://leetcode.cn/problems/queue-reconstruction-by-height/
如果正向排序的话,需要考虑h的大小关系以及位次关系,但是如果倒着看的话,先将队列按从大到小的顺序排序,如果h相等,优先排k小的数组,这样就可以保证前面的数稳定大于后面的书,这时我们考虑k的大小,将数组插入到合适的位置,比如[7,0][7,1][5,0]就可以插入到第一个位置,变为[5,0][7,0][7,1],从后往前插入不需要考虑前面的数组的k,比如[7,1]就不用考虑,因为后面的插入到前面也不会影响他的k,所以就可以使用这个方法
cpp
class Solution {
public:
static bool cmp(const vector<int> &a, const vector<int> &b)
{
//如果相等,k小的排在前面
if(a[0] == b[0])
{
return a[1] < b[1];
}
//如果不相等,h大的排前面
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(),cmp);
vector<vector<int>> que;
for(int i = 0; i < people.size(); ++i)
{
//获取插入位置
int position = people[i][1];
que.insert(que.begin() + position, people[i]);
}
return que;
}
};