算法—分治

        

        分而治之:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时,采用这种思想,基本问题指问题规模最小时的情况,次级问题是指主问题的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.mzph.cn/news/812357.shtml

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

相关文章

【Linux】编写一个 shell 脚本执行

在Linux中编写和执行脚本相对简单。下面是一个基本的步骤指南&#xff0c;帮助你创建一个简单的bash脚本并运行它&#xff1a; 1. 创建脚本文件 首先&#xff0c;你需要使用文本编辑器创建一个新的文件。这个文件通常会有 .sh 的扩展名&#xff0c;以表明它是一个shell脚本。…

Android 纵向双选日历

这个日历的布局分两部分&#xff0c;一部分是显示星期几的LinearLayout&#xff0c;另外就是一个RecyclerView&#xff0c;负责纵向滚动了。 工具类&#xff1a; implementation com.blankj:utilcode:1.17.3上activity_calendar代码&#xff1a; <?xml version"1.0&…

研究了一款Vue2开发的Markdown编辑器

最近突然喜欢开始写作了&#xff0c;写笔记&#xff0c;写日记&#xff0c;写总结&#xff0c;各种写。所以&#xff0c;想要打造一个自己喜欢的编辑器&#xff0c;于是开始研究。 首先来看看我从Github丄扒拉到的这个开源的代码&#xff1a; 运行起来以后效果是这样的&…

探究C++20协程(1)——C++协程概览

什么是协程&#xff1f; 协程就是一段可以挂起&#xff08;suspend&#xff09;和恢复&#xff08;resume&#xff09;的程序&#xff0c;一般而言&#xff0c;就是一个支持挂起和恢复的函数。 一般情况下&#xff0c;函数一旦开始&#xff0c;就无法暂停。如果一个函数能够暂…

用于扩展Qt自身的插件(下)

扩展Qt自身的插件 引言必须满足项创建插件示例代码生成插件配置加载插件的环境创建使用插件的项目配置库和头文件依赖的步骤:应用程序代码运行结果总结引言 本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设…

走进MySQL:从认识到入门(针对初学者)

一&#xff0c;引言 MySQL是一款久负盛名且广泛应用的关系型数据库管理系统&#xff0c;自1995年Michael Widenius和David Axmark在瑞典和芬兰发起研发以来&#xff0c;其发展历程可谓辉煌且深远。作为开源软件的代表&#xff0c;MySQL以其卓越的成本效益、高性能及高可靠性赢得…

关于 Amazon DynamoDB 的学习和使用

文章主要针对于博主自己的技术栈&#xff0c;从Unity的角度出发&#xff0c;对于 DynamoDB 的使用。 绿色通道&#xff1a; WS SDK for .NET Version 3 API Reference - AmazonDynamoDBClient Amazon DynamoDB Amazon DynamoDB is a fast, highly scalable, highly available,…

Harmony鸿蒙南向驱动开发-RTC接口使用

功能简介 RTC&#xff08;real-time clock&#xff09;为操作系统中的实时时钟设备&#xff0c;为操作系统提供精准的实时时间和定时报警功能。当设备下电后&#xff0c;通过外置电池供电&#xff0c;RTC继续记录操作系统时间&#xff1b;设备上电后&#xff0c;RTC提供实时时…

【Java SE】11.认识异常

目录 1.异常的概念与体系结构 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 2.异常的处理 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.3.1异常声明throws 2.3.2try-catch捕获并处理 2.3.3finally 2.4异常的处理流程 3.自定义异常类 1.异常的概念与体系结构 …

MAC OS关闭SIP(navicat 无法保存密码)

最近安装navicat&#xff08;16.3.7&#xff09;时,安装后无法保存密码,保存密码会报错如下&#xff1a; 因为用的破解版&#xff0c;一开始是打不开的&#xff0c;用自带的修复软件修复后就可以打开了&#xff0c;但是保存密码就会报错&#xff0c;按照网上的一些操作 1、卸载…

蓝桥杯嵌入式(G431)备赛笔记——RTC

// RTC time// 声明一个变量 rtc_tick 用于记录上次 RTC 处理的时间 u32 rtc_tick 0;// 声明结构体变量 D 用于存储 RTC 的日期信息 RTC_DateTypeDef D;// 声明结构体变量 T 用于存储 RTC 的时间信息 RTC_TimeTypeDef T;// RTC_proc 函数&#xff0c;用于处理 RTC 时间 void R…

Github 2024-04-10 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10Shell项目1Python项目1Git - 快速、可扩展、分布式的版本控制系统 创建周期:5740 天开发语言:C, Shell协议类型:OtherStar数量:4955…

.NET 设计模式—享元模式(Flyweight Pattern)

简介 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它旨在减少系统中相似对象的内存占用或计算开销&#xff0c;通过共享相同的对象来达到节省资源的目的。 享元模式提供了一种高效地共享对象的方式&#xff0c;从而减少了内存占用和提…

vue3-video-play 在安卓上正常播放,在ios上不能播放,问题解决

1.ios上autoplay需要静音&#xff0c;在播放后再打开声音 <vue3videoPlay v-if"!isComponent" v-bind"options" :playsinline"playsinline"></vue3videoPlay>let playsinline computed(() > {if (props.isComponent) {return}o…

【电路笔记】-异或门

异或门 文章目录 异或门1、概述2、数字逻辑异或门3、异或门等效电路异或逻辑函数是一个非常有用的电路,可用于许多不同类型的计算电路。 1、概述 异或门是算术运算中常用的另一种数字逻辑门,因为它可以用来给出两个二进制数的和以及错误检测和纠正电路。 在前面的文章中,我…

Photoshop 2023 中文---创意与设计的新篇章

Photoshop 2023是由Adobe Systems开发和发行的一款强大的图像处理软件&#xff0c;广泛应用于专业摄影师、设计师、艺术家等用户群体。它拥有丰富的功能和工具&#xff0c;可以轻松进行图像编辑、合成、调整和修复等任务。在Photoshop 2023中&#xff0c;智能选择功能得到了升级…

python爬虫-------urllib代理和代理池(第十七天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Kubernetes(k8s):深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用

Kubernetes&#xff08;k8s&#xff09;&#xff1a;深入理解k8s中的亲和性&#xff08;Affinity&#xff09;及其在集群调度中的应用 1、什么是亲和性&#xff1f;2、节点亲和性&#xff08;Node Affinity&#xff09;2.1 硬性节点亲和性规则&#xff08;required&#xff09;…

paddle实现手写数字模型(一)

参考文档&#xff1a;paddle官网文档环境&#xff1a;Python 3.12.2 &#xff0c;pip 24.0 &#xff0c;paddlepaddle 2.6.0 python -m pip install paddlepaddle2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple调试代码如下&#xff1a; LeNet.py import paddle import p…

013_NaN_in_Matlab中的非数与调试方法

Matlab中的非数与调试方法 是什么&#xff1f; Matlab编程&#xff08;计算器使用&#xff09;中经常有个错误给你&#xff0c;这句话里可能包含一个关键词NaN。大部分学生都有过被 NaN 支配的痛苦记忆。 NaN 是 Not a Number 的缩写&#xff0c;表示不是一个数字。在 Matla…