C++ mapsetOJ

目录

1、138. 随机链表的复制

2、692. 前K个高频单词

3、349. 两个数组的交集


1、138. 随机链表的复制

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {
public:Node* copyRandomList(Node* head) {map<Node*, Node*> copyNodeMap;Node* cur = head;Node *copyhead, *copytail;copyhead = copytail = nullptr;while (cur) {Node* copy = new Node(cur->val);copyNodeMap[cur] = copy;if (copytail == nullptr) {copytail = copyhead = copy;} else {copytail->next = copy;copytail = copytail->next;}cur = cur->next;}cur = head;Node* copy = copyhead;while (cur) {if (cur->random == nullptr) {copy->random = nullptr;} else {copy->random = copyNodeMap[cur->random];}cur = cur->next;copy = copy->next;}return copyhead;}
};
  • 代码首先创建一个map(copyNodeMap)用于存储原节点和对应的拷贝节点的映射关系。然后遍历原链表,对每个节点进行拷贝,并将原节点和拷贝节点的映射关系存储到copyNodeMap中。同时,根据拷贝节点的顺序构建新的链表,即将拷贝节点按顺序连接起来。
  • 接下来,再次遍历原链表,将拷贝节点的random指针指向对应的拷贝节点。如果原节点的random指针为空,则拷贝节点的random指针也为空;否则,拷贝节点的random指针指向copyNodeMap中对应原节点的拷贝节点。
  • 最后,返回拷贝链表的头节点copyHead。

2、692. 前K个高频单词

思路1:使用map进行单词计数,然后将计数结果转换为vector进行排序,最后返回前k个出现次数最多的单词。排序的依据是出现次数,如果出现次数相同,则按照字典顺序排序。 

class Solution {
public:struct Compare {bool operator()(const pair<string, int>& kv1,const pair<string, int>& kv2) {return kv1.second > kv2.second;}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> countMap;for (auto& a : words) {countMap[a]++;}vector<pair<string, int>> v(countMap.begin(), countMap.end());//stable_sort保持相同出现次数的单词的相对顺序不变stable_sort(v.begin(), v.end(), Compare());vector<string> ret;for (size_t i = 0; i < k; i++) {ret.push_back(v[i].first);}return ret;}
};

思路2:或者不使用stable_sort,在仿函数处控制比较逻辑实现单词的相对顺序不变。 

class Solution {
public:struct Compare {bool operator()(const pair<string, int>& kv1,const pair<string, int>& kv2) {return kv1.second > kv2.second ||(kv1.second == kv2.second && kv1.first < kv2.first);}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> countMap;for (auto& a : words) {countMap[a]++;}vector<pair<string, int>> v(countMap.begin(), countMap.end());sort(v.begin(), v.end(), Compare());vector<string> ret;for (size_t i = 0; i < k; i++) {ret.push_back(v[i].first);}return ret;}
};

思路3:通过使用map统计单词出现次数,然后使用multiset进行排序,最后返回出现频率最高的前k个单词。

class Solution {
public:struct Compare {bool operator()(const pair<string, int>& kv1, const pair<string, int>& kv2) const {return kv1.second > kv2.second || (kv1.second == kv2.second && kv1.first < kv2.first);}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> countMap;for (auto& str : words) {countMap[str]++;}multiset<pair<string, int>, Compare> sortSet(countMap.begin(), countMap.end());vector<string> ret;auto it = sortSet.begin();while (k--) {ret.push_back(it->first);++it;}return ret;}
};

3、349. 两个数组的交集

找交集思路:

  1. 如果两个元素不相等,那么较小的元素向后移动一位。
  2. 如果两个元素相等,那么它们就是交集的元素,将它们添加到结果中,并将两个指针都向后移动一位。
  3. 任意一个集合走完则查找结束。

找差集也可以借鉴交集思路:

  1. 如果两个元素相等,那么它们不是差集的元素,将两个指针都向后移动一位。
  2. 如果两个元素不相等,那么较小的元素就是差集的元素,将它添加到结果中,并将较小的指针向后移动一位。
  3. 当其中一个集合的指针走完了,剩下的另一个集合中的元素都是差集的元素。
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> s1(nums1.begin(), nums1.end());set<int> s2(nums2.begin(), nums2.end());auto it1 = s1.begin();auto it2 = s2.begin();vector<int> v;while (it1 != s1.end() && it2 != s2.end()) {if (*it1 < *it2)++it1;else if (*it2 < *it1)++it2;else {v.push_back(*it1);it1++, it2++;}}return v;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/411945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网上订货管理系统功能列表|企业手机订单管理软件

网上订货管理系统功能列表|企业手机订单管理软件 后台功能列表 &#xff08;后台支持手机版本 订货APP,管理订单的APP&#xff09; 后台登陆 输入账号密码登录企业订货管理软件系统 后台首页 显示近日,月,年订单统计&#xff0c;和收款欠款等统计。 订单模块 新建订单 &am…

【Python】如何快速知道当前python所用库的路径

【背景】 项目一多&#xff0c;python环境就开始互相影响。有时需要快速知道当前的环境用的库&#xff0c;也就是site-pachage是哪个路径下的。 【方法】 打开相应的Python.exe&#xff0c;进入python命令行&#xff0c;输入&#xff1a; import sys print(sys.path)结果类…

【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化)

前言 众所周知&#xff0c;Verilog是作为一种HDL&#xff08;Hardware Description Language&#xff0c;硬件描述语言&#xff09;出现的&#xff0c;它的主要功能是在不同的抽象层级上描述电路&#xff0c;从而实现电路设计。那么到底该如何描述电路&#xff1f;Verilog提供…

[Android] Android架构体系(1)

文章目录 Android 的框架Dalvik 虚拟机JNI原生二进制可执行文件Android NDK中的binutils Bionic谷歌考虑到的版权问题Bionic与传统的C标准库&#xff08;如glibc&#xff09;的一些不同 参考 Android 的框架 Android 取得成功的关键因素之一就是它丰富的框架集。 没有这些框架…

【数学建模】2024年华数杯国际赛B题-光伏发电Photovoltaic Power 思路、代码、参考论文

1 问题背景 中国电力构成包括传统能源(如煤炭、石油、天然气)、可再生能源(如水电、风能、太阳能、核能)和其他形式的电力。这些发电模式在满足中国巨大的电力需求方面发挥着至关重要的作用。据最新数据显示&#xff0c;中国总发电量超过20万亿千瓦时&#xff0c;居世界第一。…

CSS||选择器

目录 作用 分类 基础选择器 标签选择器 ​编辑类选择器 id选择器 通配符选择器 作用 选择器&#xff08;选择符&#xff09;就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说&#xff0c;就是选择标签用的。 选择器的使用一共分为两步&#xff1a; 1.…

微信小程序+前后端开发学习材料2-(视图+基本内容+表单组件)

学习来源 视图 1.swiper 滑块视图容器。其中只可放置swiper-item组件&#xff0c;否则会导致未定义的行为。 显示面板指示点indicator-dots 基础内容 1.icon 图标组件 实例演示 2.progress 进度条。组件属性的长度单位默认为px&#xff0c;咱用rpx。 实例演示 这…

Ubuntu20.04-剪贴板

针对图形界面用户 1.两种方式 1.1 安装Parcellite 简单轻量级剪贴板管理器 sudo apt install parcellite 1.2 安装Gpaste 更强大的剪贴板管理器&#xff0c;包含历史记录和同步功能 sudo apt install gpaste

wox 启动的cmd无法识别npm

安装软件步骤&#xff1a;everything->wox->nvm->npm->yarn 新打开的任意cmd窗口均发现可以识别npm和yarn命令&#xff0c;但是wox启动的cmd窗口就不行 联想到cmd的特性是一个cmd窗口打开后&#xff0c;其运行环境就会固定&#xff0c;不会随着你系统环境变量的更…

【昕宝爸爸小模块】深入浅出之POI是如何做大文件的写入的

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

逆向使用webpack打包的网站

webpack webpack 是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源&#xff08;图片、js文件、css文件等&#xff09;都看成模块&#xff0c;通过loader&#xff08;加载器&#xff09;和 plugins &#xff08;插件&#xff09;对资源进行处理&#xff0c;打包成符…

SpringBoot项目里用MultipartFile作为入参获取到的file为什么null

前言&#xff1a; 最近在项目中用到了Excel模板导入功能&#xff0c;但是在测试阶段用Postman测试时&#xff0c;通过Post请求&#xff0c;传到后端的File一直为null。其中前端传参和请求都没问题&#xff0c;后端的接参也没问题&#xff0c;问题出在过滤器的复用上。 问题场…