首先需要对数组进行排序,排序先按照身高再按照比他高度人数。
然后新建一个长度相等,所有值均为最小高度和-1的数组。下面就说进行插入操作,每次都根据前面>=他高度的人数来找到最合适的位置,-1表示还没插入,因为是按高度顺序插入,还没插入的值必然是>=该节点的高度的。
class Solution {
struct compare
{
bool operator()(const vector<int>& a,const vector<int>& b)
{
if(a[0]==b[0])return a[1]<b[1];
return a[0]<b[0];
}
};
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(),people.end(),compare());//按照身高和前面人数进行初步排序
//然后初始化结果数组,另数组中所有节点的高度为最小高度(表示插入的值要>=最小高度),比它高的人为-1
int n=people.size();
vector<int> temp={people[0][0],-1};
vector<vector<int>> ans(n,temp);
for(auto &num:people)
{
int k=0;
//开始遍历初步排序后的数组,在数组中找到合适的位置去插入该节点,同时将所有遍历过的第二个值
//为-1的节点表示还未插入,以后插入的值必定>=他本身,因为按顺序插入,所有不可能出现比他本身大的值
for(int j=0;j<=num[1]&&k<n;++k)
{
//-1那就说明这个位置还没有被插入
if(ans[k][0]<num[0])
{
if(ans[k][1]==-1)++j;
}
else ++j;
}
ans[k-1][0]=num[0];
ans[k-1][1]=num[1];//因为是已排好序的,所有找到合适位置后,那个位置必然高度与要插入节点相同
//只需要修改比他高的人的个数即可
}
return ans;
}
};