• 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 };
  • 相关阅读:
    [BFS]luogu P2536 [AHOI2005]病毒检测
    AtCoder Regular Contest 116 总结
    NOI online 2021 #1 总结
    博客半复活
    vue2 Bus兄弟组件间传值问题:重复触发和首次未触发
    ant design中table组件的filter,如何在外部控制
    ant design vue 日期排序
    什么是断点续传?前端如何实现文件的断点续传
    主vue前端面试题补充
    P4248 [AHOI2013]差异 题解
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/12039611.html
Copyright © 2020-2023  润新知