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