1.题目

【LeetCode406】根据身高重建队列(贪心)_i++


【LeetCode406】根据身高重建队列(贪心)_i++_02

2.思路

第一步骤:
对于一样物体出现2个指标的时候,我们不妨先固定一个指标进行操作(如此题先对第一个指标身高进行从大到小排序,PS:小到大排序其实也是可以的),操作后就会使得每个当前人都比自己前面一坨人身高更低,而身高越低(越在右边的)的人的第二个指标(该人左边中,比该人高的人数)就应该越大,所以根据贪心的思想,再对第二个指标进行从小到大排序。

例如:示例1排完序:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
新建一个二维vector:
[7,0]插入第0的位置
[7,1]插入第1的位置
[6,1]插入第1的位置,这时[7,1]就往后移一位了

第二步骤:
由上面例子可以看到第一步骤后,[6,1]其实位置不对,前面有2个人比它大,说明我们还要进行最后一步操作——将第二指标匹配正确,类似直接插入排序一样遍历,将当前人放在前面中已排序部分的“正确位置”(PS:正确位置指以第二指标为位置下标,这样才能使第二指标正确)。

3.代码

class Solution {
private:
static bool cmp(vector<int>& a,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) {
int n=people.size();
sort(people.begin(),people.end(),cmp);
vector<vector<int> >queue;
for(int i=0;i<n;i++){
int k=people[i][1];
queue.insert(queue.begin()+k,people[i]);//把每个人放在该人下标为第二指标的位置
}
return queue;
}
};