map和set的例题

news2024/11/27 14:45:05

随机链表的复制 

138. 随机链表的复制 - 力扣(LeetCode) 

我们为什么要拷贝原链表的结点一个个链接到原链表结点的后面?

其实就建立了原链表结点与拷贝链表每个结点的一种映射关系, 方便我们设置拷贝结点的random域。

那我们现在C++有了map:

1.首先我们定义一个map,然后遍历原链表,依次拷贝结点,在map中建立源节点与拷贝结点的映射,并链接拷贝链表.

2.然后, 再遍历原链表用来设置拷贝结点的random域:
如果源节点的random指向空,那么拷贝结点random也指向空;如果源节点不指向空,那拷贝结点就指向map中对应源节点的random指向的结点对应的拷贝结点

 

class Solution {
public:
    Node* copyRandomList(Node* head) 
    {
        map<Node*,Node*> m;
        Node* cur = head;
        Node* copyhead = nullptr;
        Node* copytail = nullptr;

        while(cur)
        {
            Node* node = new Node(cur->val);
            m[cur] = node;

            if(copyhead == nullptr)
            {
                copyhead = copytail = node;
            }
            else
            {
                copytail->next = node;
                copytail = copytail->next;
            }
            cur = cur->next;
        }

        cur = head;
        while(cur)
        {
            if(cur->random == nullptr)
            {
                m[cur]->random = nullptr;
            }
            else
            {
                m[cur]->random = m[cur->random];
            }
            cur = cur->next;
        }
        return copyhead;
    }
};

前K个高频单词

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

给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序.如果不同的单词有相同出现频率,按字典顺序 排序。

对列表里面每个单词出现的次数做一个统计, 然后要返回前k个出现次数最多的单词,这就是一个TOP-K问题。那这道题其实比较需要注意的地方是如果有不同的单词出现相同的次数, 这些相同次数的单词要按字典顺序 排序。 

先统一一下次数: 

 

1.TOP-K可以用优先级队列去实现, 这是一种方法,

2.还有一种方法, 可以直接按照次数对所有单词进行一个排序,排个降序,然后前K个单词就是要返回的结果, 但map默认是按照key的大小进行排(插入的时候比较的是key的大小)的,而我们想要的排序是按照次数(value)排的,所以不行。

要排序的话:

库里面不是有一个排序算法sort可以排,但是,map不能用sort,因为sort要求传入的迭代器必须是随机迭代器,而map的迭代器是双向迭代器

 所以我们可以把map里面的元素拷贝到vector里面再用sort排序。

 但是, 现在我们的vector里面存的是pair,pair虽然也支持比较大小, 它重载了这些比较运算符, 但是它的比较规则不是这里我们想要的

 

它比较的时候是先看两个的first满不满足小于,不满足再去看second是否满足小于。
但是我们要按照次数和单词综合来进行比较, 还不单是second比较, 另外sort默认还是升序,我们这里取TOP-K的话搞成降序比较好。

那既然不行,我们就可以自己写一个比较的仿函数(也可以写成函数传函数指针),因为sort是可以由我们自己指定比较方式的

首先判断p1和p2的second谁大, p1大排在前面, 如果p1和p2的second相等再按字典序判断,即判断p1和p2谁的first小, 谁排在前面

为什么还需要额外去判断字典序?

我们放到map里面统计好次数, 这时候虽然不是按次数进行排序,是按照key即first排序的。所以我们放到map里面之后单词的前后顺序其实就是按照字典顺序排好了,我们后面的排序只需要按照次数再排一下就好了。

但是:

这涉及到排序是否稳定, 因为有可能有次数相同的单词, 本来没按次数排之前它们的前后顺序是正确的(是按字典顺序的),但是如果按次数排序的时候,快排不稳定,会导致这些次数相同的单词的前后顺序发生改变啊。
sort底层是快排,不稳定,所以需要再额外调整字典序

 排好序的话我们取到前k个就好了(注意最终返回只要单词)

 

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        struct cmp
        {
            bool operator()(pair<string,int> p1, pair<string,int> p2)
            {
                return p1.second > p2.second || p1.second == p2.second && p1.first < p2.first;
            }
        };

        map<string,int> countmap;
        for(auto& word : words)
        {
            countmap[word]++;
        }
        vector<pair<string,int>> v(countmap.begin(),countmap.end());
        sort(v.begin(),v.end(),cmp());
        
        vector<string> ret;
        for(int i = 0;i <k;i++)
        {
            ret.push_back(v[i].first);
        }
        return ret;
    }
};

法二:

除了sort,算法库里面还提供了一个稳定的算法——stable_sort 

 用stable_sort保证原来初始的字典序, 然后只需要再按照second排序即可

法三:

那其实不用sort,也可以用利用set排序.
怎么做呢?

前面我们统计好次数不是放到一个map里面了, 那我们可以把它再放到一个set里面,但是set默认的排序肯定是不行的, 我们排序的时候要按次数比较, 但是次数相同的时候要保证字典顺序小的在前面。所以我们还是要自己写一个仿函数:


注意我们这个仿函数, 有时候他里面会用const对象调用, 所以以后写这个仿函数最好把const加上 

 两个数组的交集

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

给我们两个数组,要求我们返回它们的交集,交集中每个元素必须是唯一的。

第一步我们先对两个数组进行排序加去重(因为最终输出结果中元素要唯一, 排序的话有助于我们后面找),那排序的话我们可以用sort, 然后去重其实库里面也有去重算法——unique
但是直接一个set就搞定了:

 其实算法库里面也是有求这些集合的算法的:

目标容器ret必须具有足够的空间来存储交集元素。可以使用std:back_inserter迭代器适配器或者事先调整目标容器的大小来确保这一点 

如果正常写怎么求交集? 

 

双指针去遍历,两个元素相同,就是交集,同时++;不相同,小的++.为什么要小的++?因为两者不相同,小的++后面还有可能与大的相同, 而大的后面不可能有与这个小的相同的了.

有一个集合遍历完就结束 .

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> ret;
        while(it1 != s1.end() && it2 != s2.end())
        {
            if(*it1 == *it2)
            {
                ret.push_back(*it1);
                it1++;
                it2++;
            }
            else if(*it1 < *it2)
            {
                it1++;
            }
            else
            {
                it2++;
            }
        }
        return ret;
    }
};

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF中的Binding的常见知识点与技巧

完全来源于十月的寒流&#xff0c;感谢大佬讲解 在XAML中&#xff0c;可以绑定到许多不同类型的数据源和属性。以下是一些可以绑定的常见数据源和属性&#xff1a; 属性&#xff1a;可以绑定到对象的属性&#xff0c;例如控件的Text、Visibility、IsEnabled等属性。 集合&am…

爱上C语言:函数递归,青蛙跳台阶图文详解

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;生活本来沉闷&#xff0c;但跑起来就有风 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请…

Python基础入门例程42-NP42 公式计算器(运算符)

最近的博文&#xff1a; Python基础入门例程41-NP41 二进制位运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程40-NP40 俱乐部的成员&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程39-NP39 字符串之间的比较&#xff08;运算符&#xff09;-C…

Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台

Zeus IoT 是一个集设备数据采集、存储、分析、观测为一体的开源物联网平台&#xff0c;全球首创基于 Zabbix 的物联网分布式数据采集架构&#xff0c;具备超百万级物联网设备的并发监控能力&#xff0c;真正具备工业级性能与稳定性的开源物联网大数据中台。 Zeus IoT 致力于让设…

apachesolr中简单使用

core使用 首先点击add core 可以看到报错solrconfig.xml不在new_core目录下&#xff0c;new_core是我们点击后自动创建的 那么我们将D:\solr2\solr-9.3.0\solr-9.3.0\server\solr\configsets下的任何一个目录下的conf拷贝到new_core过去 这里是使用_default下的conf目录拷贝…

Android Studio 常见问题

一、Android Studio 创建项目后Gradle(构建)项目很慢问题解决 在使用Android Studio创建项目时&#xff0c;会自动从网上下载相关依赖。由于是访问国外服务器&#xff0c;会出现构建项目时下载依赖很慢的问题。为了解决该问题&#xff0c;需要在settings.gradle(或者settings.…

Netty第二部

一、EventLoop和EventLoopGroup 一个Channel可以近似的理解成一个Socket的包装&#xff0c;EventLoop管理这些Channel的 1、EventLoop EventLoop作为线程&#xff0c;具体Channel由EventLoop管理&#xff0c;在AbstractChannel类的register()方法可以体现 Override public …

MySQL索引优化与查询优化

1. 索引失效案例 MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了访问高效数据的方法&#xff0c;并且加快查询的速度&#xff0c;因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录&#xff0c;从而提高数据库查询的速…

C语言查看各数据类型所占大小

编译器&#xff1a;VC2010 #include<stdio.h> int main() {printf("%d\n",sizeof(char));printf("%d\n",sizeof(short));printf("%d\n",sizeof(int));printf("%d\n",sizeof(long));printf("%d\n",sizeof(long long))…

ActiveMq学习⑥__实战篇(Spring 、SpringBoot)

spring 管理ActiveMQ Maven修改&#xff0c;需要添加Spring 支持Jms的pom 包Spring配置文件队列主题在Spring里面实现消费不启动&#xff0c;直接通过配置监听完成 依赖引入 <!--spring整合mq--><!--activemq对JMS的支持&#xff0c;整合SPringle和Activemq-->&l…

圣杯布局/双飞翼布局/flex/grid等,实现CSS三栏自适应布局的几种方法

简介 三栏布局是网页设计中常用的布局&#xff0c;即网页中的内容被分为三块&#xff1a;左侧/中间/右侧。其中两侧部分宽度固定&#xff0c;中间部分宽度自适应的根据浏览器宽度撑满剩余空间。而三栏布局也有很多变形&#xff0c;比如两栏或者N栏布局&#xff0c;上中下三栏布…

【漏洞复现】S2-045 Remote Code Execution(CVE-2017-5638)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描nacs3、漏洞验证 1.5、修复建议 说明内容漏洞编号CVE-2017-5638漏洞名称S2-045 远程代码执行漏…

51单片机-中断

文章目录 前言 前言 #include <reg52.h> #include <intrins.h>sbit key_s2P3^0; sbit flagP3^7;void delay(unsigned int z){unsigned int x,y;for(xz;x>0;x--)for(y114;y>0;y--); }void int_init(){EA1;EX11;IT11;}void main(){int_init();while(1){if (key…

【产品资料】产品经理面试问题(三)

今天和大家免费分享产品经理常见的面试题目&#xff0c;含回答思路分析和回答事例。 【资源下载】 这个资源可以在Axure高保真原型哦小程序里免费下载 打开下方小程序后&#xff0c;搜索产品经理面试题目&#xff0c;获取下载地址 更多原型模板、视频教程、产品文档、定制服…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中&#xff0c;std::thread是一个重要的类&#xff0c;它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

磁盘物理结构介绍(磁头,扇区),chs寻址,如何读写,磁盘io消耗时间;线性抽象结构,lba寻址,分区引入

目录 磁盘文件 引入 看待角度 磁盘 介绍 物理结构 俯视图 立体图 磁头 扇区 如何找到一个扇区 -- CHS寻址 如何读写 磁盘io消耗时间 抽象结构 -- 线性 引入 介绍 -- LBA寻址 分区 引入 介绍 磁盘文件 引入 文件分为两种 被打开的文件(主要讨论与进程之间的…

python基础速通

1. 梳理&#xff1a;目前学习了哪几种数据类型&#xff0c; 每一个数据类型定义一个变量&#xff0c;并输出内容以及类型 # 数据类型 # 整型 int_data 1 print(int_data, type(int_data)) # 浮点型 float_data 1.2 print((float_data, type(float_data))) # 复数 complex_da…

计算机毕设 基于大数据的社交平台数据爬虫舆情分析可视化系统

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕…

Monarch Mixer:一种性能比Transformer更强的网络架构

六年前&#xff0c;谷歌团队在arXiv上发表了革命性的论文《Attention is all you need》。作为一种优势的机器学习网络架构&#xff0c;Transformer技术迅速席卷全球。Transformer一直是现代基础模型背后的主力架构&#xff0c;并且在不同的应用程序中取得了令人印象深刻的成功…

[云原生1. ] Docker consul的详细介绍(容器服务的更新与发现)

文章目录 1. 服务注册与发现的概述1.1 cmp问题1.2 解决方法 2. Consul的概述2.1 简介2.2 为什么要使用Consul服务模块2.2 Consul的服务架构2.3 Consul的一些关键特性 3. consul服务部署3.1 前置准备3.2 Consul服务器3.2.1 建立 Consul 服务3.2.2 设置代理&#xff0c;在后台启动…