【优选算法】--- 分治 快速排序

分治 快速排序

  • 一、颜色分类 / 对快排的复习
    • 1、题目解析
    • 2、算法原理
    • 3、代码
  • 二、排序数组(快排的方法)
    • 1、题目解析
    • 2、算法原理
    • 3、代码
  • 三、数组中的第K个最大元素
    • 1、题目解析
    • 2、算法原理
    • 3、代码
  • 四、库存管理 III(原:剑指 Offer . 最小的k个数)
    • 1、题目解析
    • 2、算法原理
    • 3、代码

一、颜色分类 / 对快排的复习

如何对一个数组进行快速排序

他的大致思想:
(1)就是在一个数组里面随机找一个基准元素key
(2)然后将数组分块进行递归排序,小于基准元素key的在左边,大于基准元素key的在右边(升序)
(3)依次不断递归分制,直到最小单位为止。
(4)利用双指针/三指针进行遍历交换swap

在这里插入图片描述
在这里插入图片描述

1、题目解析

在这里插入图片描述
题目链接:颜色分类

2、算法原理

根据题目要求,我们需要把数组中的元素012按顺序排好。

采用:快排+三指针的解法

把 “ 1 ”当做key基准元素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 如果nums[i]==0,我们是让 nums [ left+1 ] 跟 nums[i] 交换的(最后 left 和 i 均需要++)
  2. 如果nums[i]==1,i++即可
  3. 如果nums[i]==2,我们是让 nums [ right-1 ] 跟 nums[i] 交换的(最后 只需要对 right --即可,因为right交换给 i 的元素是未扫描的!
    在这里插入图片描述

3、代码

class Solution 
{
public:void sortColors(vector<int>& nums) {int n=nums.size();int left=-1,right=n,i=0;// 这里的 left和right都是数组外的!while(i<right)// 因为i是扫描区,扫描完之后,遇到了right,就可以结束了!{if(nums[i]==0){swap(nums[left+1],nums[i]);left++;i++;}else if(nums[i]==1){i++;}else{swap(nums[right-1],nums[i]);right--;}}}
};

二、排序数组(快排的方法)

1、题目解析

在这里插入图片描述
题目链接:排序数组

2、算法原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

唯一需要知道的是用随机的方式选择基准元素:
(1)在最上面的函数排序之前先种一个随机数种子:srand(time(NULL));
(2)r=rand(); 其中:r%(right-left+1)是偏移量!

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;  // 递归结束条件// 优化:随机找一个 基准元素keyint key=getRandom(nums,l,r);// 核心:数组分三块(三指针)int i=l,left=l-1,right=r+1;while(i<right){if(nums[i]<key) {swap(nums[left+1],nums[i]);left++;i++;}else if(nums[i]==key){i++;}else{swap(nums[right-1],nums[i]);right--;}}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];}};

三、数组中的第K个最大元素

像这种:第K个最大、第K个最小、最小的k个数、最大的k个数 ->利用的都是topK的思想!

1、题目解析

在这里插入图片描述

题目链接:数组中的第K个最大元素

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];// 1、找一个基准元素 将数组分三块int key=getRandom(nums,l,r);int left=l-1,right=r+1,i=l;while(i<right){if(nums[i]<key) swap(nums[++left],nums[i++]);else if(nums[i]==key) i++;else  swap(nums[--right],nums[i]);}//2、对排好序的数组,进行分类处理讨论int c=r-right+1,b=right-left-1,a=left-l+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);// 注意细节:在最小的区间找第(k-b-c)个最大元素}int getRandom(vector<int>& nums,int left,int right){return nums[rand()%(right-left+1)+left];}
};

四、库存管理 III(原:剑指 Offer . 最小的k个数)

1、题目解析

在这里插入图片描述
题目链接:剑指 Offer . 最小的k个数

2、算法原理

这个题的解法跟上一个题的解法是完全一样的,用的都是数组分三块的思想,只不过上一个题返回的是个数,这个题返回的是一个整体的数组。
在这里插入图片描述
在这里插入图片描述

3、代码

class Solution 
{
public:vector<int> inventoryManagement(vector<int>& nums, int k) {srand(time(NULL));qsort(nums,0,nums.size()-1,k);return{nums.begin(),nums.begin()+k};}void qsort(vector<int>& nums,int l,int r,int k){if(l>r) return;//1、随机找一个基准元素,根据基准元素将数组分三块int key= getRandom(nums,l,r);// 2、以key为标准,将数组分三块int left=l-1,right=r+1,i=l;while(i<right){if(nums[i]<key) swap(nums[++left],nums[i++]);else if(nums[i]==key) i++;else swap(nums[--right],nums[i]);}// 3、分类讨论int a=left-l+1,b=right-left-1,c=r-right+1;if(a>k) qsort(nums,l,left,k);else if(a+b>=k) return ;else qsort(nums,right,r,k-a-b);}int getRandom(vector<int>& nums,int left,int right){return nums[rand()%(right-left+1)+left];}
};

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

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

相关文章

如何使用pymysql和psycopg2连接MySQL和PostgreSQL数据库

在现代软件开发中&#xff0c;数据库是存储和管理数据的核心组件。Python作为一种流行的编程语言&#xff0c;提供了多种方式来连接和操作数据库。在这篇文章中&#xff0c;我们将探讨如何使用pymysql和psycopg2这两个库来连接MySQL和PostgreSQL数据库。我们将从基础概念开始&a…

Khronos:动态环境下时空度量语义SLAM的统一方法

Khronos: A Unified Approach for Spatio-Temporal Metric-Semantic SLAM in Dynamic Environments 原文 项目 引言&#xff1a; 人类居住环境通常是高度动态的&#xff0c;人、机器人和其他实体不断移动、互动和改变场景。对于机器人在这种情况下的操作&#xff0c;仅仅建立一…

想要加密电脑?盘点2024年企业常用的10款电脑文件加密软件

在企业数据安全的时代背景下&#xff0c;文件加密已经成为保护企业核心信息、应对网络安全威胁的关键举措。无论是保护机密的商业数据&#xff0c;还是遵守数据隐私合规性要求&#xff0c;企业对文件加密软件的需求日益增长。本文将盘点2024年企业常用的10款电脑文件加密软件&a…

安卓如何实现双击触摸唤醒点亮屏幕功能-源码分析linage os高通平台

背景&#xff1a; 前面文章已经有讲解过双击亮屏在一些方案调研情况&#xff0c;刚好linage os手机本身也有这个功能&#xff0c;刚好也有整体开源源码&#xff0c;所以今天带大家来对双击亮屏的源码部分进行剖析&#xff0c;本篇文章会一直分析到hal操作驱动节点。 设置作为…

重学SpringBoot3-集成Redis(二)之注解驱动

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;二&#xff09;之注解驱动 1. 为什么选择 Redis 作为缓存&#xff1f;2. 如何在 Spring Boot 中启用 Redis 缓存&#xff1f;2.1 …

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、数组第3天、双指针第4天、滑动窗口第5天、贪心算法第6天、二分查找第7天、分治递归 六、集训总结 大家好&#xff0c;我是哪吒。 最…

Qt程序打包(解决找到dll问题)

1、运行Qt程序找不到dll 在Qt Creator外&#xff0c;运行Qt编译的exe程序&#xff0c;常常出现找不到xxx.dll而无法运行的问题。 解决的办法之一是找到Qt安装目录下bin文件夹中的dll文件&#xff0c;将该路径添加到系统环境变量path中去。 第二种办法就是对Qt程序进行打包&…

来了,使用YOLOv11目标检测教程

来了&#xff0c;使用YOLOv11目标检测教程 概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布&#xff1a;https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本&#xff0c;结合了尖端的准确性、速度和效率&#xff…

【LeetCode】动态规划—72. 编辑距离(附完整Python/C++代码)

动态规划—72. 编辑距离 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释 总结: 前言 编辑距离问题是字符串处理中的经…

threejs-模型贴图颜色与图片存在色差 问题解决方案

我使用的是obj模型&#xff0c;然后加载的话使用的是texturelLoader加载器&#xff0c;效果是这样的 使用的场景是&#xff1a;能够将图片贴到衣服上&#xff0c;并且能够移动旋转等操作贴图&#xff0c;但是这存在很明显的色差问题&#xff0c;具体的解决方案是&#xff1a; 我…

.Net Core 接口或网站发布到IIS

将.Net Core 接口或网站发布到IIS上&#xff0c;需要遵循一系列步骤来确保正确配置和部署。下面将以.NET Core 3.1的api接口发布示范&#xff1a; 一、环境准备 安装.NET Core 3.1 SDK和运行时&#xff1a; 在服务器上安装.NET Core 3.1 SDK&#xff08;如果需要在服务器上编译…

LeetCode 48 Rotate Image 解题思路和python代码

题目&#xff1a; You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …

桥水基金、贝莱德、摩根士丹利选择极狐GitLab 的五大理由!

疯狂上涨的 A股、港股 节前一周&#xff0c;上证指数累计上涨超 12%&#xff0c;创下2008年11月以来最大单周涨幅&#xff1b;深证成指累计上涨超17%&#xff0c;创下1996年4月最大单周涨幅&#xff1b;创业板指上涨超22%&#xff0c;创下史上最大单周涨幅。 过去两周&#x…

1688代采系统-反向海淘系统详细介绍

Onebound凡邦1688代采系统-反向海淘系统是一种专为海外买家及跨境电商提供一站式采购解决方案的平台。其核心功能和服务旨在解决跨境采购中的语言、货币等常见问题&#xff0c;并优化采购流程&#xff0c;提高采购效率。以下是对该系统的详细介绍。 一、核心功能 商品采集与展…

基于Java(Jsp+Sevlet)+MySql 实现的(Web)成绩管理系统

1 概述 1.1 开发背景 随着学生数量的日渐增多&#xff0c;学生教务系统的数据量也不断增加&#xff0c;这无疑大大增加了教务系统的负担。如果能把负责学生成绩管理的模块独立出来形成一个独立的系统&#xff0c;便可以有效降低教务系统的数据量&#xff0c;不仅可以方便管理…

2003-2023年上市公司政府补助明细数据

2003-2023年上市公司政府补助明细数据 1、时间&#xff1a;2003-2023年 2、来源&#xff1a;通过整理和筛选于企业财务报表附注“营业外收入”下的“政府补助明细”得到 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、省份、城市、区县、上市状态、政府补助金额、…

企业架构系列(16)ArchiMate第14节:实施和迁移视角

在企业架构中&#xff0c;为了有效地规划和管理架构的变更与实施&#xff0c;通常会使用不同的视角来描述架构的不同方面。本篇涉及到三个主要视角&#xff1a;项目视角、迁移视角以及实施与迁移视角。 一、实施和迁移视角概览 1.项目视角 元素与关系&#xff1a;关注项目本身…

基于ResNet50模型的船型识别与分类系统研究

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

获取时隔半个钟的三天

摘要&#xff1a; 今天遇到需求是配送时间&#xff0c;时隔半个钟的排线&#xff01;所以需要拼接时间&#xff01;例如2024-10-08 14&#xff1a;30&#xff0c;2024-10-08 15&#xff1a;00&#xff0c;2024-10-08 15&#xff1a;30 <el-form-item label"配送时间&a…

AP8505固定5V输出5V0.2A,SOP7/DIP7非隔离开关电源IC

AP8505基于高压同步整流架构&#xff0c;集成PFM控制器以及500V高可靠性MOSFET&#xff0c;用于外部元器件极精简的小功率非隔离开关电源。AP8505无线门铃芯片内置500V高压启动&#xff0c;实现系统快速启动、超低待机功能。5V非隔离无线门铃芯片AP8505提供了完整的智能化保护功…