做民宿网站的系统可行性/网络公司起名

做民宿网站的系统可行性,网络公司起名,有什么网站做任务换q币吗,百度提交入口的使用方法LeetCode 热题 100_前 K 个高频元素(73_347) 题目描述:输入输出样例:题解:解题思路:思路一(哈希表排序):思路二(哈希表优先队列(小根堆&#xff0…

LeetCode 热题 100_前 K 个高频元素(73_347)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(哈希表+排序):
        • 思路二(哈希表+优先队列(小根堆)):
      • 代码实现
        • 代码实现(思路一(哈希表+排序)):
        • 代码实现(思路二(哈希表+优先队列(小根堆))):
        • 以思路二为例进行调试
        • 部分代码解读

题目描述:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

输入输出样例:

示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:
输入: nums = [1], k = 1
输出: [1]

提示:
1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

题解:

解题思路:

思路一(哈希表+排序):

1、创建一个哈希表,key来存储数组中元素,value存储对应key出现的次数。对value进行快速排序。提取排序后,前k个元素的值。

2、复杂度分析:
① 时间复杂度:O(nlogn),n为数组中元素的个数
    遍历 nums 数组中的每个元素,将其出现的频率存储到 unordered_map 中。这个过程的时间复杂度是 O(n)。
    将 unordered_map 的元素复制到 vector 中,这个操作的时间复杂度是 O(n)。
    对 tmp 中的元素进行排序,排序的时间复杂度是 O(n log n)。
    从排序后的 tmp 中选择前 k 个元素并将它们添加到 ans 中,这个过程的时间复杂度是 O(k)。
② 空间复杂度:O(n + log n),除返回答案的空间外,unordered_map 的空间复杂度是 O(n),vector<pair<int, int>> tmp 的空间复杂度是 O(n)。快速排序,空间复杂度是 O(log n)

思路二(哈希表+优先队列(小根堆)):

1、创建一个哈希表,key来存储数组中元素,value存储对应key出现的次数。创建可以维持 k 个元素的小根堆(根据value大小进行插入),这样在插入元素大于 k 时可以将堆顶的元素移出(优先级队列就是一个披着队列外衣的堆)。

2、复杂度分析
① 时间复杂度:O(n log k),其中 n 是输入数组的长度,k 是要求的前 k 个频率最高的元素。遍历 nums 数组并将每个元素的出现频率存入 unordered_map中为 O(n)。将元素插入最小堆O(n log k)。从堆中弹出元素并构建结果数组 O(k log k)。
② 空间复杂度: O(n + k),哈希表存储每个数字及其频率,最坏情况下需要存储所有 n 个数字 O(n)。最小堆的最大大小为 O(k)。

代码实现

代码实现(思路一(哈希表+排序)):
class Solution1 {
public:// 函数接受一个整数数组 nums 和一个整数 k, 返回出现频率最高的 k 个元素vector<int> topKFrequent(vector<int>& nums, int k) {// 使用 unordered_map 来统计每个数字出现的频率unordered_map<int,int> count;// 遍历 nums 数组,统计每个数字的出现次数for (int &num : nums){count[num]++; // 每遇到一个 num,就将对应的频率加 1}// 将 unordered_map 中的元素复制到一个 vector 中,以便进行排序vector<pair<int,int>> tmp(count.begin(), count.end());// 对 tmp 中的元素进行排序,按照频率降序排序// 使用 lambda 表达式作为排序规则sort(tmp.begin(), tmp.end(), [](pair<int,int>& a, pair<int,int>& b) { return a.second > b.second; // 如果 a 的频率大于 b 的频率,返回 true });// 创建一个结果 vector 来存放出现频率最高的 k 个元素vector<int> ans;// 选择排序后的前 k 个元素的第一个值(即数字)到 ans 中for (int i = 0; i < k; i++){ans.emplace_back(tmp[i].first); // 将 tmp 中的第 i 个元素的第一个值添加到 ans}return ans; // 返回结果}
};
代码实现(思路二(哈希表+优先队列(小根堆))):
class Solution2 {
private:// 自定义比较器类,用于堆的排序class Compare {public:// 重载比较运算符,按照频率(second)大小进行比较bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {// 如果左边的频率大于右边,返回true。这样堆中频率小的元素会排在堆顶。return lhs.second > rhs.second;}};public:// topKFrequent 函数返回数组中出现频率前k大的元素vector<int> topKFrequent(vector<int>& nums, int k) {// 使用 unordered_map 来存储每个元素及其出现的频率unordered_map<int, int> count;// 统计数组中每个元素的出现次数for (int i = 0; i < nums.size(); i++) {count[nums[i]]++;}// 创建一个最小堆来保存频率前 k 大的元素// priority_queue 的第三个参数是自定义的比较器 Compare,确保堆顶是频率最小的元素priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> min_head;// 遍历计数哈希表,将每个元素(和其频率)加入到堆中for (auto& i : count) {min_head.push(i); // 将元素及其频率压入堆// 如果堆的大小超过了 k,则弹出堆顶元素(频率最小的元素)if (min_head.size() > k) {min_head.pop();}}// 用来存储最终的前 k 个频率最大的元素vector<int> ans(k);// 从堆中依次弹出元素,存入答案数组// 由于堆顶是频率最小的元素,因此我们从堆顶弹出并将元素存入结果数组for (int i = k - 1; i >= 0; i--) {ans[i] = min_head.top().first; // 获取堆顶元素的值(即数字)min_head.pop(); // 弹出堆顶元素}return ans; // 返回包含频率前 k 大的元素的数组}
};
以思路二为例进行调试
#include<iostream>
#include <vector>
#include<unordered_map>
#include<algorithm>
#include <queue>
using namespace std;class Solution2 {
private:// 自定义比较器类,用于堆的排序class Compare {public:// 重载比较运算符,按照频率(second)大小进行比较bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {// 如果左边的频率大于右边,返回true。这样堆中频率小的元素会排在堆顶。return lhs.second > rhs.second;}};public:// topKFrequent 函数返回数组中出现频率前k大的元素vector<int> topKFrequent(vector<int>& nums, int k) {// 使用 unordered_map 来存储每个元素及其出现的频率unordered_map<int, int> count;// 统计数组中每个元素的出现次数for (int i = 0; i < nums.size(); i++) {count[nums[i]]++;}// 创建一个最小堆来保存频率前 k 大的元素// priority_queue 的第三个参数是自定义的比较器 Compare,确保堆顶是频率最小的元素priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> min_head;// 遍历计数哈希表,将每个元素(和其频率)加入到堆中for (auto& i : count) {min_head.push(i); // 将元素及其频率压入堆// 如果堆的大小超过了 k,则弹出堆顶元素(频率最小的元素)if (min_head.size() > k) {min_head.pop();}}// 用来存储最终的前 k 个频率最大的元素vector<int> ans(k);// 从堆中依次弹出元素,存入答案数组// 由于堆顶是频率最小的元素,因此我们从堆顶弹出并将元素存入结果数组for (int i = k - 1; i >= 0; i--) {ans[i] = min_head.top().first; // 获取堆顶元素的值(即数字)min_head.pop(); // 弹出堆顶元素}return ans; // 返回包含频率前 k 大的元素的数组}
};int main(int argc, char const *argv[])
{vector<int> nums={1,1,1,2,2,3};int k=2;Solution2 s2;vector<int> ans=s2.topKFrequent(nums,k);cout<<"[";for (int i = 0; i < ans.size(); i++){cout<<ans[i];if (i!=ans.size()-1){cout<<",";}}cout<<"]";return 0;
}
部分代码解读

比较器是 lambda 表达式

sort(tmp.begin(), tmp.end(), [](pair<int,int>& a, pair<int,int>& b) { return a.second > b.second; // 如果 a 的频率大于 b 的频率,返回 true 
});

最常见的比较器是 lambda 表达式,因为它:
非常简洁,适用于大多数场景,特别是排序、查找等常用算法。
可以在需要时动态定义比较逻辑,而不需要额外定义函数或类。

Compare:自定义比较器类 (Functor)

class Compare {
public:// 重载比较运算符,按照频率(second)大小进行比较bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {// 如果左边的频率大于右边,返回true。这样堆中频率小的元素会排在堆顶。return lhs.second > rhs.second;}
};
priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> min_head;

Compare:自定义比较器类 (Functor)
pair<int, int> 是一个由两个 int 类型元素组成的模板类,它可以存储一对值。
这里的 vector<pair<int, int>> 表示堆的底层容器是一个 pair<int, int> 类型的 vector。
优点:
复用性强:可以在多个地方使用相同的比较逻辑,不需要每次都重新定义。
性能较好:在某些情况下,函数对象(类)可能比 lambda 表达式稍微高效,因为它可以在编译时优化。
适合复杂逻辑:当比较逻辑较复杂时,使用类比 lambda 更加清晰和易于管理。
缺点:
代码较多:需要定义一个额外的类,增加了代码的复杂性,尤其是对于简单的比较。

LeetCode 热题 100_前 K 个高频元素(73_347)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

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

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

相关文章

使用Python在Word中生成多种不同类型的图表

目录 工具与环境配置 在 Word 中创建图表的步骤 在Word中创建柱形图 在Word中创建条形图 在Word中创建折线图 在Word中创建饼图 在Word中创建散点图 在Word中创建气泡图 在 Word 文档中插入图表不仅能更直观地呈现数据&#xff0c;还能提升文档的可读性和专业性。常见的…

项目-个人博客测试报告

目录 一、项目背景 二、项目功能 三、测试计划 &#xff08;1&#xff09;功能测试 &#xff08;2&#xff09;自动化测试 &#xff08;3&#xff09;性能测试 一、项目背景 1、个人博客系统是一个操作简单的基于Spring前后端分离的项目&#xff0c;同时使用MySQL数据库来进…

如何使用HACS一键集成米家与果家设备到HomeAssistant玩转智能家居

文章目录 前言1. 下载HACS源码2. 添加HACS商店3. 绑定米家设备 前言 各位科技潮人和智能家居发烧友们&#xff0c;是不是也梦想着把家里变成一个高科技的空间&#xff1f;有了群晖NAS这位得力助手&#xff0c;不仅存储空间大得吓人&#xff0c;还能通过Docker轻松安装各种应用…

《Java对象“比武场“:Comparable与Comparator的巅峰对决》

目录 引言&#xff1a; 一、认识接口 1.1 Comparable 1.2 Comparator ​编辑 1.3 核心概念对比 二、代码实现对比 2.1 Comparable 实现示例 2.2 Comparator 实例示例 三、核心区别详解 3.1 设计理念差异 3.2 方法调用 3.3 使用情景 四、本质区别总结 引言&#x…

Android自动化测试工具

细解自动化测试工具 Airtest-CSDN博客 以下是几种常见的Android应用自动化测试工具&#xff1a; Appium&#xff1a;支持多种编程语言&#xff0c;如Java、Python、Ruby、JavaScript等。可以用于Web应用程序和原生应用程序的自动化测试&#xff0c;并支持iOS和Android平台。E…

vue3:八、登录界面实现-页面初始搭建、基础实现

一、初始工作 1、创建登录文件 在src/views中创建文件LoginView.vue文件 2、创建路由 在router/index.js中增加登录的信息 代码 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue const router createRouter({hist…

Qt从入门到入土(十) -数据库操作--SQLITE

认识 数据库是用于存储、管理和检索数据的系统化集合。它是一种按照特定结构组织数据的存储方式&#xff0c;通过软件&#xff08;数据库管理系统&#xff0c;DBMS&#xff09;来实现数据的高效存储、查询、更新和管理。通过文件存储数据适用于少量的数据&#xff0c;而当拥有…

图像分类数据集

《动手学深度学习》-3.5-学习笔记 # 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式&#xff0c; # 并除以255使得所有像素的数值均在0&#xff5e;1之间 trans transforms.ToTensor()#用于将图像数据从 PIL 图像格式&#xff08;Python Imaging Library&#xff…

架构师面试(十五):熔断设计

问题 某电商平台经常需要在大促运营活动中暂停评论、退款等业务&#xff0c;基于服务治理的设计理念&#xff0c;我们需要对该电商平台微服务系统的【服务熔断】进行设计&#xff0c;对此下面描述中说法正确的有哪几项呢&#xff1f; A. 服务管控系统管理着平台中所有服务之间…

Ubuntu20.04安装运行DynaSLAM

目录 一、安装Anaconda 二、相关依赖库安装 1、boost安装 2、Eigen 3安装 3、opencv安装 4、Pangolin安装 三、配置Mask_RCNN环境 四、DynaSLAM编译 五、DynaSLAM运行 一、安装Anaconda 打开以下链接&#xff1a; Index of / 下载和自己系统匹配的安装包。这里下…

X86 RouterOS 7.18 设置笔记三:防火墙设置(IPV4)

X86 j4125 4网口小主机折腾笔记五&#xff1a;PVE安装ROS RouterOS X86 RouterOS 7.18 设置笔记一&#xff1a;基础设置 X86 RouterOS 7.18 设置笔记二&#xff1a;网络基础设置(IPV4) X86 RouterOS 7.18 设置笔记三&#xff1a;防火墙设置(IPV4) X86 RouterOS 7.18 设置笔记四…

从 YOLOv1 到 YOLOv2:目标检测的进化之路

引言 你有没有想过&#xff0c;当你用手机拍一张照片&#xff0c;里面的人、车、狗是怎么被自动识别出来的&#xff1f;这背后靠的就是目标检测技术。目标检测是计算机视觉中的一个重要领域&#xff0c;它不仅要回答“图片里有什么”&#xff0c;还要告诉你“这些东西在哪里”…

数据的存储---整型、浮点型

目录 一、整型在内存中的存储 1. 原码、反码、补码 2. 大端与小端 二、浮点数在内存中的存储 1.浮点数的存 2. 浮点数的取 3. 题目解析 一个变量的创建需要在内存中开辟空间&#xff0c;而开辟的空间大小是由数据类型决定的。下面我们就来讨论一下整型、浮点型在内存中的…

Java 大视界 -- Java 大数据在智能教育虚拟实验室建设与实验数据分析中的应用(132)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

47.全排列 II

47.全排列 II 力扣题目链接 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出…

centos没有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc

04 1个路由器配置一个子网的dhcp服务

前言 这是最近一个朋友的 ensp 相关的问题, 这里来大致了解一下 ensp, 计算机网络拓扑 相关基础知识 这里一系列文章, 主要是参照了这位博主的 ensp 专栏 这里 我只是做了一个记录, 自己实际操作了一遍, 增强了一些 自己的理解 当然 这里仅仅是一个 简单的示例, 实际场景…

网络空间安全(31)安全巡检

一、定义与目的 定义&#xff1a; 安全巡检是指由专业人员或特定部门负责&#xff0c;对各类设施、设备、环境等进行全面或重点检查&#xff0c;及时发现潜在的安全隐患或问题。 目的&#xff1a; 预防事故发生&#xff1a;通过定期的安全巡检&#xff0c;及时发现并解决潜在的…

信息学奥赛一本通 1449:【例题2】魔板

题目 1449&#xff1a;【例题2】魔板 分析 首先注意&#xff1a;输入是按顺时针给出的&#xff0c;但我们处理时需要按正常顺序排&#xff0c;可以用以下代码读入 string s(8, 0); // 初始化全零字符串 cin>>s[0]>>s[1]>>s[2]>>s[3]; cin>>…

Unity开发的抖音小游戏接入抖音开放平台中的流量主(抖音小游戏接入广告)

前言:作者在进行小游戏审核版本的过程中,碰到了下列问题,所以对这个抖音小游戏接入广告研究了下。 还有就是作者的TTSDK版本号是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的两个版本号保持一致,因为我发现TTSDK旧版的很多函数在新版中就已经无法正常使用了,必…