分治算法——优选算法
本章我们要学习的是分治算法,顾名思义就是分而治之,把大问题分为多个相同的子问题进行处理,其中我们熟知的快速排序和归并排序用的就是分治算法,所以我们需要重新回顾一下这两个排序。
一、快速排序(三路划分)
1.算法思想:
首先从数列中确定一个需要排序的数(记为key),把所有key排到它的正确位置(即排序后它的位置),然后同样的方法,使用递归(分治思想)把小于key的区间与大于key的区间进行排序,直到这个区间不存在或只有一个元素时返回。
具体方法:从左到右遍历数组,并且我们使用三个变量(left,mid,right)把数组划分为四个区间,分别表示小于key,等于key,未遍历,大于key。而mid位置就是此时遍历到的数,判断这个数与key的关系,然后把它放在对应的区间。再用同样方法将大于key和小于key的区间排序。

注意:在此快速排序我使用了三路划分的优化方法,和对key取用随机值,这样比普通的快速排序效率要高得多,而且是一种很实用的分治算法。
2.代码实现:
vector<int> sortArray(vector<int>& nums){srand((unsigned int)time(NULL));dfs(0,nums.size()-1,nums);return nums;}void dfs(int n,int m,vector<int>& nums){if(n>=m) return;int key=nums[n+rand()%(m-n+1)];int left=n-1,right=m+1,mid=n;while(mid<right){if(nums[mid]<key) swap(nums[++left],nums[mid++]);else if(nums[mid]==key) mid++;else swap(nums[mid],nums[--right]);}dfs(n,left,nums);dfs(right,m,nums);}
二、归并排序
1.算法思想:
对于一个乱序的数组,我们可以把一分为二,先让两个小数组有序然后再将它们合并。那么如何让这两个小数组有序呢,同样的可以把它们分别再拆开,变成四个小组,然后继续一直往下拆,直到拆到只有一个元素,那么它必然是有序的,最后进行一一合并,这整个的思路有点像二叉树的后续遍历。

2.代码实现:
vector<int> tmp;vector<int> sortArray(vector<int>& nums){tmp.reserve(nums.size());dfs(0,nums.size()-1,nums);return nums;}void dfs(int left,int right,vector<int>& nums){if(left>=right) return;int mid=(left+right)>>1;dfs(left,mid,nums);dfs(mid+1,right,nums);int p1=left,p2=mid+1;int i=left;while(p1<=mid&&p2<=right)tmp[i++]=nums[p1]<=nums[p2]?nums[p1++]:nums[p2++];while(p1<=mid) tmp[i++]=nums[p1++];while(p2<=right) tmp[i++]=nums[p2++];for(int j=left;j<=right;j++) nums[j]=tmp[j];}
对于快速排序和归并排序,需要了解更多细节请参考下文:
【排序算法】—— 快速排序_快速排序方法-CSDN博客
【排序算法】—— 归并排序-CSDN博客
三、快速选择算法

当我们看到这个题目的时候,可能脑子里很快想到用堆解决TopK问题,或者是使用排序来解决。 但这是一个面试题,以上两种解决方法都不足以让我们拿到offer。需要注意题目描述是任意顺序返回这k个数,而不是有序返回,那么我们就应该意识到应该还有更优的解决方法。
对于使用堆和排序,时间复杂度都为O(nlogn),而这个题我们可以用快速选择算法,时间复杂度为O(n),这是由快速排序延伸出的一个算法。同样使用分治思想。
算法思想:

class Solution {
public:vector<int> smallestK(vector<int>& arr, int k){srand((unsigned int)time(NULL));dfs(0,arr.size()-1,arr,k);return {arr.begin(),arr.begin()+k};}void dfs(int l,int r,vector<int>& arr,int k){if(l>r) return;int key=arr[rand()%(r-l+1)+l];int left=l-1,right=r+1,mid=l;while(mid<right){if(arr[mid]<key) swap(arr[++left],arr[mid++]);else if(arr[mid]==key) mid++;else swap(arr[mid],arr[--right]);}int a=left-l+1,b=mid-left-1;if(k<a) dfs(l,left,arr,k);else if(k<=a+b) return;else dfs(right,r,arr,k-a-b);}
};
四、逆序对问题

关于这个题,最容易想到的就是暴力方法,双重循环,时间复杂度为O(n^2),毫无疑问是通过不了这个题的,这个题我们可以利用归并排序来完成计数,时间复杂度为O(nlogn)。
算法思想:

class Solution {
public:int count=0;vector<int> tmp;int reversePairs(vector<int>& record) {tmp.reserve(record.size());dfs(0,record.size()-1,record);return count;}void dfs(int left,int right,vector<int>& nums){if(left>=right) return;int mid=(left+right)>>1;dfs(left,mid,nums);dfs(mid+1,right,nums);int p1=left,p2=mid+1;int i=left;while(p1<=mid&&p2<=right){if(nums[p1]<=nums[p2]) tmp[i++]=nums[p1++];else count+=mid-p1+1, tmp[i++]=nums[p2++];}while(p1<=mid) tmp[i++]=nums[p1++];while(p2<=right) tmp[i++]=nums[p2++];for(int i=left;i<=right;i++)nums[i]=tmp[i];}
};
非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!
相关文章:
分治算法——优选算法
本章我们要学习的是分治算法,顾名思义就是分而治之,把大问题分为多个相同的子问题进行处理,其中我们熟知的快速排序和归并排序用的就是分治算法,所以我们需要重新回顾一下这两个排序。 一、快速排序(三路划分…...
EtherCAT转Modbus网关与TwinCAT3的连接及配置详述
在工业自动化控制系统中,常常需要整合不同的通信协议设备。本案例旨在展示如何利用捷米特JM-ECT-RTU协议转换网关模块,实现 EtherCAT 网络与 Modbus 设备之间的无缝连接,并在 TwinCAT3 环境中进行有效配置,以构建一个稳定可靠的自…...
Apache Hadoop YARN框架概述
一、YARN产生和发展简史 1.1背景 数据、程序、运算资源(内存、CPU)三者组在一起,才能完成数据的计算处理过程。在单机环境下,三者之间协调配合不是太大问题。为了应对海量数据的处理场景,Hadoop软件出现并提供了分布…...
三甲医院等级评审八维数据分析应用(八)--数据治理的持续改进与反馈机制篇
一、引言 1.1 研究背景与意义 当前三甲医院在数据管理方面暴露出诸多棘手问题。一方面,数据治理缺乏系统性与规范性,数据标准不统一,不同科室、信息系统之间的数据格式各异、编码混乱,导致数据整合与共享困难重重,严重制约了数据分析的准确性与深度。以某三甲医院为例,…...
XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传
代码结构说明 这段代码的主要功能是: 从指定文件夹中读取所有 XML 文件。 将每个 XML 文件的内容通过 HTTP POST 请求发送到指定的 API 地址。 处理服务器的响应,并记录每个文件的处理结果。 using System; using System.IO; using System.Net; usin…...
科大讯飞前端面试题及参考答案 (下)
除了 echarts 还了解其它画图工具吗? 除了 Echarts,还有不少优秀的画图工具可供选择使用。 Highcharts:它是一款功能强大且应用广泛的图表绘制工具,支持多种常见的图表类型,像柱状图、折线图、饼图、散点图等,同时也能创建较为复杂的图表,比如仪表盘图表、极坐标图等。H…...
【理论】测试框架体系TDD、BDD、ATDD、DDT介绍
一、测试框架是什么 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。 A testing framewo…...
如何进行全脑思维(左脑,右脑,全脑)
1)每人都有一个价值100万美元的点子 . 谁能帮助实施这个点子? . 实施这个点子需要哪些资源? . 推行这个点子需要得到哪些许可? . 是否有实施这个点子的最佳时间? . 作为实施的开始,最简单的做法是什么? 2) 进行理性的、逻辑的、量的思维那一半,而排除了大脑的…...
领域驱动设计 2
1.幂等设计 1.1.定义 无论进行多少次相同的操作,结果都保持一致的设计。 1.2.写操作的幂等性 1.2.1.Insert 指定唯一标识写,是具有幂等性的。 不指定唯一标识写,不具备幂等性。 1.2.2.Update 如果更新操作依赖于与历史状态,…...
十年后LabVIEW编程知识是否会过时?
在考虑LabVIEW编程知识在未来十年内的有效性时,我们可以从几个角度进行分析: 1. 技术发展与软件更新 随着技术的快速发展,许多编程工具和平台不断更新和改进,LabVIEW也不例外。十年后,可能会有新的编程语言或平台…...
ARM交叉编译Boost库
Boost下载:点击跳转 编译过程: 生成project-config.jam ./bootstrap.sh --with-librariesfilesystem,thread --with-toolsetgcc 2. 修改project-config.jam(位于第12行附近) if ! gcc in [ feature.values <toolset> ] …...
uniapp:钉钉小程序需要录音权限及调用录音
{// ... 其他配置项"mp-dingtalk": {"permission": {"scope.userLocation" : {"desc" : "系统希望获得您的定位用于确认您周围的设施数据"},"scope.bluetooth" : {"desc" : "你的蓝牙权限将用于小…...
Swin Transformer模型详解(附pytorch实现)
写在前面 Swin Transformer(Shifted Window Transformer)是一种新颖的视觉Transformer模型,在2021年由微软亚洲研究院提出。这一模型提出了一种基于局部窗口的自注意力机制,显著改善了Vision Transformer(ViT…...
gitee 使用教程
前言 Gitee 是一个中国的开源代码托管平台,类似于 GitHub,旨在为开发者提供一个高效、稳定、安全的代码管理和协作开发环境。Gitee 支持 Git 协议,可以托管 Git 仓库,进行版本控制、代码协作、项目管理等操作。 1. Gitee 的主要…...
基于YOLOv8的水下目标检测系统
基于YOLOv8的水下目标检测系统 (价格90) 使用的是DUO水下目标检测数据集 训练集 6671张 验证集 1111张 测试集 1111张 包含 [holothurian, echinus, scallop, starfish] [海参, 海胆, 扇贝, 海星] 4个类 通过PYQT构建UI界面,包含图片检测,视…...
浅析PCIe链路均衡技术原理与演进
在现代计算机硬件体系的持续演进中,PCIe技术始终扮演着核心角色,其作为连接 CPU 与各类周边设备的关键高速通信链路,不断推动着计算机性能边界的拓展。而 PCIe Link Equalization均衡技术,作为保障数据在高速传输过程中准确性与稳…...
js代理模式
允许在不改变原始对象的情况下,通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后,添加一些额外的逻辑或功能。 科学上网过程 一般情况下,在访问国外的网站,会显示无法访问 因为在dns解析过程,这些ip被禁止解析,所以显示无法访问 引…...
C++虚函数(八股总结)
什么是虚函数 虚函数是在父类中定义的一种特殊类型的函数,允许子类重写该函数以适应其自身需求。虚函数的调用取决于对象的实际类型,而不是指针或引用类型。通过将函数声明为虚函数,可以使继承层次结构中的每个子类都能够使用其自己的实现&a…...
vue的路由守卫逻辑处理不当导致部署在nginx上无法捕捉后端异步响应消息等问题
近期对前端的路由卫士有了更多的认识。 何为路由守卫?这可能是一种约定俗成的名称。就是VUE中的自定义函数,用来处理路由跳转。 import { createRouter, createWebHashHistory } from "vue-router";const router createRouter({history: cr…...
[备忘.OFD]OFD是什么、OFD与PDF格式文件的互转换
OFD(Open Fixed-layout Document)是一种由工业和信息化部软件司牵头中国电子技术标准化研究院制定的版式文档国家标准,属于中国的一种自主格式。OFD旨在打破政府部门和党委机关电子公文格式不统一的问题,以方便电子文档的存…...
3DGS新手避坑指南:COLMAP命令行参数选错,你的Gaussian Splatting训练就白费了
3DGS新手避坑指南:COLMAP参数选择对Gaussian Splatting训练的关键影响 当你第一次接触3D Gaussian Splatting(3DGS)时,可能会被COLMAP预处理环节的各种参数搞得晕头转向。明明按照教程一步步操作,最后生成的3D模型却支…...
电源工程师必看:平均电流模式BUCK双环控制详解(从传递函数到Psim仿真)
电源工程师必看:平均电流模式BUCK双环控制详解(从传递函数到Psim仿真) 在电力电子领域,BUCK变换器的控制策略一直是工程师们关注的重点。作为一名刚入行的电源工程师,我曾被各种控制模式搞得晕头转向——电压模式、峰值…...
LeetCode刷题笔记:用动态规划一口气搞定6道回文串问题(附Java代码)
动态规划解回文问题:从子串到子序列的通用解法 回文串问题在算法面试中出现的频率居高不下,无论是统计回文子串数量、寻找最长回文子串,还是处理回文子序列,动态规划(DP)都是解决这类问题的利器。本文将带你系统掌握六种经典回文问…...
无需安装claude code,在快马平台5分钟构建你的第一个代码生成器原型
最近在研究代码生成工具时,发现Claude Code这个新兴项目挺有意思的。它能够根据自然语言描述生成对应的代码,对于快速原型开发特别有帮助。不过在实际尝试时,我发现本地安装配置过程有点麻烦,需要处理各种环境依赖和版本兼容问题。…...
HTML转Figma工具革新:从网页到设计稿的无缝转换技术指南
HTML转Figma工具革新:从网页到设计稿的无缝转换技术指南 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 一、价值定位:为什么HTML转Figma是设计开发协作的…...
GPEN GPU利用率优化实践:批处理100张老照片的显存与耗时实测
GPEN GPU利用率优化实践:批处理100张老照片的显存与耗时实测 1. 引言:当AI修复老照片遇上效率瓶颈 最近在整理家里的老相册,想把那些模糊的童年照片都修复一下。用GPEN一张张处理虽然效果惊艳,但手动上传、等待、保存࿰…...
保姆级教程:用华为ENSP模拟器搞定AC+AP直连式组网(Web界面全流程)
华为ENSP模拟器实战:从零搭建ACAP无线网络的全流程解析 第一次打开华为ENSP模拟器时,面对密密麻麻的图标和复杂的网络拓扑,很多初学者都会感到无从下手。特别是当需要配置AC控制器和AP接入点组成的无线网络时,Web界面里那些专业术…...
从ChatGPT到Sora:拆解Transformer架构演进,看MHA、MQA、GQA和KV Cache如何决定大模型推理速度
从ChatGPT到Sora:Transformer架构演进与推理加速实战 在生成式AI爆发的时代,Transformer架构已成为大模型的核心引擎。从ChatGPT的惊艳表现到Sora的视频生成突破,背后都离不开对注意力机制的持续优化。本文将深入剖析MHA、MQA、GQA等关键技术…...
3步完成B站视频转文字:免费开源工具bili2text完整指南
3步完成B站视频转文字:免费开源工具bili2text完整指南 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为手动记录B站视频内容而烦恼吗&#x…...
微前端路由与导航:在micro-frontends中实现页面跳转的终极指南
微前端路由与导航:在micro-frontends中实现页面跳转的终极指南 【免费下载链接】micro-frontends extending the microservice paradigms to web development 项目地址: https://gitcode.com/gh_mirrors/mi/micro-frontends 微前端(micro-fronten…...
