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;}
};
自己又写了一遍,有些名称改了改
这代码我先自己敲一遍