力扣 347前k个高频元素

class Solution {
public:// 小顶堆class mycomparison {public:bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second > rhs.second;}};vector<int> topKFrequent(vector<int>& nums, int k) {// 要统计元素出现频率unordered_map<int, int> map; // map<nums[i],对应出现的次数>for (int i = 0; i < nums.size(); i++) {map[nums[i]]++;}// 对频率排序// 定义一个小顶堆,大小为k//其中他的元素是由priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;//pair<int, int>特指一个包含两个整数的对。// 用固定大小为k的小顶堆,扫面所有频率的数值for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);//这是优先队列自动就给排好了。if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为kpri_que.pop();}}// 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组vector<int> result(k);//为啥用()因为这实际上是构造函数for (int i = k - 1; i >= 0; i--) {result[i] = pri_que.top().first;pri_que.pop();}return result;}
};

vector result(k);这个动态数组定义大小为什么用()而不是用[]

在C++中,当你使用vector<int> result(k);这种方式定义一个vector时,你实际上是在调用vector的构造函数,k是传递给构造函数的参数,它指定了vector的初始大小。这意味着,这个vector会被初始化为包含k个元素,每个元素都是int类型的默认值(对于整数,这通常是0)。

相比之下,使用方括号[]是数组的语法,用于声明固定大小的数组。vector是一个动态数组,它可以在运行时改变大小,因此使用构造函数语法(即使用圆括号())来初始化vector的大小和内容。

总结来说,vector<int> result(k);使用圆括号是因为这里调用的是vector的构造函数,而不是创建一个固定大小的数组。这是C++标准库中vector类设计的一部分,旨在提供一种灵活且功能强大的动态数组实现。

unordered_map<int,int>

unordered_map是C++标准库中的一个容器,它存储键值对(key-value pairs),其中每个键都是唯一的,并且每个键都映射到一个值。unordered_map内部使用哈希表实现,因此它能够提供平均情况下常数时间复杂度的插入、查找和删除操作,这使得它非常适合用于需要快速访问元素的场景。

unordered_map<int, int>的声明中,第一个int类型指的是键(key)的类型,第二个int类型指的是值(value)的类型。这意味着这个unordered_map存储的是键和值都是整数类型的键值对。

基本用法

  • 插入元素:可以使用insert方法或者下标运算符[]来插入新的键值对。

    unordered_map<int, int> map;
    map.insert({1, 100});
    map[2] = 200;
    
  • 访问元素:通过键访问值时,可以使用下标运算符[]。如果键不存在,unordered_map会自动插入该键,并将值初始化为默认值(对于int,默认值为0)。

    int value = map[1]; // value = 100
    
  • 检查键是否存在:可以使用find方法来检查一个键是否存在于unordered_map中。find方法返回一个迭代器,如果键不存在,则返回end()迭代器。

    if (map.find(1) != map.end()) {// 键1存在
    }
    
  • 删除元素:使用erase方法可以通过键来删除键值对。

    map.erase(1); // 删除键为1的元素
    

特点

  • 无序性:如unordered_map的名称所示,其中的元素是无序的。这与map容器不同,后者会根据键的顺序来存储元素。

  • 哈希冲突:由于unordered_map使用哈希表实现,可能会发生哈希冲突。在处理冲突时,同一哈希值的元素会被存储在同一个桶中,这可能会影响特定操作的性能。

  • 性能:对于大多数操作,unordered_map提供了常数时间复杂度,但在最坏情况下,例如当哈希表中大多数元素都映射到同一个桶时,操作的时间复杂度可能退化到线性时间。

unordered_map是一个非常实用的容器,适合用于需要快速查找、插入和删除键值对的场合。了解其内部实现的细节可以帮助开发者更有效地使用它。

pair<int,int>
在C++中,std::pair是一个模板类,提供了一种方式来存储两个相关联的值作为一个单一的单位。这两个值可以是同类型的,也可以是不同类型的。当你需要将两个值组合起来进行处理时,std::pair特别有用。pair<int, int>特指一个包含两个整数的对。

创建和使用std::pair<int, int>

要使用std::pair<int, int>,你需要包含头文件<utility>,因为std::pair定义在该头文件中。

下面是如何声明和使用pair<int, int>的一个示例:

#include <iostream>
#include <utility> // For std::pairint main() {// 创建一个pair对象,存储一对整数std::pair<int, int> myPair(10, 20);// 访问和输出pair的第一个和第二个元素std::cout << "First element: " << myPair.first << std::endl;std::cout << "Second element: " << myPair.second << std::endl;// 你也可以使用std::make_pair来创建pair对象auto anotherPair = std::make_pair(30, 40);std::cout << "Another pair: " << anotherPair.first << ", " << anotherPair.second << std::endl;return 0;
}

在这个示例中,myPair是一个包含两个整数的pair,其值分别初始化为10和20。通过访问.first.second属性,可以获取或修改pair中的元素。

应用场景

std::pair<int, int>经常在需要处理二维点或需要返回两个值的函数中使用。例如,在图形编程中,它可以表示一个坐标点(x, y),在算法中,它可以用来返回两个相关的计算结果或状态。

此外,pair在STL容器中也很有用,如作为std::map的键值对类型。在这种情况下,每个元素都是一个pair,其中.first成员代表键,而.second成员代表与键相关联的值。

class Solution {
public:class comp{public:bool operator()(const pair<int,int>&l,const pair<int,int>&r){return l.second>r.second;}};vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int,int>map;for(int i=0;i<nums.size();i++){map[nums[i]]++;}priority_queue<pair<int,int>,vector<pair<int,int>>,comp>pri;for (auto it=map.begin();it!=map.end();it++) {pri.push(*it);if(pri.size()>k){pri.pop();}}vector<int>result(k);for(int i=k-1;i>=0;i--){result[i]=pri.top().first;pri.pop();}return result;}
};

自己又写了一遍,有些名称改了改

这代码我先自己敲一遍

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

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

相关文章

【Java探索之旅】数据类型与变量 浮点型,字符型,布尔型,字符串型

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java成长日志 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、变量1.1 浮点型1.2 字符型变量1.3 布尔类型 二、字符串类型2.1 转化 &#x1f324…

建造家庭泳池位置选择尤为重要

建造家庭泳池位置选择尤为重要 在自家别墅庭院中建造一座游泳池是很多人的梦想&#xff0c;因为有泳池家人健身起来是非常方便的&#xff0c;但是建造泳池选择合适的位置显得尤为关键&#xff0c;因为合适的选址可以带来美观性及在泳池的日常使用维护中也起到了很重要的作用。…

Failed to load local image resource the server responded with a status of 500

在微信小程序里使用van-image时&#xff0c;加载本地图片加载不出来&#xff0c;报错信息如下 Failed to load local image resource /miniprogram_npm/vant/weapp/image/require(/images/xztp.jpg) the server responded with a status of 500 (HTTP/1.1 500 Internal Server …

python 通过代理服务器 连接 huggingface下载模型,并运行 pipeline

想在Python 代码中运行时下载模型&#xff0c;启动代理服务器客户端后 1. 检查能否科学上网 $ curl -x socks5h://127.0.0.1:1080 https://www.example.com <!doctype html> <html> <head><title>Example Domain</title><meta charset"…

前端css 纯数字或者字母 溢出不换行

问题&#xff1a;一个div元素盒子 宽度固定 内容是中文到达盒子宽度放不下时会自动换行&#xff0c;但是如果输入的事纯数字或者字母 会发现内容区会溢出 异常现象&#xff1a;11111超出div盒子 解决方案&#xff1a;添加属性 word-break: break-all; 原理&#xff1a;浏览器…

Spring Data的Repositories----自定义存储库实现

【Spring连载】使用Spring Data的Repositories----自定义存储库实现 一、定制单个存储库1.1 配置1.2 歧义的解决1.3 手动装配 二、自定义基础存储库 Spring Data提供了各种选项&#xff0c;可以用很少的编码来创建查询方法。但是&#xff0c;当这些选项不能满足你的需求时&…

13年老鸟整理,性能测试技术知识体系总结,从零开始打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 从个人的实践经验…

多线程案例及常用模式

一.单例模式——经典的设计模式 什么是单例模式&#xff1a;就是规定一个类只能创建一个对象&#xff0c;也就是保证某个类在程序中只存在唯一一个实例&#xff0c;而不会创建出多个实例 根据对象创建的时机不同&#xff0c;可以分为饿汉模式和懒汉模式 1.饿汉模式 在类加载…

Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用

利用此方法&#xff0c;您可以在局域网&#xff08;尤其是NAS&#xff09;上搭建的Web应用支持公网访问&#xff0c;成本低而且操作简单&#xff01; 如果这是博客的话&#xff0c;它还可以有效防止DDOS攻击&#xff01; 准备工作&#xff1a; 需要一个域名&#xff08;推荐N…

类模板和函数模板

在 C 中&#xff0c;类模板和函数模板是用来创建通用类型的模板&#xff0c;允许在编写代码时将类型参数化。这种泛型编程方式可以帮助我们编写更通用、更灵活的代码&#xff0c;提高代码的重用性和可维护性。 类模板&#xff08;Class Templates&#xff09; 类模板允许在类定…

服务端请求伪造(SSRF)

漏洞概述 服务器会根据用户提交的 URL 发送一个 HTTP 请求。使用用户指定的 URL &#xff0c; Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 如果没有对用户提交 URL 和远端服务器所返回的信息做合适的验证或过滤&#xff0c;就有可能存在 “ 请求伪造…

【微服务学习笔记(二)】Docker、RabbitMQ、SpringAMQP、Elasticseach

【微服务学习笔记&#xff08;二&#xff09;】Docker、RabbitMQ、SpringAMQP、Elasticseach Docker镜像和容器安装基础命令Dockerfile自定义镜像 MQ&#xff08;服务异步通讯&#xff09;RabbitMQ安装使用消息模型 SpringAMQP消息发送消息接收Work Queue 工作队列发布订阅Fano…

抖音小店精选联盟关闭了,是什么原因?怎么解决?

大家好&#xff0c;我是电商糖果 不知道大家有没有出现这样的情况&#xff0c;店铺后台的精选联盟莫名其妙的关闭了。 这里糖果就来给大家列举一下&#xff0c;出现联盟关闭的几种原因&#xff0c;以及怎么解决。 第一种&#xff1a;体验分低于70 这个是联盟关闭最常出现的情…

Python中的运算符介绍

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

使用Docker搭建Caddy

使用Docker搭建Caddy&#xff0c;可以快速部署一个轻量级的、支持自动HTTPS的web服务器。下面将分别介绍使用Docker CLI和Docker Compose两种方式来搭建Caddy服务器&#xff0c;并给出配置文件示例以及参数解释。 使用Docker CLI搭建Caddy 首先&#xff0c;确保你的系统上已安…

VR全景在智慧园区中的应用

VR全景如今以及广泛的应用于生产制造业、零售、展厅、房产等领域&#xff0c;如今720云VR全景更是在智慧园区的建设中&#xff0c;以其独特的优势&#xff0c;发挥着越来越重要的作用。VR全景作为打造智慧园区的重要角色和呈现方式已经受到了越来越多智慧园区企业的选择和应用。…

vue3 实现一个tab切换组件

一. 效果图 二. 代码 文件 WqTab.vue: <template><div ref"wqTabs" class"wq-tab"><template v-for"tab in tabs" :key"tab"><div class"tab-item" :class"{ ac: tabActive tab.key }" c…

网络地址转换协议NAT

网络地址转换协议NAT NAT的定义 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址&#xff08;即仅在本专用网内使用的专用地址&#xff09;&#xff0c;但现在又想和因…

浏览器缓存 四种缓存分类 两种缓存类型

浏览器缓存 本文主要包含以下内容&#xff1a; 什么是浏览器缓存按照缓存位置分类 Service WorkerMemory CacheDisk CachePush Cache 按照缓存类型分类 强制缓存协商缓存 缓存读取规则浏览器行为 什么是浏览器缓存 在正式开始讲解浏览器缓存之前&#xff0c;我们先来回顾一…

Python 的练手项目有哪些值得推荐?

Python 是一种强大的编程语言&#xff0c;有许多值得推荐的练手项目。以下是一些例子&#xff1a; 数据分析&#xff1a;利用 Python 的数据分析库&#xff08;如 pandas 和 NumPy&#xff09;处理和分析数据。你可以尝试对数据进行清洗、可视化&#xff0c;或者构建简单的预测…