• 与set和map相关的OJ题练习


    一、两个数组的交集

    题目链接:

    349. 两个数组的交集 - 力扣(LeetCode)

    题目描述:

    给两个数组,求在数组里面共同出现的部分,就是求两个数组的交集,返回顺序不做要求

    解题思路:

    求交集问题,可以先对数据进行去重+升序排序,然后两个数组同时从第一个开始走,当数值相同,则说明是交集,输出并两个同时走下一个,若是不相同,则让小的那一个单独走到下一个,直到某一个走完,则结束。

    参考代码:

    1. vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
    2. {
    3. //找交集先利用set去重加排序
    4. set<int> s1(nums1.begin(),nums1.end());
    5. set<int> s2(nums2.begin(),nums2.end());
    6. //升序序列找交集:相同,则为交集,不同,则小的往后走,其中一方结束则结束
    7. auto it1 = s1.begin();
    8. auto it2 = s2.begin();
    9. vector<int> ret;
    10. while(it1 != s1.end() && it2 != s2.end())
    11. {
    12. if(*it1 == *it2)
    13. {
    14. ret.push_back(*it1);
    15. it1++;
    16. it2++;
    17. }
    18. else if(*it1 < *it2)
    19. {
    20. it1++;
    21. }
    22. else
    23. {
    24. it2++;
    25. }
    26. }
    27. return ret;
    28. }

    二、前k个高频单词

    题目链接:

    692. 前K个高频单词 - 力扣(LeetCode)

    题目描述:

    题目给你一个vector类型,也就是单词序列,需要找到在序列中出现次数从多到少前k个单词,并且要求当单词出现次数相同时,要按照字典序排序,存入到一个vector中返回

    解题思路:

    利用map去对单词进行统计然后按字典序输出,存放到一个vector中,然后对序列中的单词根据次数进行排序,由于题目要求相同时按照字典序排序,因此,使用排序的时候要求不破坏前后顺序,也就是要求使用具有稳定性的排序去进行排序,可以使用算法中提供的排序,也可以利用仿函数给定排序规则去实现

    参考代码:

    1. class Compare
    2. {
    3. public:
    4. bool operator()(const pairint>& x,const pairint>& y)const
    5. {
    6. return x.second > y.second || (x.second == y.second && x.first < y.first);
    7. }
    8. };
    9. vector topKFrequent(vector& words, int k)
    10. {
    11. //使用map去统计每个单词的次数
    12. mapint> map_count;
    13. for(auto& e:words)
    14. {
    15. map_count[e]++;
    16. }
    17. //此时输出的顺序是按照字典序输出的,将其存放到一个vector中,利用具有稳定性的方式按照次数排序即可
    18. vectorint>> v(map_count.begin(),map_count.end());
    19. sort(v.begin(),v.end(),Compare());
    20. vector ret;
    21. for(int i = 0;i
    22. {
    23. ret.push_back(v[i].first);
    24. }
    25. return ret;
    26. }

    三、复杂链表的深拷贝

    题目链接:

    LCR 154. 复杂链表的复制 - 力扣(LeetCode)

    题目描述:

    题目给了一个单向的链表,比起普通单链表,还多了一个随机指针random,每个节点的随机指针都随机指向其他节点或者是自己,也可能是空,题目要求拷贝一条一模一样的链表,难点在于随机指针要完成深拷贝,需要原链表和拷贝链表建立某种联系,使得能够知道原链表的随机指针是如何指向的

    解题思路:

    在C语言阶段时,我们采用通过将每个拷贝节点链接在原节点的方式建立链接去确定random指针的指向,现在我们学习了map以后,可以直接通过map去建立原链表和拷贝链表之间的链接,然后去确定好random

    参考代码:

    1. Node* copyRandomList(Node* head)
    2. {
    3. //直接先拷贝一条链表
    4. Node* copy_head = nullptr;
    5. Node* copy_tail = nullptr;
    6. Node* cur = head;
    7. while(cur)
    8. {
    9. if(copy_head == nullptr)
    10. {
    11. copy_head = new Node(cur->val);
    12. copy_tail = copy_head;
    13. }
    14. else
    15. {
    16. Node* newnode = new Node(cur->val);
    17. copy_tail->next = newnode;
    18. copy_tail = newnode;
    19. }
    20. cur = cur->next;
    21. }
    22. //利用map建立两个链表之间的链接,并且通过原指针的random去找到copy后的random链接
    23. map m;
    24. Node* cur1 = head;
    25. Node* cur2 = copy_head;
    26. while(cur1)
    27. {
    28. m[cur1] = cur2;//建立链接
    29. cur1=cur1->next;
    30. cur2=cur2->next;
    31. }
    32. cur1 = head;
    33. cur2 = copy_head;
    34. while(cur1)
    35. {
    36. cur2->random = m[cur1->random];//通过联系链接
    37. cur1=cur1->next;
    38. cur2=cur2->next;
    39. }
    40. return copy_head;
    41. }

  • 相关阅读:
    深入探索C语言自定义类型:打造你的编程世界
    【图形学】18 光照模型(三、镜面反射的Shader实现)
    GoT:用大语言模型解决复杂的问题
    【毕业设计】基于单片机的家庭智能监控系统 - 物联网 stm32 嵌入式
    YUNBEE云贝-Oracle 19c OCM 5月19日
    创建node、vue、以及@vuecli 和 vue-cli 的区别
    【前端实例代码】使用 HTML&& CSS实现指纹扫描仪特效动画效果 |前端开发 网页制作 基础入门教程 网页开发中常见的样式与特效,收藏起来肯定用的上~
    vue+openlayers地图上实现网格线信息显示(附源码)
    kafka广播消费组停机后未删除优化
    机器视觉工程师努力工作确实不一定涨工资,但是努力工作,确实有很大可能涨工资
  • 原文地址:https://blog.csdn.net/china_chk/article/details/134318361