排序算法(二)

news2024/11/15 10:10:12

三、桶排序

先看定义:

桶排序会进行两次排序,一次将所有元素分配到不同的桶中,一次针对每个桶排序或再次排序所有元素。

练习题:

1)

力扣icon-default.png?t=N2N8https://leetcode.cn/problems/top-k-frequent-elements/这道题就是非常典型的桶排序,先将每个元素分配到桶(统计每个元素的出现频次),再根据频次排序每个桶。

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        map<int,int> mp;
        for(auto n:nums){
            mp[n]++;
        }

        vector<pair<int,int>> vt(mp.begin(), mp.end());
        sort(vt.begin(), vt.end(), [&](pair<int,int>& a, pair<int,int>& b){
            return a.second>b.second;
        });

        vector<int> res(k,0);
        for(int i=0;i<k;i++){
            res[i] = vt[i].first;
        }
        return res;
    }
};

2)

力扣icon-default.png?t=N2N8https://leetcode.cn/problems/sort-characters-by-frequency/这道题也是桶排序,可以用和上一道题一样的方法排序,也可以在第二次排序时以递归方式继续使用桶排序。

为了不重复,这题解法用的后者。

class Solution {
public:
    string frequencySort(string s) {
        unordered_map<char, int> mp;
        int max_count = 0;
        for(auto c:s){
            max_count = max(max_count, ++mp[c]);
        }

        vector<vector<char>> vt(max_count+1);
        for(auto m:mp){
            vt[m.second].push_back(m.first);
        }
        string res = "";
        for(int i=max_count;i>0;i--){
            if(vt[i].size()){
                for(auto v:vt[i]){
                    for(int j=0;j<i;j++){
                        res += v;
                    }
                }
            }
        }

        return res;


    }
};

四、多路排序

力扣icon-default.png?t=N2N8https://leetcode.cn/problems/sort-colors/这道题要有意义,那肯定是一遍遍历,那就考虑到同时给0,1,2三类元素排序。

解题思路:用三个指针,两个分别指向有序的0,2区间,另一个遍历整个数组,遇到0,与指向0区间的指针交换值,遇到2,与指向2区间的指针交换。(当然,指向2区间的指针换成指向1区间也是可以的)

需要注意的细节是遍历指针与2区间指针交换后,指向的值可能为0,所有不能直接自增。

代码:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left = 0, right = 0, end = nums.size()-1;
        while(right<=end){
            if(nums[right]==0)
                swap(nums[left++], nums[right++]);
            else if(nums[right]==2)
                swap(nums[end--], nums[right]);
            else 
                right++;
           
        }
        
    }
};

 

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

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

相关文章

NFS能使使用者访问网络上别处的文件就像在使用自己的计算机一样

先关闭selinux跟防火墙 安装NFS yum install nfs-utils -y 配置共享目录 mkdir /webdata 赋权 chmod 755 /webdata 修改配置文件 vim /etc/exports 换顺序启动 systemctl start rpc-bind systemct start nfs 测试 showmount -e 客户端挂载 创建共享目录 mkdir /we…

BUUCTF-rip

https://www.cnblogs.com/refrain-again/p/15001283.html 看了这个文章 我起码能理解我们栈溢出的目的 在做题之前 我们需要先理解 栈的存储方法 从上往下看 就能理解入栈 说回这道题目 为什么这道题目是栈溢出 1.查看基本信息 checksec file 是kali下的elf文件 相当于w…

ASEMI代理ADI亚德诺AD8061ARTZ-REEL7车规级芯片

编辑-Z AD8061ARTZ-REEL7芯片参数&#xff1a; 型号&#xff1a;AD8061ARTZ-REEL7 −3dB小信号带宽&#xff1a;320MHz −3dB大信号带宽&#xff1a;280MHz 0.1 dB平坦度的带宽&#xff1a;30MHz 斜率&#xff1a;650V/μs 总谐波失真&#xff1a;-77dBc 输入电压噪声&…

Kotlin | 这些隐藏的内存陷阱,你应该熟记于心

作者&#xff1a;Petterp 引言 Kotlin 是一个非常 yes 的语言&#xff0c;从 null安全 &#xff0c;支持 方法扩展 与 属性扩展&#xff0c;到 内联方法、内联类 等&#xff0c;使用Kotlin变得越来越简单舒服。但编程从来不是一件简单的工作&#xff0c;所有简洁都是建立在复杂…

电子招标采购系统:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

使用SpringAOP的方式修改controller接口返回的数据

1为什么需要修改返回接口的数据&#xff1f; 先看一个关于返回接口数据中包含时间的接口&#xff0c;如下接口中的birth属性&#xff0c;是日期&#xff0c;假设我们不做任何处理&#xff0c;那么在页面&#xff0c;我们看到的将是如下的时间显示效果&#xff0c;这明显不是我…

NVM-无缝切换Node版本

NVM-无缝切换Node版本 如果未使用nvm之前已经下载了node&#xff0c;并且配置了环境变量,那么此时删除这些配置(Node的环境以及Node软件),使用nvm是为了在某些项目中使用低版本的node NVM下载 进入github的nvm readme&#xff1a; https://github.com/coreybutler/nvm-windows…

企业如何利用数据打造新的人才战略?

由于利率上升、能源价格上涨、政治不确定性、全球供应限制以及寻找和资助昂贵人才的问题&#xff0c;企业的优先事项&#xff0c;也就是人们的优先事项&#xff0c;正在以前所未有的速度发生转变。在数据的基础之上迅速做出正确决策&#xff0c;并灵活精准地向他人传达意义。 …

必要的项目管理软件因素

什么样的项目管理软件好&#xff1f;对于一个项目团队来说&#xff0c;从项目开始到项目结束&#xff0c;需要多个部门的配合。每个成员可能会参与一个以上的项目&#xff0c;这通常需要并行的多个项目。据介绍&#xff0c;国外90%以上的项目是用软件管理的&#xff0c;而中国只…

dump 定位分析

在缺少pdb的时候如何分析dump&#xff1f; windbgidaWindbg定位崩溃位置 通过windbg打开dump&#xff0c;并且分析dump !analyze -v 分析&#xff1a; 分析dump&#xff1a; !analyze -v错误原因&#xff1a;读取空指针错误线程&#xff1a;00001e04&#xff0c;可通过命令…

【Linux进阶篇】磁盘及分区

目录 &#x1f341;文件系统 &#x1f342;虚拟机添加磁盘 &#x1f342;磁盘分区方式 &#x1f342;分区格式化 &#x1f342;挂载磁盘 &#x1f341;磁盘高级管理 &#x1f342;LVM&#xff1a;逻辑卷 &#x1f343;创建PV 物理卷 &#x1f343;创建VG 卷组 &#x1f343;创建…

说说你对 Webpack 的理解?解决了什么问题?

1、对webpack的理解 简单来说&#xff0c;webpack 是一个用于现代JavaScript应用程序的静态模块打包工具。 当 webpack处理应用程序时&#xff0c;它会在内部构建一个依赖图&#xff0c;此依赖图对应映射到项目所需的每个模块&#xff08;不再局限js文件&#xff09;&#xf…

【数据结构与算法】 - 双向链表 - 详细实现思路及代码

目录 一、概述 二、双向链表 三、双向链表实现步骤  &#x1f4cc;3.1 C语言定义双向链表结点  &#x1f4cc;3.2 双向链表初始化  &#x1f4cc;3.3 双向链表插入数据  &#x1f4cc;3.4 双向链表删除数据  &#x1f4cc;3.5 双向链表查找数据  &#x1f4cc;3.6 双向链…

总线仿真与测试工具CANoe介绍(图文并茂)

1、什么是CANoe CANoe是德国Vector公司的一款用于开发、测试和分析单个ECU和整个ECU网络的综合性工具,包括软件和硬件。它在整个开发过程中为网络设计者、开发和测试工程师提供支持:从规划到系统级测试。由于其多种变体和功能能够对不同的项目提供支持,被全球OEM和供应商广…

USB 速度识别

文章目录USB 速度识别低速设备全速设备高速设备空闲状态低速 / 全速设备高速设备SE0SE1USB 速度识别 在 USB host 或者 hub 的每个下行端口&#xff08;downstream facing port&#xff09;的 D 和 D- 上分别接了一个 15KΩ 的下拉电阻到地&#xff0c;这样&#xff0c;当端口…

SpringBoot自动装配原理(附面试快速答法)

文章目录SpringBoot自动装配原理1. 从调用SpringApplication构造器方法开始2. 解析启动类4.按需装配4.1 分析dubbo自动装配5. 如果定义自己的starter6. 面试答法SpringBoot自动装配原理 之前面试被问到这个题目&#xff0c;只会答一些spi、AutoConfigration注解、Import之类的&…

《SQLi-Labs》01. Less 1~5

Less-1 ~ Less-5 前言Less-1知识点题解 Less-2题解 Less-3题解 Less-4题解 Less-5知识点题解 sqli。开启新坑。 前言 对于新手&#xff0c;为了更加直观的看到 sql 注入语句&#xff0c;可以在以下文件添加两句&#xff1a; echo $sql; # 将构造的 sql 语句进行输出 echo &qu…

Maven依赖冲突分析和解决

使用maven管理jar包依赖时&#xff0c;可能会出现jar包版本冲突&#xff0c;不同版本的api调用方式可能不同&#xff0c;会出现NoSuchMethodError和ClassNotFoundException问题&#xff0c;甚至编译不通过&#xff0c;如&#xff1a;在common-lang3 的3.8.1版本中MethodUtils::…

Python中的@cache巧妙用法

缓存是一种空间换时间的策略&#xff0c;缓存的设置可以提高计算机系统的性能&#xff0c;这篇文章主要介绍了Python中的cache巧妙用法,需要的朋友可以参考下 Python中的cache有什么妙用&#xff1f; 缓存是一种空间换时间的策略&#xff0c;缓存的设置可以提高计算机系统的性…

Spark 简介与原理

目录标题1 Spark 简介与原理1.1 Spark与Hadoop的区别1.2 Spark的应用场景1.3 Spark的作业运行流程1.4 Spark 2.X与Spark 1.X的区别1 Spark 简介与原理 Spark 是一个大规模数据处理的统一分析引擎。 具有迅速、通用、易用、支持多种资源管理器的特点。 Spark生态系统: Spark SQL…