算法—分治

        

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

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

相关文章

Harmony鸿蒙南向外设驱动开发-Audio

Audio驱动概述 多媒体系统是物联网设备开发中不可缺少的一部分&#xff0c;Audio作为其中重要的一个模块&#xff0c;Audio驱动模型的构建显得尤为重要。 本文主要介绍基于HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架开发的Audio驱动&#xff0c;包括Aud…

【数据结构(五)】栈

❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.概念3.栈的使用4.栈的应用场景4.1有效的括号4.2逆波兰表达式4.3栈的压入弹…

分布式系统接口限流方案

Git地址&#xff1a;https://gitee.com/deepjava/test-api-limit.git 方案一、 Guava工具包 实现单机版限流 具体代码见git 方案二、Redis lua脚本 实现分布式系统的接口限流 具体代码见git

AI虽强,搜索引擎仍不可或缺

AI 领域正以前所未有的速度发展&#xff0c;大模型的发布变得愈发频繁&#xff0c;模型的规模也在持续扩大。如今&#xff0c;大模型的起点已经攀升至数十亿参数&#xff08;数十 B&#xff0c;B 是 Billion 的简写&#xff0c;10 亿&#xff09;&#xff0c;其功能之广泛&…

OSCP靶场--Banzai

OSCP靶场–Banzai 考点(ftp爆破 webshell上传web1访问403web2可以访问webshell反弹mysql udf提权) 1.nmap扫描 ## nmap扫描一定要使用 -p- 否则容易扫不全端口 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.158.56 -Pn -p- --min-rate 2500Starting Nmap 7.…

循序渐进丨MogDB 数据库带级联从库的集群切换后如何保持原有架构?

生产数据库运行过程中可能会涉及到升级或者打补丁&#xff0c;导致各节点的角色有计划的发生改变。如果集群内角色发生改变&#xff0c;是否还能保持原有架构继续对外提供服务呢&#xff1f;我们来做一下测试。 采用22模式模拟同城两机房部署4节点 MogDB 数据库集群&#xff0c…

【计算机毕业设计】人事管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

设计模式(22):解释器模式

解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器&#xff0c;主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时&#xff0c;可以考虑使用解释器模式尽量不要使用解释器模式&#xff0c;后期维护会有很大麻烦。在项目中&…

基于java+springboot+vue实现的居家养老健康管理系统(文末源码+Lw)23-313

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装智慧社区居家养老健康管理系统软件来发挥其高效地信息处理…

c++编程(3)——类和对象(1)、类

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 类对象类的访问权限类的作用域 类 c最初对c语言的扩展就是增加了类的概念&#xff0c;使得c语言在原有的基础之上可以做到信息隐藏和封装。 那么我们先来讲讲“带类的c”与C语言相比有什么改进。 先讲讲类…

使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景&#xff0c;博主所在的业务组有一个核心系统&#xff0c;需要同步两个不同数据源给过来的数据到redis中&#xff0c;但是每次同步之前需要过滤掉一部分数据&#xff0c;只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

SpringBoot项目中拦截器获取Body参数的问题

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 首先我们要知道一个问题: HttpServletRequest的输入流只能读取一次,如…