桶排序!!

桶排序

  • 算法描述
    • bucketSort函数
    • bucketSort完整代码
    • topKFrequent函数
    • topKFrequent完整代码
  • 完整代码

算法描述

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

bucketSort函数

这个函数将输入数组根据元素出现的频率进行排序,并将结果存入桶(bucket)中。

bucketSort完整代码

void bucketSort(ArrayType& items, vector<vector<BucketType>>& bucket)
{unordered_map<BucketType, int> hash;int n = items.size();for (auto& x : items)hash[x]++;                                             // 1for (int i = 0; i <= n; i++)bucket.push_back({});                                  // 2for (auto it = hash.begin(); it != hash.end(); it++)bucket[it->second].push_back(it->first);               // 3for (int i = 0; i <= n; i++)sort(bucket[i].begin(), bucket[i].end());              // 4
}
  1. 计数:遍历items数组,将每个元素及其出现次数存入hash哈希表中
  2. 初始化桶:创建一个大小为n+1的桶数组bucket。每个桶是一个vector,起始为空。
  3. 分配元素到桶:根据哈希表中的频率,将元素放入对应频率的桶中。例如,出现频率为3的元素会被放入bucket[3]中。
  4. 桶内排序:对每个桶内部的元素进行排序。

topKFrequent函数

这个函数调用 bucketSort 对输入数组进行预处理,然后从桶中提取出出现频率最高的 k 个元素。

topKFrequent完整代码

vector<int> topKFrequent(vector<int>& nums, int k)
{vector<vector<BucketType>> bucket;vector<int> res;                                          // 1bucketSort(nums, bucket);                                 // 2for (int i = bucket.size() - 1; i >= 0; i--)              // 3.1{for (int j = bucket[i].size() - 1; j >= 0; j--)       // 3.2{res.push_back(bucket[i][j]);                      // 3.3if (--k == 0)return res;}}return res;
}
  1. 初始化:定义一个二维向量bucket来存桶,一个向量res来存储结果。
  2. 调用bucketSort:对nums数组进行桶排序,将结果存储在bucket中。
  3. 收集结果:
    • 从后向前遍历桶数组(从高频率向低频率)。
    • 从每个桶内部的末尾向前遍历元素(因为桶内部已经排好序)
    • 将元素加入结果res中,直到收集到k个元素。

完整代码

#include <iostream>
#include <map>
#define BucketType int
#define ArrayType vector<int>
using namespace std;void bucketSort(ArrayType& items, vector<vector<BucketType>>& bucket)
{unordered_map<BucketType, int> hash;int n = items.size();//将每个元素放入哈希表进行计数for (auto& x : items)hash[x]++;//初始化桶,起初都为空for (int i = 0; i <= n; i++)bucket.push_back({});//把元素塞入对应的桶for (auto it = hash.begin(); it != hash.end(); it++)bucket[it->second].push_back(it->first);//桶内排序for (int i = 0; i <= n; i++)sort(bucket[i].begin(), bucket[i].end());
}
vector<int> topKFrequent(vector<int>& nums, int k)
{vector<vector<BucketType>> bucket;vector<int> res;bucketSort(nums, bucket);for (int i = bucket.size() - 1; i >= 0; i--){for (int j = bucket[i].size() - 1; j >= 0; j--){res.push_back(bucket[i][j]);if (--k == 0)return res;}}return res;
}
int main()
{vector<int> nums = {1, 1, 1, 2, 2, 3};int k = 2;vector<int> result = topKFrequent(nums, k);for (int num : result){cout << num << " ";}cout << endl;return 0;
}

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

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

相关文章

Scrapy与MongoDB的异步数据存储

在数据采集过程中&#xff0c;处理大量的数据请求和存储任务是常见的需求。使用Scrapy来爬取数据并将其存储到MongoDB中是一个高效的解决方案。本文将介绍如何实现一个异步插入MongoDB的Scrapy管道。 项目背景 在本项目中&#xff0c;我们需要从某些公开网站上爬取数据&#…

java安装并配置环境

安装前请确保本机没有java的残留&#xff0c;否则将会安装报错 1.安装java jdk&#xff1a;安装路径Java Downloads | Oracle 中国 百度网盘链接&#xff1a;https://pan.baidu.com/s/11-3f2QEquIG3JYw4syklmQ 提取码&#xff1a;518e 2.双击 按照流程直接点击下一步&#x…

618:带货短剧,阿里VS拼多多的新战场

霸道总裁爱上我、穿越回古代成为后宫之主...让人上头的短剧今年持续升温&#xff0c;成为不少人的“电子榨菜”。 今年618&#xff0c;短剧又变身火热的主角&#xff0c;成为各大平台和品牌的新战场。 淘宝早在“逛逛”板块的二级页面&#xff0c;增加了名为“剧场”的板块&a…

机器学习实验------PCA

目录 一、介绍 二、算法流程 &#xff08;1&#xff09;数据中心化 &#xff08;2&#xff09;计算协方差矩阵 &#xff08;3&#xff09;特征值分解 &#xff08;4&#xff09;选择特征 三、运行结果展示 四、实验中遇到的问题 五、PCA的优缺点 优点&#xff1a; 缺点…

vue相关的前端知识回顾

nvm的安装 nvm 是一个 nodejs 版本管理工具。 使用 nvm 可以安装不同版本的 nodejs。也能够实时的切换不同的版本的NodeJS。 官方文档&#xff1a;https://github.com/nvm-sh/nvm 安装命令&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/in…

联想正式发布全栈算力基础设施新品,加速筑基AI 2.0时代

6月14日&#xff0c;以“异构智算 稳定高效”为主题的联想算力基础设施新品发布会在北京成功举办。 据「TMT星球」了解&#xff0c;在与会嘉宾和合作伙伴的见证下&#xff0c;联想正式发布率先搭载英特尔至强 6能效核处理器的联想问天WR5220 G5、联想ThinkSystem SR630 V4、联…

前端传递bool型后端用int收不到

文章目录 背景模拟错误点解决方法 背景 我前几天遇到一个低级错误&#xff0c;就是我前端发一个请求&#xff0c;把参数送到后端&#xff0c;但是我参数里面无意间传的布尔型&#xff08;刚开始一直没注意到&#xff0c;因为当时参数有十几个&#xff09;&#xff0c;但是我后…

Python-算法编程100例-系统设计题(入门级)-疫情人员管理

题目描述&#xff1a; 现有一套用于管理疫情下人员流动风险的软件系统&#xff0c;请实现以下接口&#xff1a; RiskMonitor(int[] people):系统初始化&#xff0c;people[i]的下标表示人员编号&#xff0c;值表示所在地区的编号。初始时所有地区&#xff08;包括没人的地区&…

“土猪拱白菜” 的学霸张锡峰,如今也苦于卷后端

大家好&#xff0c;我是程序员鱼皮&#xff0c;前几天在网上刷到了一个视频&#xff0c;是对几年前高考励志演讲的学霸张锡峰的采访。 不知道大家有没有看过他的演讲视频。在演讲中&#xff0c;衡水中学的学霸张锡峰表达了城乡孩子差距大、穷人家的孩子只想要努力成为父母的骄…

[C#]使用C#部署yolov10的目标检测tensorrt模型

【测试通过环境】 win10 x64vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super cuda和tensorrt版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;T…

博客论坛系统java博客管理系统基于springboot+vue的前后端分离博客论坛系统

文章目录 博客论坛系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 博客论坛系统 一、项目演示 博客论坛系统 二、项目介绍 基于springbootvue的前后端分离博客论坛系统 系统角色&#xff1a…

java程序员写博客的方法论

作为一名Java程序员&#xff0c;撰写技术博客是一种提升个人品牌、分享知识以及巩固学习成果的有效方式。以下是一些关于如何高效撰写高质量Java技术博客的方法论建议&#xff1a; 1. 明确目标受众 确定你的读者是谁&#xff1a;初学者、中级开发者还是高级工程师&#xff1f…

【Qt】QT textBrowser 设置字体颜色和大小

1. 效果 2. 代码 {ui->methodText->append("<font size9 colorgreen> dddddddddd </font>");ui->methodText->append("<font size9 colorred> vvvvvvvvvv </font>"); }

局域网监控软件有哪些:五款好用的网络监控神器分享(收藏篇)

在日益复杂的企业网络环境中&#xff0c;有效地监控局域网内的活动对于确保网络安全、提高工作效率和维护企业资产至关重要。 为此&#xff0c;精选了五款市场上广受好评的局域网监控软件&#xff0c;它们各自具备独特的功能和优势&#xff0c;能够满足不同规模企业的需求&…

如何开发高效服务(C++ )

在 C 开发高效服务器时&#xff0c;常用的开发模式和设计模式能够帮助你构建高效、可扩展和可维护的服务器。以下是一些常见的模式和设计模式&#xff1a; 1. 并发和并行编程模型 1.1 Reactor 模式 Reactor 模式是一种事件驱动设计模式&#xff0c;广泛用于高性能服务器编程…

【七合一】字典词典成语古诗词造句英语单词文库

帝国CMS7.5 UTF-8 系统开源&#xff0c;不限域名 采用静态伪静态&#xff08;会缓存静态文件&#xff09; 一款7合一的字词句诗典籍模板&#xff0c;包含字典、词典、成语、名句、诗词、古籍、英语、作文、等等。是一款养站神器。 作文范文,作文范文可生成word文档下载能自由…

【面经总结】Java集合 - Map

Map 概述 Map 架构 HashMap 要点 以 散列(哈希表) 方式存储键值对&#xff0c;访问速度快没有顺序性允许使用空值和空键有两个影响其性能的参数&#xff1a;初始容量和负载因子。 初始容量&#xff1a;哈希表创建时的容量负载因子&#xff1a;其容量自动扩容之前被允许的最大…

矩阵练习2

48.旋转图像 规律&#xff1a; 对于矩阵中第 i行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组&#xff0c;如果不想使用额外的内存&#xff0c;可以用一个临时变量 。 还可以通…

【Linux】进程_4

文章目录 五、进程4. 进程状态5. 进程优先级6. 进程的调度和转换 未完待续 五、进程 4. 进程状态 当进程属于挂起状态时&#xff0c;进程的可执行程序代码和数据均会被从内存中换入到磁盘中&#xff0c;此时进程的PCB并没有消失&#xff0c;只要操作系统还需要管理这个进程&a…

C++11左值、右值

知识回顾&#xff0c;详解引用 简单概括&#xff0c;引用就是给已存在对象取别名&#xff0c;引用变量与其引用实体共用同一块内存空间 左右值区分 注意&#xff1a;不一定左边的都是左值&#xff0c;右边的都是右值 左边的也可能是右值&#xff0c;等号右边的也可能是左值 …