原题链接:406. 根据身高重建队列
solution: 贪心
思路:身高高的人只会看到比他高的人,所以当身高高的人固定好了位置,前面插入多少个矮的人都不会破坏高的人的条件限制。所以应该先决定高的人的位置,再决定矮的人的位置;高的人限制条件少,矮的人限制条件多。
①先按身高从大到小排序,身高一样则按照k排序:身高大或k小意味着限制条件少,应该被优先考虑。
②依次插入元素:由上一点,先进入res的元素不会被后进入的元素影响,因此每一次插入只需要考虑自己不需要考虑别人。当遍历到元素[a,b]的时候,比它大的元素已经进组,比它小的元素还没进组,那么它应该插到res的第b位,从而实现0到b-1的数字都比它大。
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
vector<vector<int>> res; //定义返回值
sort(people.begin(),people.end(),[](const vector<int> a,const vector<int> b){
return a[0] > b[0] || (a[0] == b[0] && a[1] < b[1]);
});
for(auto &x : people) res.insert(res.begin() + x[1], x);
return res;
}
};