力扣 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,则队列弹出,保证堆的大小一直为k
                pri_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::pair

int 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;

        
    }
};

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

这代码我先自己敲一遍

相关推荐

  1. | 347. K 高频元素

    2024-03-17 05:58:09       56 阅读
  2. 347k高频元素

    2024-03-17 05:58:09       42 阅读
  3. 347k高频元素

    2024-03-17 05:58:09       38 阅读
  4. 【数据结构与算法】 347. K 高频元素

    2024-03-17 05:58:09       39 阅读
  5. 347. K 高频元素

    2024-03-17 05:58:09       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 05:58:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 05:58:09       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 05:58:09       82 阅读
  4. Python语言-面向对象

    2024-03-17 05:58:09       91 阅读

热门阅读

  1. 数据结构 第5章 树与二叉树(一轮习题总结)

    2024-03-17 05:58:09       42 阅读
  2. 【List、Set、数据结构、Collections】-Collections

    2024-03-17 05:58:09       35 阅读
  3. 数据结构的概念大合集05(串)

    2024-03-17 05:58:09       37 阅读
  4. 这是二叉搜索树吗?

    2024-03-17 05:58:09       43 阅读
  5. 【MySql】MySql常用语句都有哪些

    2024-03-17 05:58:09       33 阅读
  6. 剑指offer面试题36 数组中的逆序对

    2024-03-17 05:58:09       42 阅读
  7. 【vue2源码】模版编译

    2024-03-17 05:58:09       34 阅读
  8. ChatGPT团队:介绍OpenAI团队生产力提升工具

    2024-03-17 05:58:09       34 阅读
  9. [蓝桥杯 2014 省 A] 波动数列

    2024-03-17 05:58:09       45 阅读
  10. 前端小白的学习之路(HTML5 一)

    2024-03-17 05:58:09       39 阅读
  11. HTML5

    HTML5

    2024-03-17 05:58:09      49 阅读