406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]
解题
先对people进行排序——h从大小,若相等,则k从小到大;
按顺序将people中每个元素插入list容器下标为k的位置;
将list容器转换为int,传出即可;
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(),
[](const vector<int>& lhs, const vector<int>& rhs)
{return lhs[0] == rhs[0] ? lhs[1] <= rhs[1] : lhs[0] > rhs[0];});
//先按h降序,再按k升序
int n=people.size();
list<vector<int>> tmp;
for(int i=0;i<n;i++){
auto pos=tmp.begin();
advance(pos,people[i][1]);
tmp.insert(pos,people[i]);
}
return vector<vector<int>> (tmp.begin(),tmp.end());
}
private:
vector<vector<int>> res;
};
list容器:支持insert操作
list.insert(pos,item,插入次数(可省略));
pos为指向要插入位置的迭代器;
注意点——list不能指定下标访问,是类似链表的储存
advace()函数
advance(list容器的迭代器,移动的位置(可正可负));
无返回,直接将传入的迭代器移动 n 个步长;
如题让begin()移动k个位置,即可找到list中下标为k的迭代器,并配合insert插入;
next()函数:只能右移
next(迭代器,步长);
返回传入迭代器移动步长后的迭代器;
prev()函数:只能左移
prev(迭代器,步长);
返回传入迭代器左移步长后的迭代器;
advance()与next()与prev()详细可参考
https://blog.csdn.net/qq_43152052/article/details/102610540