406. 根据身高重建队列

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]]

 1 解法1:120 ms    12.4 MB
 2 class Solution {
 3 public:
 4     //对二维数据 按照k 由低到高 ,k相等 由h高 到低排序
 5     static bool cmp(vector<int> &x,vector<int> &y){
 6         if(x[1]==y[1]) return x[0]>y[0];
 7         return x[1]<y[1];
 8     }
 9     vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
10         /*
11         思路:
12             1:从k相等,按照 h排序 从大到小
13             2:按照k升序排列
14             3:按照k相等的时候 h从高到低;不会出现 k相等的时候,h相等
15             4:排完序,之只能出现 从people取出来的,k相等且h<ans[j][0]
16             5:所以 k相等直接插入到 ans[j]之前
17             6:k不相等的时候,统计 ans里面前 多少个ans[j]的时候==k,然后 把i插入到j+1的位置
18         */
19          vector<vector<int> > ans;
20         if(people.size()==0) return ans;//为空直接返回
21         sort(people.begin(),people.end(),cmp);//排序
22         ans.push_back(people[0]);
23         for(int i=1;i<people.size();i++){
24             int sum=0;
25             for(int j=0;j<ans.size();j++){
26                 if(people[i][1]==ans[j][1]){//k相等,小的 在前面,不存在h一样,k一样
27                    if(people[i][0]<ans[j][0]){
28                         ans.insert(ans.begin()+j,people[i]);//这个people[i]放在j之前
29                         break;//跳出 不在进行循环,执行加入下一个i
30                    }
31                 }else if(people[i][1]>ans[j][1]){//如果i的k 大于 ans[j]的k 一定在这个ans[j]之后,
32                     if(people[i][0]<=ans[j][0])//具体位置 需要根据sum ==k来算 这时候 排在那里
33                        sum++;
34                     if(people[i][1]==sum){
35                         ans.insert(ans.begin()+j+1,people[i]);
36                         break;
37                     }
38                 }//不会出现 people[i][1]<ans[i][1]; 因为是已经排好序列了
39             }
40         }
41         return ans;
42     }
43 };
 1 解法2:104 ms    12.4 MB
 2 
 3 class Solution {
 4 public:
 5     static bool cmp(vector<int> &x,vector<int> &y){
 6         if(x[0]==y[0]) return x[1]<y[1];//身高 相等  k排序 从小到大
 7         return x[0]>y[0];//按照身高 降序排列
 8     }
 9     vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
10         /*
11         思路:
12             1:从身高 相等,按照 k排序 从小到大
13             2:按照身高 降序排列
14             3:按照身高 从高到低 排序 每次从people 取出来的身高 都比已经放好的ans里面的身高小
15             4:可以不用比较,直接 插入到 ans.begin()+k的位置,k=people[i][1];
16         */
17         vector<vector<int> > ans;
18         if(people.size()==0) return ans;//为空直接返回
19         sort(people.begin(),people.end(),cmp);//排序
20         // 按照身高 从高到低 排序 每次从people 取出来的身高 都比已经放好的ans里面的身高小
21         //可以不用比较,直接 插入到 ans.begin()+k的位置,k=people[i][1];
22         for(int i=0;i<people.size();i++){
23             ans.insert(ans.begin()+people[i][1],people[i]);
24         }
25         return ans;
26     }
27 };
原文地址:https://www.cnblogs.com/NirobertEinteson/p/12039611.html