• leetcode2418.按身高排序


    题目描述:

    给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。

    对于每个下标 inames[i] 和 heights[i] 表示第 i 个人的名字和身高。

    请按身高 降序 顺序返回对应的名字数组 names 。

    示例一:
     

    1. 输入:names = ["Mary","John","Emma"], heights = [180,165,170]
    2. 输出:["Mary","Emma","John"]
    3. 解释:Mary 最高,接着是 Emma 和 John 。

    示例二:
     

    1. 输入:names = ["Alice","Bob","Bob"], heights = [155,185,150]
    2. 输出:["Bob","Alice","Bob"]
    3. 解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob 。

    题目解析:

    首先这道题的解决方法不止一种,我们这里有金典的两种:

    1.哈希映射法:

    就是创建一个身高:名字的哈希表,先将每个人名字和身高的对应信息存入哈希表中,然后再将升

    高降序排序,最后再将升高对应的哈希表中的名字取出,就返回了对应的按身高降序排序的名字,

    这种方法是最常见的,但并不是最优的。

    对应的代码如下:

    1. class Solution
    2. {
    3. public:
    4. vector sortPeople(vector& names, vector<int>& heights)
    5. {
    6. int n = names.size();
    7. unordered_map<int ,string> map;
    8. //对应关系的放入:
    9. for(int i = 0;i < n;i++)
    10. {
    11. map[heights[i]] = names[i];
    12. }
    13. //升高降序排列
    14. sort(heights.begin(),heights.end(),greater());
    15. //取出对应的姓名:
    16. for(int i = 0;i < n;i++)
    17. {
    18. names[i] = map[heights[i]];
    19. }
    20. return names;
    21. }
    22. };

    2.下标排序法:

    这种方法才是本道题的最优解,设置一个下标数组,通过对身高的排序对下标数组进行排序,然后

    再遍历一遍下标数组,将名字对应的下标按降序,插入到一个新的字符串数组中,对应代码如下:
     

    1. class Solution
    2. {
    3. public:
    4. vector sortPeople(vector& names, vector<int>& heights)
    5. {
    6. //创建一个下标数组
    7. vector ret;
    8. int n = heights.size();
    9. vector<int> index(n);
    10. for(int i = 0;i < n;i++)
    11. {
    12. index[i] = i;
    13. }
    14. //对下标数组进行排序
    15. sort(index.begin(),index.end(),[&](int x,int y)
    16. {
    17. return heights[x] > heights[y];
    18. });
    19. //提取结果
    20. for(int i = 0;i < n;i++)
    21. {
    22. ret.push_back(names[index[i]]);
    23. }
    24. return ret;
    25. }
    26. };

    通过一个lamda表达式来改变index的排序策略,从而通过index数组的下标记录来队名字有了降序

    的排序。

    这就是这道题的两种解法。

  • 相关阅读:
    数据结构——散列表
    计算机系统(11)----- 线程概念
    【精讲】vue2框架 路由的使用及案例精讲
    java基础11
    system verilog(1) --- 数据类型
    嵌入式人工智能ESP32(4-PWM呼吸灯)
    微软Azure OpenAI申请和使用教程
    简单入门编写html登录界面
    【开源】基于JAVA的学生日常行为评分管理系统
    QT基础 柱状图
  • 原文地址:https://blog.csdn.net/m0_61497245/article/details/138125927