快排——OJ题

news2024/10/7 6:46:40

在这里插入图片描述


📘北尘_:个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、颜色划分
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现
  • 二、排序数组
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现
  • 三、数组中的第K大元素
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现
  • 四、最小的K个数
    • 1、题目讲解
    • 2、算法原理
    • 3、代码实现


一、颜色划分

1、题目讲解

在这里插入图片描述

2、算法原理

在这里插入图片描述

3、代码实现

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


二、排序数组

1、题目讲解

在这里插入图片描述

2、算法原理

在这里插入图片描述

3、代码实现

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) 
    {
        srand(time(NULL));
        qsort(nums,0,nums.size()-1);
        return nums;
    }
    void qsort (vector<int>& nums,int l,int r)
    {
        if(l>=r)    return;
        int i=l,left=l-1,right=r+1;
        int key=GetRandom(nums,l,r);

        while(i<right)
        {
            if(nums[i]<key)  swap(nums[++left],nums[i++]);
            else if(nums[i]==key) i++;
            else swap(nums[--right],nums[i]);
        }

        qsort(nums,l,left);
        qsort(nums,right,r);
    }
    int GetRandom(vector<int>& nums,int l,int r)
    {
        int p=rand();
        return nums[p%(r-l+1)+l];
    }
};

三、数组中的第K大元素

1、题目讲解

在这里插入图片描述

2、算法原理

在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出我们要找的元素是在「哪⼀个区间」⾥⾯。
那么我们可以直接去「相应的区间」去寻找最终结果就好了。

3、代码实现

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        srand(time(NULL));
        return qsort(nums,0,nums.size()-1,k);      
    }
    int qsort(vector<int>& nums,int l,int r,int k)
    {
        if(l>=r) return nums[l];
        int key=GetKey(nums,l,r);
        int i=l,left=l-1,right=r+1;
        while(i<right)
        {
            if(nums[i]<key) swap(nums[++left],nums[i++]);
            else if(nums[i]==key) i++;
            else swap(nums[--right],nums[i]);
        }
        int c=r-right+1,b=right-left-1;
        if(c>=k) return qsort(nums,right,r,k);
        else if(c+b>=k) return key;
        else return qsort(nums,l,left,k-b-c);
    }
    int GetKey(vector<int>& nums,int left,int right)
    {   
        return nums[rand()%(right-left+1)+left];
    }
};

四、最小的K个数

1、题目讲解

在这里插入图片描述

2、算法原理

在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出最⼩的 k 个数在哪些区间⾥⾯。
那么我们可以直接去「相应的区间」继续划分数组即可。

3、代码实现

class Solution {
public:
    vector<int> smallestK(vector<int>& arr, int k) 
    {
        srand(time(NULL));
        qsort(arr,0,arr.size()-1,k);
        return {arr.begin(),arr.begin()+k};
    }
    void qsort(vector<int>& arr,int l,int r,int k)
    {
        if(l>r) return;
        int left=l-1,right=r+1;
        int key=GetKey(arr,l,r);

        //三路划分
        for(int i=l;i<right;)
        {
            if(arr[i]<key) swap(arr[++left],arr[i++]);
            else if(arr[i]==key) i++;
            else swap(arr[--right],arr[i]);
        }

        int a=left-l+1,b=right-left-1;

        if(a>k)  qsort(arr,l,left,k);
        else if(a+b>=k) return;
        else  qsort(arr,right,r,k-a-b);
    }
    int GetKey(vector<int>& arr,int l,int r)
    {
        return arr[rand()%(r-l+1)+l];
    }
};

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

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

相关文章

网络运行安全

网络运行安全 第一节 一般规定 第二十一条 国家实行网络安全等级保护制度。网络运营者应当按照网络安全等级保护制度的要求,履行下列安全保护义务,保障网络免受干扰、破坏或者未收授权的访问,防止网络数据泄露或者被窃取、篡改: 制定内部安全管理制度和操作规程,确定网络…

JVM--- 垃圾收集器详细整理

目录 一、垃圾收集需要考虑的三个事情&#xff1a; 二、垃圾回收针对的区域 三、如何判断对象已死 1.引用计数算法&#xff1a; 2.可达性分析算法 四、引用 五、生存还是死亡&#xff1f; 六、回收方法区 七、垃圾收集算法 1.分代收集理论 2.标记-清除算法 3.标记-复制算…

11-k8s中网络资源service

一、service资源概述 每当我们企业的业务pod迭代功能的时候&#xff0c;都会修改pod&#xff0c;修改后重新启动pod&#xff0c;ip就会变化&#xff0c;那么在生产环境当中&#xff0c;从用户到宿主机、从宿主机到pod&#xff0c;这一个访问流程&#xff0c;都是事先写好的&…

储能光伏一体化解决方案

上海安科瑞电气股份有限公司 胡冠楠 咨询家&#xff1a;“Acrelhgn”&#xff0c;了解更多产品资讯 1. 工业园区能源数字化系统构成 把一个工业园区的能源系统看成一个微网&#xff0c;这个能源微网可能由微电网、给/排水网、供冷/热管网、燃气管网等等组成。要提高园区的能源…

【安全狐】Windows修改文件时间

Windows修改文件时间 在应急响应过程中不要对文件时间100%的相信 powershell下执行 (ls 1.txt).CreationTimeUtc2029-01-25 06:00:10 (ls 1.txt).LastWriteTimeUtc2029-01-25 06:00:10 (ls 1.txt).LastAccessTimeUtc2029-01-25 06:00:10

selenium 驱动 Edge浏览器,解决selenium打开Edge浏览器闪退问题

一、Edge浏览器驱动下载 1、在设置中查看浏览器的版本号 2、在官网中进行对应下载 Microsoft Edge WebDriver - Microsoft Edge Developer 二、环境变量配置 1、打开设置界面 右击【此电脑】---选择【属性】----选择【高级系统设置】-----点击【环境变量】 2、变量设置 在…

Linux------环境变量

目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…

[AIGC] 利用 ChatGpt 深入理解 Java 虚拟机(JVM)的内存分布

深入理解 Java 虚拟机&#xff08;JVM&#xff09;的内存分布 Java 虚拟机&#xff08;JVM&#xff09;是 Java 编程语言的核心运行环境&#xff0c;它负责解释和执行 Java 字节码。在 JVM 中&#xff0c;内存被划分为几个不同的区域&#xff0c;每个区域都有特定的用途。了解…

java生成pdf

1.pdf预览 2.maven <!--pdf--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version></dependency><dependency><groupId>com.itextpdf</groupId>…

易点易动设备管理系统:提升企业设备管理效率的智能选择

随着科技的不断进步和企业规模的不断扩大&#xff0c;设备管理对于企业的运营效率和成本控制变得越来越重要。为了更好地管理和掌控企业设备&#xff0c;易点易动设备管理系统应运而生。作为一款全新的智能化设备管理解决方案&#xff0c;易点易动系统能够有效提高企业的设备管…

RabbitMQ监控方法以及核心指标

RabbitMQ监控方法以及核心指标 1. 监控指标采集2. 使用rabbimq插件采集指标2.1 3.8.0之前版本&#xff0c;使用外部插件暴露2.2 3.8.0之后版本&#xff0c;使用内置插件暴露 3. 使用rabbitmq_exporter采集指标3.1 部署rabbitmq_exporter3.2 prometheus采集rabbitmq_exporter的暴…

【DBeaver+mysql】如何在DBeaver中创建mysql服务的连接并新建数据库

一、创建步骤 1、下载安装mysql 8.0&#xff08;注意&#xff0c;安装过程会启动mysql服务&#xff0c;这才是能用命令行执行node处理sql语句的关键&#xff09; 下载地址&#xff1a;https://dev.mysql.com/downloads/file/?id526407 2、下载安装DBeaver数据库管理IDE 3、在…

【presto权威指南】presto介绍

需求&#xff1a;如何从众多数据源中快速处理数据 现实生产架构多源异构&#xff0c;需要一个强有力的工具&#xff08;抽象&#xff09;统一数据查询/分析 这也是presto/trino从诞生之初便贴数据湖查询工具 tag的原因&#xff0c;presto生来为此 生产环境的困境 1.数据源众多…

CrossOver 24.0 让Mac可以运行Windows程序的工具

CrossOver 24.0最新版重点添加了对 DirectX 12 支持&#xff0c;从而在 Mac 上更好地模拟运行 Windows 游戏&#xff0c;开发者在 CrossOver 23 中可以调用 DirectX 12&#xff0c;在模拟游戏的过程中同时调用所有 GPU 核心&#xff0c;从而实现更优秀的渲染效果。 目前CrossOv…

c++入门学习⑥——友元和运算符重载

目录 简介&#xff1a; 友元&#xff1a; 全局函数做友元 类做友元 成员函数做友元 运算符重载 加号运算符重载 代码示例&#xff1a; 输入输出运算符重载 ⭐cin ⭐cout 代码示例&#xff1a; 分析&#xff1a; 自增运算符重载 代码示例&#xff08;成员函数实现…

苹果电脑深度清理工具CleanMyMac X2025中文版

苹果电脑用户们&#xff0c;你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅&#xff1f;可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻&#xff0c;拥有一些高效的深度清理工具就显得尤为重要。今天&#xff0c;我将介绍几款优秀的苹果电脑深度清理工具…

建立流行病预警指数体系并优化传染病模型:对公共卫生突发事件监测数据的分析

应对紧急情况造成的损害的能力是紧急能力现代化的重要象征。 在应对紧急情况时&#xff0c;政府机构和决策者需要更多信息来源&#xff0c;以更有效地估计灾难可能的演变。 这篇论文提出了一个预测COVID-19动态演变的优化模型&#xff0c;该模型将系统动力学的传播算法与预警指…

Windows如何打开投影到此电脑

1.首先点开设置 找到系统 点击投影到此电脑&#xff0c;如果这3行都显示灰色说明没有开启。 2.如何开启投影到此电脑 ①回到设置&#xff0c;点击应用 ②点击可选应用 ③ 安装无线显示器 投影设置可以和我一样

IP地址证书

IP地址证书&#xff0c;顾名思义&#xff0c;是一种用于验证互联网协议&#xff08;IP&#xff09;地址所有权的数字证书。它类似于网站的安全套接字层&#xff08;SSL&#xff09;证书&#xff0c;但专门用于确认和保障IP地址的所有者身份。这种证书由权威的证书颁发机构&…

【Jvm】性能调优(拓展)Jprofiler如何监控和解决死锁、内存泄露问题

文章目录 Jprofiler简介1.安装及IDEA集成Jprofiler2.如何监控并解决死锁3.如何监控及解决内存泄露(重点)4.总结5.后话 Jprofiler简介 Jprofilers是针对Java开发的性能分析工具(免费试用10天), 可以对Java程序的内存,CPU,线程,GC,锁等进行监控和分析, 1.安装及IDEA集成Jprofil…