【20230221】【剑指1】排序(中等)II

news2025/1/17 2:56:52

1.最小的K个数

sort直接用太无脑了,虽然底层实现也是快排,但是快排还是得会写啊

快速排序

快速排序算法有两个核心点,分别为 “哨兵划分” 和 “递归” 。

哨兵划分操作: 以数组某个元素(一般选取首元素)为 基准数 ,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。

class Solution {
public:
    void quickSort(vector<int>&arr,int l,int r){
        //如果数组长度为1时停止
        if(l>=r)    return;
        int i=l,j=r;
        while(i<j)
        {
            while(i<j&&arr[j]>=arr[l])  j--;
            while(i<j&&arr[i]<=arr[l])  i++;
            swap(arr[i],arr[j]);
        }
        swap(arr[l],arr[i]);
        quickSort(arr,l,i-1);
        quickSort(arr,i+1,r);

    }
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        quickSort(arr,0,arr.size()-1);
        vector<int> res;
        res.assign(arr.begin(),arr.begin()+k);
        return res;
    }
};

2.数据流中的中位数

双优先队列

优先队列和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队

优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的

和队列基本操作相同:

  • top 访问队头元素

  • empty 队列是否为空

  • size 返回队列内元素个数

  • push 插入元素到队尾 (并排序)

  • emplace 原地构造一个元素并插入队列

  • pop 弹出队头元素

  • swap 交换内容

定义:priority_queue<Type, Container, Functional>

Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
#include<iostream>
#include <queue>
using namespace std;
int main() 
{
    //对于基础类型 默认是大顶堆
    priority_queue<int> a; 
    //等同于 priority_queue<int, vector<int>, less<int> > a;
    
  
    priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆
    priority_queue<string> b;

    for (int i = 0; i < 5; i++) 
    {
        a.push(i);
        c.push(i);
    }
    while (!a.empty()) 
    {
        cout << a.top() << ' ';
        a.pop();
    } 
    cout << endl;

    while (!c.empty()) 
    {
        cout << c.top() << ' ';
        c.pop();
    }
    cout << endl;

    b.push("abc");
    b.push("abcd");
    b.push("cbd");
    while (!b.empty()) 
    {
        cout << b.top() << ' ';
        b.pop();
    } 
    cout << endl;
    return 0;
}

输出:

4 3 2 1 0
0 1 2 3 4
cbd abcd abc
class MedianFinder {
private:
    priority_queue<int,vector<int>,less<int>> queMin;//大顶堆--存放较小的值
    priority_queue<int,vector<int>,greater<int>> queMax;//小顶堆--存放较大的值
public:
    /** initialize your data structure here. */
    MedianFinder() {

    }
    
    void addNum(int num) {
        if(queMin.size()==queMax.size())
        {
            //如果两个队列里元素数量相同,优先往小顶堆里加
            queMax.push(num);
            int top=queMax.top();
            queMax.pop();
            queMin.push(top);
        }
        else
        {
            //如果元素的数量不同,往大顶堆里加
            queMin.push(num);
            int top=queMin.top();
            queMin.pop();
            queMax.push(top);
        }
    }
    
    double findMedian() {
        if(queMax.size()==queMin.size())    return (queMax.top()+queMin.top())/2.0;
        //右边数量一直是大于等于左边的
        else return queMin.top();
    }
};

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

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

相关文章

教你编写SQLMap的Tamper脚本过狗

测试环境 最新版某狗 测试方法 安全狗其实是比较好绕的WAF&#xff0c;绕过方法很多&#xff0c;但这里我们就用一种&#xff1a;注释混淆 一招鲜吃遍天 注释混淆&#xff0c;其实就是在敏感位置添加垃圾字符注释&#xff0c;常用的垃圾字符有/、!、*、%等 这里再解释一下…

nodejs基于vue高校学报论文在线投稿系统

在新发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;高校只能以工作人员为导向&#xff0c;以稿件的持续创新作为高校最重要的竞争手段。 可定制框架:ssm/Sprin…

铅酸蓄电池废水除铅项目,出水做到0.05mg/l

某集团公司铅酸蓄电池废水除铅项目 工艺选择 沉淀系统过滤系统螯合树脂除铅系统 工艺原理 铅离子沉淀后进入螯合树脂除铅树脂 项目背景 铅酸蓄电池具有可逆性、电压特性平稳、放电量大、造价低廉等优点&#xff0c;应用于国民经济各个领域&#xff0c;但在其生产过程中&…

vue3 布局样式的原理

style scoped <style scoped > 它的 CSS 只作用于当前组件中的元素&#xff0c;如果子组件只有一个根元素&#xff0c;也会被渗透 原理&#xff1a; 当我们再组建中使用scoped时&#xff0c;vue会自动为组件中所有元素生成一个随机的属性&#xff0c;形如&#xff1a;da…

01背包—动态规划

一、背包问题概述&#xff1a; 二、暴力解法&#xff1a; 重量价值物品0115物品1320物品2430 背包最大容量为4。 每一个物品有两个状态&#xff0c;“取”或者“不取”。利用回溯法可以暴力枚举所有物品的状态的排列组合状态&#xff0c;与背包最大容量比较就可以求得最大的价…

Cloudflared 内网穿透 使用记录

Cloudflared 内网穿透前提创建cloudflared tunnel我使用的服务前提 你必须要有一个域名&#xff0c;并且可以改域名的dns解析服务商到cloudflare 1.登录到cloudflare后台&#xff0c;点击添加站点 2.输入自己的域名&#xff0c;下一步选择免费套餐 3.他会搜索这个域名下已有…

iOS自动化打包

测试阶段一般会发生这样的场景&#xff0c;测试拼命的提 Bug&#xff0c;开发拼命的改 Bug&#xff0c;改完重新打包发给测试进行复测&#xff0c;那这个过程中频繁的打包肯定是不可避免的。如果使用 Xcode 打包&#xff0c;在打包期间我们是无法改剩余的 Bug 或进行其他模块的…

大规模 IoT 边缘容器集群管理的几种架构-3-Portainer

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad大规模 IoT 边缘容器集群管理的几种架构-3-Portainer &#x1f4da;️Reference…

你好,Cartesi 社区资助计划

这是一个由社区驱动的计划&#xff0c;它将为贡献者提供资金&#xff0c;并且可以帮助建立和扩展 Cartesi的生态系统对于那些一直在寻求支持以实现他们想法的开发人员&#xff0c;那些有兴趣帮助建设塑造我们发展生态系统的Cartesi 爱好者们。我们很兴奋的宣布我们推出了Cartes…

【华为OD机试模拟题】用 C++ 实现 - 新学校选址(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Java 的 JDBC 编程

一、数据库编程的必备条件二、Java 的数据库编程 JDBC三、JDBC 工作原理四、JDBC 使用4.1 下载驱动包4.2 打开编辑器&#xff0c;添加依赖4.3 编写连接数据库代码一、数据库编程的必备条件 编程语言&#xff0c;例如 Java、C、C、Python 等.数据库&#xff0c;如 Oracle、MySQ…

机器学习------ 基于ubuntu 22.04 系统下的pytorch 安装记录过程(包含cuda和cudnn的安装)

机器学习----- pytorch的安装过程 最近&#xff0c;在学习机器学习&#xff0c;在对于理论方面进行一段时间的学习后&#xff0c;打算开始上手代码。在此之前&#xff0c;选择了pytorch作为学习的工具&#xff0c;这里记录下安装的过程。在这里&#xff0c;先把我的设备展示一…

乌卡时代的云成本管理:从0到1了解FinOps

在上一篇文章中&#xff0c;我们介绍了企业云业务的成本构成以及目前面临的成本困境&#xff0c;以及当前企业逐步转向 FinOps 的行业趋势&#xff0c;这篇文章我们将详细聊聊 FinOps&#xff0c;包括概念、重要性以及成熟度评价指标。 随着对云服务和供应商的使用越来越多&…

2023年博管办香江学者计划、澳门青年学者开始申报

2023年2月20日&#xff0c;全国博士后管委会办公室官方网站发出了2023年香江学者计划、澳门青年学者计划和博士后国&#xff08;境&#xff09;外学术交流项目申报指南&#xff0c;以下知识人网小编仅转载香江学者计划和澳门青年学者计划申报指南并做重点解读。知识人网整理香江…

分布式之gossip共识算法分析

写在前面 假如你的业务对系统的可用性要求非常高&#xff0c;就算集群只剩下一个节点&#xff0c;也要能够正常对外提供服务&#xff08;虽然此时系统能力已经骤降&#xff0c;但至少还在&#xff01;&#xff09;&#xff0c;因为raft 要求大多数节点可用所以就没有用武之地了…

【2223sW1】LOG1

这里写自定义目录标题写在前面23.2.19报错Unable to allocate xxx GiB for an array with shape (xxxx, xxxx)23.2.20psi6图片绘制选择了部分r&#xff0c;绘制了g6&#xff08;r&#xff09;23.2.21从lammpstrj文件中导出了1001X6个csv文件虚拟内存扩展代码运行占用资源查询写…

字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序&#xff0c;从键盘录入一个字符串&#xff0c;将字符串转换为二进制数。在转换时&#xff0c;将字符串中的每个字符单独转换为一个二进制数&#xff0c;将所有二进制数连接起来进行输出。 案…

PowerJob容器的今生,容器是如何部署到Worker上,并正常运行的

这仅仅是一篇PowerJob源码分析的文章&#xff0c;但是也有一些java基础知识&#xff0c;在实践中学习效果更好&#xff0c;感兴趣就留下来交流一下吧。 上回书说到&#xff0c;这个powerjob容器是如何生成模板&#xff0c;如何上传到服务器上去&#xff0c;本回主要总结的是&am…

死磕Node模块兼容性,ESM和CJS我全都要!

目录 前言 一些概念 CJS&#xff08;CommonJS&#xff09; ESM&#xff08;ECMAScript Modules&#xff09; 兼容操作 效果演示 总结 前言 在Node版本13.2.0&#xff08;2019年&#xff09;之前&#xff0c;我们一般使用CJS&#xff08;CommonJS&#xff09;模式在代码…

Java JDBC详解

1、JDBC概念、本质、好处 概念&#xff1a; JDBC 就是使用Java语言操作关系型数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 本质&#xff1a; 官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口…