算法—分治

        

        分而治之:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时,采用这种思想,基本问题指问题规模最小时的情况,次级问题是指主问题的n级降低n-1级的问题。

        具体实现:多数采用递归操作分解,然后递归操作,需要注意的是函数头,函数体,以及递归出口,函数头:由问题所需变量指定,递归出口由问题最小规模返回决定,函数体看问题具体的需要的信息决定。

75. 颜色分类 - 力扣(LeetCode)

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

 分治-快速排序:下面这三题:都是快排,其中第一题快排,第二题,在快排的基础上,进行剪枝,避免无用的排序,第三题同理,也是避免无用排序。通过设置进入那个递归来实现。

 . - 力扣(LeetCode)

class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(0));sort1(nums,0,nums.size()-1);return nums;}   void sort1(vector<int>& nums,int left,int right){if(left>=right) return;//int key=Getrand(nums,left,right);//swap(nums[left],key);Ⅲ、交换会覆盖一个,不是交换int cur=left;int l=left-1; int r=right+1;while(cur<r){//Ⅱ、cur判断数据时,之后可能会越界,所以一次只能判断一个条件,然后需要判断cur<r,不能多个if。if(nums[cur]>key) swap(nums[cur],nums[--r]);else if(nums[cur]<key) swap(nums[cur++],nums[++l]);else if(nums[cur]==key) cur++;}sort1(nums,left,l);sort1(nums,r,right);}int Getrand(vector<int>& nums,int left,int right){int rd=rand();return  nums[rd%(right-left+1)+left];    //Ⅰ:记得+left,否则超范围,}
};

215. 数组中的第K个最大元素 - 力扣(LeetCode) 

数组中第k个最大元素,①:快速选择,利用快排思想(三路划分),实现O(n),②:利用优先队列(堆):找大的就是用小根堆。找小的用大根堆。O(Nlog2k);

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

LCR 159. 库存管理 III - 力扣(LeetCode)

class Solution {
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {//如何提取区间srand(time(0));qsort(stock,0,stock.size()-1,cnt);return vector<int>(stock.begin(),stock.begin()+cnt);}void qsort(vector<int>& stock,int l,int r,int cnt){if(l>=r) return ;//若没有则,getrand会出错;%0错误。int key=GetRand(stock,l,r);int cur=l,left=l-1,right=r+1;while(cur<right){if(stock[cur]<key) swap(stock[cur++],stock[++left]);else if(stock[cur]>key) swap(stock[cur],stock[--right]);else cur++;}int a=left-l+1; int b=right-left-1; int c=r-right+1;if(cnt<=a)  qsort(stock,l,left,cnt);else if(cnt<=a+b) return ;else qsort(stock,right,r,cnt-a-b);}int GetRand(vector<int>& stock,int l,int r){int rd=rand();return stock[rd%(r-l+1)+l];}
};

分治——归并排序 

912. 排序数组 - 力扣(LeetCode)

class Solution {vector<int> tmp;
public:vector<int> sortArray(vector<int>& nums) {//归并tmp.resize(nums.size());MageSort(nums,0,nums.size()-1);return nums;}void MageSort(vector<int>& nums,int l,int r){if(l>=r) return;int mid=l+(r-l)/2;MageSort(nums,l,mid);MageSort(nums,mid+1,r);int cur1=l;int cur2=mid+1;int cur=l;while(cur1<=mid&&cur2<=r){if(nums[cur1]<=nums[cur2]){tmp[cur++]=nums[cur1++];}else if(nums[cur1]>nums[cur2]){tmp[cur++]=nums[cur2++];}}while(cur1<=mid) tmp[cur++]=nums[cur1++];while(cur2<=r) tmp[cur++] =nums[cur2++];//拷贝回去int left=l,right=r;while(left<=right) {nums[left]=tmp[left];//*****只有一个left++,首先执行”=“左边的那个部分语句,所有left拷贝给left+1.left++;}return;}
};

LCR 170. 交易逆序对的总数 - 力扣(LeetCode)

class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& record) {int ret=0;tmp.resize(record.size());return magesort(record,0,record.size()-1,ret);}int magesort(vector<int>& record ,int left,int right,int& ret){if(left>=right) return 0;int mid=left+(right-left)/2;magesort(record,left,mid,ret);magesort(record,mid+1,right,ret);int cur=left; int cur1=left,cur2=mid+1;while(cur1<=mid&&cur2<=right){if(record[cur1]<=record[cur2]) tmp[cur++]=record[cur2++];//降序。else{ret+=right-cur2+1;//****记录左边数组的每个值对应的,右边小于它的个数,right-cur2+1是降序tmp[cur++]=record[cur1++];}}while(cur1<=mid) tmp[cur++]=record[cur1++];while(cur2<=right) tmp[cur++]=record[cur2++];//拷贝回去,复原for(int i=left;i<=right;i++){//*****拷贝要left到right。完整一段record[i]=tmp[i];}return ret;}
};

 315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)

class Solution {vector<int> tmp;vector<int> tmp_index;vector<int> index;vector<int> ret;
public:vector<int> countSmaller(vector<int>& nums) {ret.resize(nums.size());index.resize(nums.size());for(int i=0;i<nums.size();i++){//建立变换后的下标[i]与原下标i之间的映射index[i]=i;}tmp.resize(nums.size());tmp_index.resize(nums.size());MageSort(nums,0,nums.size()-1);return ret;}void MageSort(vector<int>& nums,int left,int right){if(left>=right) return;int mid=left+(right-left)/2;MageSort(nums,left,mid);MageSort(nums,mid+1,right);int cur=left;int cur1=left; int cur2=mid+1;while(cur1<=mid&&cur2<=right){if(nums[cur2]<nums[cur1]){//降序,求右区间小于cur1的个数ret[index[cur1]]+=right-cur2+1;tmp[cur]=nums[cur1];tmp_index[cur++]=index[cur1++];//**1***保持映射}else{tmp[cur]=nums[cur2];tmp_index[cur++]=index[cur2++];}}while(cur1<=mid) {tmp[cur]=nums[cur1];tmp_index[cur++]=index[cur1++];}while(cur2<=right){tmp[cur]=nums[cur2];//**1**多加了++tmp_index[cur++]=index[cur2++];}//还原for(int i=left;i<=right;i++){nums[i]=tmp[i];index[i]=tmp_index[i];}}};

 493. 翻转对 - 力扣(LeetCode)

class Solution {int ret=0;vector<int> tmp;
public:int reversePairs(vector<int>& nums) {int n=nums.size();tmp.resize(n);MageSort(nums,0,n-1);return ret;}void MageSort(vector<int>& nums,int left,int right){if(left>=right) return ;int mid=(left+right)>>1;MageSort(nums,left,mid);MageSort(nums,mid+1,right);int cur1=left; int cur2=mid+1;while(cur1<=mid&&cur2<=right){// cout<<left<<" "<<mid<<" "<<mid+1<<" "<<right<<endl;//**1**打印也会出现超时的错误// cout<<nums[cur1]/2.0<<"  "<<nums[cur2]<<endl;if(nums[cur1]/2.0>nums[cur2]){//**2***一定要2.0,否则会出现3/2不大于1的情况,降序ret+=right-cur2+1;cur1++;}else{cur2++;}}   int cur=left;  cur1=left;  cur2=mid+1;while(cur1<=mid&&cur2<=right){if(nums[cur1]>=nums[cur2]){tmp[cur++]=nums[cur1++];}else{;tmp[cur++]=nums[cur2++];}}while(cur1<=mid) tmp[cur++]=nums[cur1++];while(cur2<=right)tmp[cur++]=nums[cur2++];//还原for(int i=left;i<=right;i++){nums[i]=tmp[i];}return ;}
};

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

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

相关文章

视频国标学习

总体介绍 GB/T28181协议&#xff0c;全名叫《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是由中国国家标准委员会发布的一种国家级的标准。它主要对视频监控系统的各个方面做了明确的规定&#xff0c;使得不同厂商生产的视频监控设备能够相互连通&am…

多普勒频移

下面从频谱的角度理解多普勒频移。 设目标以速度接近雷达&#xff0c;在时刻距离&#xff0c;则在任意时刻目标与雷达的距离为 设雷达发射信号为。设时刻发射的信号经过遇到目标&#xff0c;则由于目标与信号相向运动&#xff0c;有 得到&#xff0c;从而时刻发射的信号经过返回…

2024蓝桥杯——宝石问题

先展示题目 声明 以下代码仅是我的个人看法&#xff0c;在自己考试过程中的优化版&#xff0c;本人考试就踩了很多坑&#xff0c;我会—一列举出来。代码可能很多&#xff0c;但是总体时间复杂度不高只有0(N) 函数里面的动态数组我没有写开辟判断和free&#xff0c;这里我忽略…

C语言:文件操作(三)

目录 前言 5、文章的随机读写 5.1 fseek 5.2 ftell 5.3 rewind 结语 前言 本篇文章继续讲解文件操作&#xff0c;讲解文件的随机读写&#xff0c;主要有三个函数&#xff1a;fseek&#xff1b;ftell&#xff1b;rewind。 前面讲解的函数都是对文件内容进行顺序读写&#x…

数据湖技术选型——Flink+Paimon 方向

文章目录 前言Apache Iceberg存储索引metadataFormat V2小文件 Delta LakeApache Hudi存储索引COWMOR元数据表 Apache PaimonLSMTagconsumerChangelogPartial Update 前言 对比读写性能和对流批一体的支持情况&#xff0c;建议选择Apache Paimon截止2024年1月12日数据湖四大开…

WordPress网站上添加看板娘

续接上篇——基于LNMP部署wordpress-CSDN博客 目录 一.下载并解压 二.设置头文件 修改header.php 修改配置文件footer.php 三.将你设置的主题包上传到/usr/share/nginx/html/wp-content这个目录里 四.扩展——将看板娘修改到左侧 一.下载并解压 [rootaliyun ~]# wget htt…

抖音小店被投诉侵权后怎么办?别慌!教你如何申诉!

大家好&#xff0c;我是电商花花。 这两年听到最多的违规除了低价违规之外&#xff0c;就是专利侵权&#xff0c;现在听到不少风声&#xff0c;最近查专利侵权的不少&#xff0c;很多人商家失足踩了坑。 目前来说像3C数码&#xff0c;服装&#xff0c;玩具类目、部分母婴产品…

定时器产生延时停止

1&#xff0c;需求&#xff1a; 当按下按钮SB1,输出信号为0N,指示灯点亮;按下按钮SB2,经过10s的延时后,指示灯熄灭 2&#xff0c;关闭使用定时的常闭触电

强大的Python爬虫技巧:数据抓取、网页解析、自动化

主流电商平台商品详情主页数据采集&#xff0c;大批量高并发的数据采集&#xff0c;我们需要用电商API接口接入的方式实现电商数据自动化采集。 Python爬虫是一项强大的技术&#xff0c;可以用于从互联网上抓取数据、解析网页内容&#xff0c;并实现自动化任务。本文将介绍一些…

如何应对MySQL单表数据量过大:垂直分表与水平分表策略解析

话接上回&#xff0c;单表最大数据建议两千万&#xff0c;那如果开发一个项目&#xff0c;预计注册量达到一个亿怎么办。 单表内放这么多数据&#xff0c;MYSQL底层B树的层级结构就可能会变得很高&#xff0c;磁盘io次数变多&#xff0c;性能会大幅度降低。所以考虑数据库分表…

Contained连接Harbor仓库,报错failed to call tryLoginWithRegHost

1、Harbor镜像仓库地址&#xff1a;192.168.0.190 2、Contained地址&#xff1a;192.168.0.179&#xff08;k8s集群master节点&#xff09; 3、创建目录/etc/containerd/certs.d/镜像仓库Harbor ip mkdir -p /etc/containerd/certs.d/192.168.0.190 4、进人上面目录&#xff0…

mybatis-puls 条件分析插件

一&#xff0c;能做什么 我们在平时的开发中,会遇到一些慢sql. MP也提供了性能分析插件,如果超过这个时间就停止运行! 二&#xff0c;如何实现 2.1引入条件分析插件 //性能分析BeanProfile({"dev","test"}) //设置dev 和 test环境开启public Performanc…

牛客周赛 Round 39(A,B,C,D,E,F,G)

比赛链接 官方题解&#xff08;视频&#xff09; B题是个贪心。CD用同余最短路&#xff0c;预处理的完全背包&#xff0c;多重背包都能做&#xff0c;比较典型。E是个诈骗&#xff0c;暴力就完事了。F是个线段树。G是个分类大讨论&#xff0c;出题人钦定的本年度最佳最粪 题目…

《自动机理论、语言和计算导论》阅读笔记:p172-p224

《自动机理论、语言和计算导论》学习第 8 天&#xff0c;p172-p224总结&#xff0c;总计 53 页。 一、技术总结 1.Context-Free Grammar(CFG) 2.parse tree (1)定义 p183&#xff0c;But perhaps more importantly, the tree, known as a “parse tree”, when used in a …

用二进制译码器实现组合逻辑函数

用二进制译码器实现组合逻辑函数 原理 由于 n n n 位二进制译码器可提供 2 n 2^n 2n 个最小项的输出&#xff0c;而任一个逻辑函数都可变换为最小项之和的标准与或式&#xff0c;因此利用译码器和门电路可实现单输出及多输出组合逻辑电路 基本步骤 选择合适的集成二进制译…

使用Scrapy选择器提取豆瓣电影信息,并用正则表达式从介绍详情中获取指定信息

本文同步更新于博主个人博客&#xff1a;blog.buzzchat.top 一、Scrapy框架 1. 介绍 在当今数字化的时代&#xff0c;数据是一种宝贵的资源&#xff0c;而网络爬虫&#xff08;Web Scraping&#xff09;则是获取网络数据的重要工具之一。而在 Python 生态系统中&#xff0c;S…

社交媒体数据恢复:Viber

Viber是一款流行的即时通讯应用&#xff0c;用于发送消息、语音通话和视频通话。然而&#xff0c;有时候我们会不小心删除一些重要的Viber聊天记录&#xff0c;这时候就需要进行数据恢复。本文将介绍如何在安卓设备上进行Viber数据恢复。 一、使用安卓数据恢复软件 安卓数据恢…

排序算法之选择排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性选择排序O(n^2 )O(n^2)O(n^2)O(1)In-place不稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1…

jdk和Eclipse软件安装与配置(保姆级别教程)

目录 1、jdk的下载、安装、配置 1.1 jdk安装包的的下载地址&#xff1a;Java Archive | Oracle &#xff0c;点击进入&#xff0c;然后找到你想要的版本下载&#xff0c;如下图&#xff1a; 2.1 开始下载&#xff0c;如下图&#xff1a; 3.1 登入Oracle账号就可以立即下载了…

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标&#xff1a;让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…