- 406.根据身高重建队列
- 思路:
数组vector<vector>people的每一个元素people[i] = [ h[i], k[i] ],h[i]表示他的身高,k[i]表示他前面有几个身高>=他的;
数组people是打乱顺序的,要根据people的每个人的情况,调整people的元素顺序,恢复出原队列;
1.贪心:
每个人的身高h[i]是确定的,但k[i]只知道他前面有几个身高>=他的,但并不知道具体是哪些人;
要对people调整元素顺序,可依靠的就是h和k,因此设法先确定一个,在去调整另一个;
因此先讲people按h从高到低排序(身高一样高的人k小的在前):因为k[i]不算他前面比他低的,也就是即便往他前面插入一些身高更低的人,也任然符合他的k;
再按k遍历一次调整队列,例如people[i] = [ 4, 2 ],代表这个人前面有两个身高>=他的,因此把他放在下标为2的地方,这样前面确保有people[0]和people[1]一定比他高;并且遍历后面的人时,即便插入到他前面了,因为后面的人身高一定不会高于他,因此即便插入到他前面也无所谓;
即优先按身高高的人的k来插入,插入后的people满足队列属性,遍历完后整个队列满足队列属性;
vector的插入动作太慢,因此选择list,最后在转换为vector即可;
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), [](const vector<int>& a, const vector<int>& b){ return a[0] == b[0] ? (a[1] < b[1]) : (a[0] > b[0]); });
list<vector<int>> Queue;
for (int i = 0; i < people.size(); ++i) {
int position = people[i][1];
auto ite = Queue.begin();
while (position) {
++ite;
--position;
}
Queue.insert(ite, people[i]);
}
return vector<vector<int>>(Queue.begin(), Queue.end());
}
};
- 总结:
1.对于多维度问题,选择一个一个解决,并且后面不破坏前面的工作;
2.根据所需的操作,选择适合的容器