zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    讲透学烂二叉树(五):分支平衡—AVL树与红黑树伸展树自平衡
    讲透学烂二叉树(四):二叉树的存储结构—建堆-搜索-排序
    讲透学烂二叉树(三):二叉树的遍历图解算法步骤及JS代码
    instanceof运算符的实质:Java继承链与JavaScript原型链
    JavaScript new 关键词解析及原生实现 new
    JavaScript继承的实现方式:原型语言对象继承对象原理剖析
    GitHub不再支持密码验证解决方案:SSH免密与Token登录配置
    PNG文件解读(2):PNG格式文件结构与数据结构解读—解码PNG数据
    PNG文件解读(1):PNG/APNG格式的前世今生
    JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/12039611.html
Copyright © 2011-2022 走看看