刷题训练之分治快排

> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟练掌握分治快排算法。

> 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。

> 专栏选自:刷题训练营

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言分析

        最早博主续写了牛客网130道题,这块的刷题是让同学们快速进入C语言,而我们学习c++已经有一段时间了,知识储备已经足够了但缺少了实战,面对这块短板博主续写刷题训练,针对性学习,把相似的题目归类,系统的刷题,而我们刷题的官网可以参考:​​​​​​

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网

⭐知识讲解

基本思想:

这个算法在我们学习数据结构中八大排序之快排,但这个快排比起数据结构中的快排简单不少,这个算在C语言中我们也涉及到了,如果大家对这个算法比较陌生的话,可以参考下面两篇博客,一个是数据结构中的另一个是C语言中的:

数据结构:手撕各种排序

C语言:快快快快快快快快快快排

特点:

我们下面题目所采用的方法都是三路划分法思想,这也和我们的标题分治不谋而合。

大致做题流程:

做题前一定要先画图,在写代码,如果能自己画出图来写代码轻松不少。

 🌙topic-->1

 题目链接:1.分治快- 颜色分类 - 力扣(LeetCode)

 

题目分析:

题目意思比较简单,把数组中的0  1  2排序。

算法原理:

  • 解法:采用三指针

图解:

细节处理:

left需要指向为 - 1,循环条件为 i < right.

代码演示:

class Solution 
{
public:
    void sortColors(vector<int>& nums) 
    {
        int n = nums.size();
        // 定义三个指针
        int left = -1,right = n,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]);
        }
    }
};

🌙topic-->2

 题目链接:2.排序数组 - 力扣(LeetCode)

​ 

题目分析:

给你一个整数数组 nums,请你将该数组升序排列。(解法有很多,我们采用快速排序算法)

算法原理:

  • 解法:采用快速排序算法(三指针)

图解:

细节处理:

  • 递归结束标志是 l >= r

代码演示:

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 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]);
        }

        // 划分三个区域 [l ,left]  [left + 1, right - 1]  [right, r]
        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];
    }
};

🌙topic-->3

 题目链接:3. 数组中的第K个最大元素 - 力扣(LeetCode)3. 数组中的第K个最大元素 - 力扣(LeetCode)

 

题目分析:

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。(你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。)

算法原理:

  • 解法:采用快速排序算法(三指针)

  图解:

 细节处理: 

  • 递归结束标志是 l == r

代码演示:

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 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]);
        }

        // 讨论
        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)
    {
        return nums[rand() % (right - left + 1) + left];
    }
};

🌙topic-->4

 题目链接:

   

题目分析:

输入整数数组 arr,找出其中最小的 k 个数。(跟上面的题目相似,这里不在细致讲解)

算法原理:

  • 解法:采用快速排序算法(三指针)

  图解:

  

 细节处理: 

  • 递归结束标志是 l >= r

代码演示:

class Solution
{
public:
	vector<int> getLeastNumbers(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);
		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]);
		}
		// [l, left][left + 1, right - 1] [right, r]
		// 2. 分情况讨论
		int a = left - l + 1, b = right - left - 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 l, int r)
	{
		return nums[rand() % (r - l + 1) + l];
	}
};

 🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ThreadLocal与ForkJoin使用踩坑记录

由于并发的需要原因&#xff0c;使用CompletableFuture异步执行Dubbo接口&#xff0c;RpcContext中存储了tenantId等信息。上线一段时间后&#xff0c;发现有些时候拿到的上下文并不是自己线程的上下文。 原因分析 CompletableFuture.supplyAsync内部使用ForkJoinPool执行。 要…

【EI会议/稳定检索】2024年电机与电气控制国际会议(ICMEC 2024)

2024 International Conference on Motor and Electrical Control 2024年电机与电气控制国际会议 【会议信息】 会议简称&#xff1a;ICMEC 2024 截稿时间&#xff1a;(以官网为准&#xff09; 大会地点&#xff1a;中国厦门 会议官网&#xff1a;www.meciac.com 会议邮箱&…

夸张,腾讯实习三个月,存款20W+

大家好&#xff0c;我是白露。 今天在牛客上看到一条帖子&#xff0c;让我感叹万分&#xff1a;实习两三个月&#xff0c;竟然已经存下了20多万的存款。 这也太夸张了吧&#xff1f;不太真实啊…… 很多网友表示疑问&#xff0c;“两三个月实习顶多存两三万吧&#xff1f;武理…

【工具】windows下VMware17解锁mac安装选项(使用unlocker427)

目录 0.简介 1.环境 2.安装前后对比 3.详细安装过程 3.1 下载unlocker427 1&#xff09;下载地址 2&#xff09;下载unlocker427.zip 3&#xff09;解压之后是这样的 4&#xff09;复制iso中的两个文件到你本地的VMware的安装目录下 5&#xff09;复制windows下的所有…

【笔记】从零开始做一个精灵龙女-装备阶段

这里只记录相对重要的步骤和一些思路 但是头发那块很详细哦~ &#xff08;标的小数字不用在意&#xff0c;那个是我网课的时长记录&#xff09; 耳环 1.创建一个圆环&#xff0c;调整参数 做好后再复制一个小的 肩甲 2.0-2.4 1.创建圆柱体/球体也可 然后把底部的两个点删…

有哪些好用的ai工具,可以提升科研、学习、办公等效率?

最近&#xff0c;Sora的诞生为AI再添了一把火。 据介绍&#xff0c;这款“文生视频”的Sora可以直接输出长达60秒的视频&#xff0c;并且包含高度细致的背景、复杂的多角度镜头&#xff0c;以及富有情感的多个角色。 不仅能准确呈现细节&#xff0c;还能理解物体在物理世界中…

Accelerate笔记:本地SGD

本地 SGD 是一种分布式训练技术&#xff0c;其中梯度不是每一步都同步。每个进程都会更新自己版本的模型权重&#xff0c;在给定的步数后&#xff0c;通过跨所有进程平均这些权重来同步它们。 在底层&#xff0c;本地 SGD 代码禁用了自动梯度同步&#xff08;但累积仍然如预期工…

什么是最好的手机数据恢复软件?6 款手机数据恢复软件 [2024 年更新]

什么是最好的手机数据恢复软件&#xff1f;在这篇文章中&#xff0c;您将了解 6 款最好的免费手机数据恢复软件&#xff0c;并学习如何恢复数据的完整指南。 最好的手机数据恢复软件是什么&#xff1f; 手机数据恢复软件是恢复智能手机中丢失或删除的文件、消息、照片和其他宝…

Win10文件系统错误(-2147219196)

问题出现的原因&#xff1a; C盘快挤满了&#xff0c;导致电脑很卡&#xff0c;于是删掉了C盘用户下的一些文件C:\Users\DIY-PC&#xff0c;省了五六十G的内存&#xff0c;结果发现把一些系统文件也删掉了&#xff0c;导致图片预览报错 问题现象&#xff1a; &#xff08;自…

6月软考新通知:24下集成大概率是中级蕞简单的一门

2024下半年软考6月新通知&#xff1a; 一、24下软考考试时间安排&#xff1a; 24下半年软考报名时间&#xff1a;8月19日-9月15日 24下半年软考考试时间&#xff1a;11月9-12日 24下半年软考成绩查询&#xff1a;12月中&#xff08;预计&#xff09; 二、考情分析 24上软考…

免费,C++蓝桥杯等级考试真题--第7级(含答案和解析)

C蓝桥杯等级考试真题--第7级 答案&#xff1a;D 解析&#xff1a;步骤如下&#xff1a; 首先&#xff0c;--a 操作会使 a 的值减1&#xff0c;因此 a 变为 3。判断 a > b 即 3 > 3&#xff0c;此时表达式为假&#xff0c;因为 --a 后 a 并不大于 b。因此&#xff0c;程…

气压、湿度、震动开关、声音、红外火焰传感器 | 配合Arduino使用案例

BMP180 气压传感器 BMP180 是一种用于测量气压的科学仪器。可以获取到温度、气压、海拔。 先在 arduino ide 中安装依赖 /****** Arduino 接线 ***** Arduino 传感器* VCC 5v* GND GND* A4 SDA * A5 SCL ***********************/#include &l…

【Springcloud微服务】MybatisPlus下篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Springcloud微服务 &#x1f320; 首发时间&#xff1a;2024年6月4日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43…

Beyond Compare 4 代码对比重新激活使用30天

1.同时按住‘’Win”“R”键&#xff0c;打开运行窗口。 2.在文本框中输入“regedit”&#xff0c;然后点击“确定”。 3.打开注册表&#xff0c;删除相关注册信息 打开注册表后&#xff0c;依次点击左侧列的“HKEY_CURRENT_USER”-“SOFTWARE”-“Scooter Software”-“Beyo…

[预告] 现代C++之全面解读Mutex与RAII Lock

目标 在我们编写并发编程项目的时候&#xff0c;mutex是必须要掌握的点&#xff0c;深入mutex的底层原理与实现能够帮助我们更好的理解与使用mutex。例如&#xff1a;在编写代码时&#xff0c;我们会遇到如下几个场景&#xff1a; 如何避免死锁如何自动释放锁如何设置超时控制多…

KT142C语音芯片ic批量生产说明不需要usb拷贝音频

一、批量生产的简介 内置空间虚拟成U盘的批量生产说明&#xff0c;其实就是将音频文件配置文件打包成一个bin文件就可以了&#xff0c;当然借助于电脑端的exe工具。“FAT镜像文件生成工具_1.0.9.exe” 最后&#xff0c;将生成的文件&#xff0c;重命名为“userfat-日期-特点.b…

Digital Assets

目录 .HDA文件 Expanded directories .HDA文件 Houdini将数字资产存储于.hda文件内&#xff1b; .HDA文件格式是一种二进制存档格式&#xff08;binary archive format&#xff09;&#xff0c;存储一个或多个资产的数据层级结构&#xff0c;包括资产节点的类型定义&#xf…

配置本地 apt 源

挂载iso镜像文件 注意&#xff1a;文章中的挂载方法是临时挂载&#xff0c;重启服务器失效 我是使用iBMC的虚拟控制台将我的iso文件以设备的形式挂载到服务器上&#xff0c;我的iso文件是设备&#xff1a;/dev/sr0 也可以直接将iso文件上传到服务器某个目录。 将 /dev/sr0 进…

手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(二)管理员后台

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

AI写作:AI助力内容创作,让你的工作效率翻倍

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…