406. 根据身高重建队列
Posted niroberteinteson
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 };
以上是关于406. 根据身高重建队列的主要内容,如果未能解决你的问题,请参考以下文章