【算法】分治-快排

个人主页 : zxctscl
如有转载请先通知

题目

  • 前言
  • 1. 75. 颜色分类
    • 1.1 分析
    • 1.2 代码
  • 2. 912. 排序数组
    • 2.1 分析
    • 2.2 代码
  • 3. 215. 数组中的第K个最大元素
    • 3.1 分析
    • 3.2 代码
  • 4. LCR 159. 库存管理 III
    • 4.1 分析
    • 4.2 代码

前言

分治就是分而治之

1. 75. 颜色分类

在这里插入图片描述

1.1 分析

就是把数组中的元素分为三块,0全部在左边,1全部在中间,2全部在右边。
这里要用到三个指针,一个i指针用来遍历,一个left用来存放0区域的最后侧,一个用来存放2区域的最左侧。
那么区间就分成了4个
在这里插入图片描述
只需要判断nums[i]的值是什么,然后把它放在对应区域。把数组遍历一遍就行,最终i只要等于right就结束遍历,此时中间已经没有要确定区域的数了。
在这里插入图片描述

1.2 代码

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

2. 912. 排序数组

在这里插入图片描述

2.1 分析

可以先选择一个元素作为基准,把比它小的元素都放在它的左边,把它大的都放在右边,中间放的数就和它相等,这样数组就分为三个区间,递归找一下左边,再递归找一下右边,直到数组全部被排好。
在这里插入图片描述

为了减少时间复杂度,选取基准值的时候选取随机数。
在这里插入图片描述

2.2 代码

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 k=getRandom(nums,l,r);int i=l,left=l-1,right=r+1;while(i<right){      if(nums[i]<k){swap(nums[++left],nums[i++]);}else if(nums[i]==k)i++;else{swap(nums[--right],nums[i]);}}qsort(nums,l,left);qsort(nums,right,r);}int getRandom(vector<int>& nums,int left,int right){int r=rand();return nums[r%(right-left+1)+left];}
};

3. 215. 数组中的第K个最大元素

在这里插入图片描述

3.1 分析

和上面那题一样,这里也将区间分三块。
随机选取一个基准元素k,根据这个基准元素将区间分三部分,左边都是小于k的,中间都是等于k的,有边都是大于k的。
题目要求找到的是第k大元素,那么在三个区域都有可以,但是如果确定这个第k大元素是在某一个区域的时候,那么剩下的两个区域就都不用考虑。
左边元素个数为a,中间为b,右边为c。
第一种如果在c区域,那么c大于等于k的,因为c区域放的是是大值区域,如果存在第k大的,那么最有可能就在c中,只需要c大于等于k就一定在。
在第二种情况找的时候,就说明第一种情况不存在,在中间的区域,那么就直接返回k就行,因为中间元素都是相等的。
第三种情况,前面两种情况都不存在,那么就在左边区间找,右边区域和中间区域都没有,那么找的就是第k-b-c大的元素。

在这里插入图片描述

3.2 代码

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=getRandom(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(b+c>=k)return key;else return qsort(nums,l,left,k-b-c); }int getRandom(vector<int>& nums,int left,int right){int r=rand();return nums[r%(right-left+1)+left];}
};

4. LCR 159. 库存管理 III

在这里插入图片描述

4.1 分析

解法一:
可以直接排序,把前面的cnt个数重新放在一个vector表里面返回就行。

解法二:用快速选择算法
就是前面所提到的随机选择基准元素k,把数组分三个区间。
在这里插入图片描述
然后统计每一个区间的个数,此时就分为三种情况:
第一种情况:第k小,如果a>k就先从第一个区间找。
第二种情况:a+b大于等于k,那么就直接返回k就行,这个区间值都是相等的。
第三种情况:前面两种情况都不成立,说明这个k在右边这个区域,找k-a-b个元素就可以。

在这里插入图片描述

4.2 代码

解法一:

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {sort(stock.begin(),stock.end());vector<int> v;for(int i=0;i<cnt;i++){v.push_back(stock[i]);}return v;}
};

解法二:

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {srand(time(NULL));qsort(stock, 0, stock.size() - 1,cnt);return {stock.begin(),stock.begin()+cnt};}void qsort(vector<int>& stock, int l, int r,int k){if(l>=r)return;int key=getRandom(stock,l,r);int i=l,left=l-1,right=r+1;while(i<right){      if(stock[i]<key) swap(stock[++left],stock[i++]);else if(stock[i]==key)i++;else swap(stock[--right],stock[i]);}//分情况讨论int a=left-l+1,b=right-left-1;if(a>k)qsort(stock,l,left,k);else if(a+b>=k) return;else  qsort(stock,right,r,k-a-b); }int getRandom(vector<int>&stock,int left,int right){int r=rand();return stock[r%(right-left+1)+left];}};

有问题请指出,大家一起进步!!!

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

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

相关文章

滚雪球学Java(73):Java中的引用类型: 弱引用、软引用与强引用详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Scrum.org认证PSM(Professional Scrum Master)官方认证班

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架&#xff0c;旨在最短时间内交付最大价值。根据2022年全球敏捷状态报告&#xff0c;Scrum的应用占比已经达到87%。 Scrum.org 由 Scrum 的联合创始人 Ken Schwaber 创立…

git log详解

文章目录 git log -p其他常用的参数 git log是用来查看历史提交记录的&#xff0c;那么这些记录包含什么呢&#xff1f;如果你不指定分支或者master&#xff0c;默认情况下git log显示的是目前你HEAD的位置的git提交日志&#xff0c;默认不加参数&#xff0c;git log显示如下&a…

【C++风云录】融入虚拟现实的魅力:借助 C++ 库打造沉浸式的游戏体验和交互效果

点燃创造力&#xff1a;解锁 C 库的潜力&#xff0c;构建令人惊叹的物理模拟和游戏应用 前言 在现代的游戏和虚拟现实应用中&#xff0c;物理模拟和真实的交互体验是不可或缺的要素。为了实现逼真的物理效果和流畅的游戏体验&#xff0c;开发人员需要依赖强大的物理模拟库和游…

如何在ADS中实现数据的导入和导出

1 MDIF接口 ADS提供了一种通用的MDIF格式文件&#xff0c;允许用户使用一个通用的数据接口实现导入和导出的功能&#xff0c;其Help文件中的简介如下&#xff1a; 2 数据的导入 实现数据导入功能之前&#xff0c;数据必须遵从一定的标准格式&#xff0c;如下图所示&#xff0c;…

有哪些更复杂的并发编程概念可以进一步学习?

并发集合&#xff1a;Java 提供了一套并发集合类&#xff0c;如 ConcurrentHashMap&#xff0c;ConcurrentLinkedQueue 和 CopyOnWriteArrayList 等&#xff0c;可以在并发环境下使用&#xff0c;而不需担心线程安全问题。 原子变量: java.util.concurrent.atomic 包提供了一组…

自动化运维(二十八)Ansible 实战之最佳安全实践

Ansible是直接操作我们服务器的工具&#xff0c;Ansible是否安全关系到整个生产和办公环境的数据安全&#xff0c;因此确保 Ansible 安全地运行非常重要。以下是有关 Ansible 安全的详细介绍&#xff0c;包括如何安全地使用 Ansible 和一些最佳安全实践。 1. Ansible 安全概念…

[大模型] BlueLM-7B-Chat WebDemo 部署

BlueLM-7B-Chat WebDemo 部署 模型介绍 BlueLM-7B 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型&#xff0c;参数规模为 70 亿。BlueLM-7B 在 C-Eval 和 CMMLU 上均取得领先结果&#xff0c;对比同尺寸开源模型中具有较强的竞争力(截止11月1号)。本次发布共包含 7…

我与C++的爱恋:类与对象(二)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 本篇着重介绍构造函数和析构函数&#xff0c;剩余内容在下篇解答。 一、类的默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 任何类在什么都不写时…

ThingsBoard通过服务端获取客户端属性或者共享属性

MQTT基础 客户端 MQTT连接 通过服务端获取属性值 案例 1、首先需要创建整个设备的信息&#xff0c;并复制访问令牌 ​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、通过服务端获取属性值 5、在客户端查看对应的客户端属性或者共享属性的key 6、查看整个…

java的gradle,maven工程中使用selenium

一、下载selenium库 &#xff08;1&#xff09;gradle工程 工程中会有一个build.gradle.kts的文件&#xff0c;这个文件可以定制 Gradle 的行为 在文件中添加下面代码&#xff0c;然后sync // implementation ("org.seleniumhq.selenium:selenium-java:4.19.1") …

基于spring boot的留守儿童爱心管理系统

基于spring boot的留守儿童爱心管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

《剑指 Offer》专项突破版 - 面试题 108 : 单词演变(C++ 实现)

目录 前言 单向广度优先搜索 双向广度优先搜索 前言 题目链接&#xff1a;单词演变 题目&#xff1a; 输入两个长度相同但内容不同的单词&#xff08;beginWord 和 endWord&#xff09;和一个单词列表&#xff08;wordList&#xff09;&#xff0c;求从 beginWord 到 end…

HTML5+CSS3小实例:荧光图标悬停效果

实例:荧光图标悬停效果 技术栈:HTML+CSS 字体图标库:font-awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=d…

Django的APP应用更名(重命名)流程

将Django中的一个现有APP更名是一个需要谨慎操作的过程&#xff0c;因为它涉及到多个文件和配置的更新。下面是详细的步骤和一些补充细节&#xff0c;帮助你更顺利地完成APP重命名&#xff1a; 1. 修改APP名称及相关引用 更改APP目录名称&#xff1a; 首先&#xff0c;重命名…

vue3<script setup>中点击li为当前li添加一个类名active

在 Vue 3 的 <script setup> 语法中&#xff0c;可以使用 ref 或 reactive 来追踪和管理 DOM 元素的引用。然后&#xff0c;你可以使用事件监听器&#xff08;如 click&#xff09;来响应点击事件&#xff0c;并为当前点击的 <li> 元素添加 active 类名。 <tem…

T620折腾 —— 给虚拟机配置大页

虚拟机访问物理内存需要经过两级页表翻译,如果使用大页,一方面可以降低缺页发生的频率,同时也可以降低TLB Miss的频率,对于提升虚拟机的运行性能有一定作用,下面尝试开启这一功能: 给大页预留内存 使用下面的命令查看Host预留了多少大页: $ sysctl vm.nr_hugepages如…

VulNyx - Ready

目录 信息收集 arp nmap nikto Redis未授权访问漏洞 漏洞扫描 redis-cli 写入公钥 ssh连接 get root.txt 信息收集 arp ┌─[rootparrot]─[~/vulnyx] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168.9.102 Starti…

JAVA学习-注解.基本语法

Java注解是一种用于为程序元素&#xff08;如类、方法、字段、参数等&#xff09;添加元数据的标记。它们提供了一种简单而又强大的方式来在源代码中插入元数据&#xff0c;以及编译器、工具和框架等在处理程序时使用这些元数据。 一、Java注解的基本语法如下&#xff1a; 1.…

ZFT9 7VE8033同期脉冲发送装置 JSOEF约瑟

系列型号 ZFT9(PIG) 7VE8033同期脉冲发送装置; ZFT9(PIG) 7VE8043同期脉冲发送装置; ZFT9 7VE8033同期脉冲发送装置; ZFT9 7VE8043同期脉冲发送装置; 用途&#xff1a; ZFT9(PIG)同期脉冲发送装置用于船舶的三相系统&#xff0c;根据发电机和电力系统之间电压差、相位差、频率…