算法—分治

        

        分而治之:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时,采用这种思想,基本问题指问题规模最小时的情况,次级问题是指主问题的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,一经查实,立即删除!

相关文章

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; 运行起来以后效果是这样的&…

用于扩展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提供实时时…

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…

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…

【SVN】clean up报错:Cleanup failed to process the following paths 解决方法

报错来源&#xff1a;代码更新有一个文件既不能接受自己的也不能接受别人的&#xff0c;只能取消&#xff0c;再提交提醒clean up&#xff0c;随后报标题错误。 解决方法&#xff1a;参考https://www.cnblogs.com/pinpin/p/11395438.html 注&#xff1a;如果clean up的时候有…

基于ssm项目校园快递平台系统

采用技术 基于SpringBoot框架实现的web的智慧社区系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 订单管理 快递管理 公告管理 公告类…

基于YOLOv5s的电动车入梯识别系统(数据集+权重+登录界面+GUI界面+mysql)

本人训练的yolov5s模型&#xff0c;准确率在98.6%左右&#xff0c;可准确完成电梯内检测电动车任务&#xff0c;并搭配了GUI检测界面&#xff0c;支持权重选择、图片检测、视频检测、摄像头检测、识别结果拍照和在线标注数据集等功能。 共有4000张左右图片&#xff0c;全部为电…

机器人瓶胚检测工作站(H3U脉冲轴控制)

1、变量定义 2、程序监控1 2、 程序监控2 3、程序监控3 机器人输送料和机构的动作安全尤为重要&#xff0c;下面我们讨论下安全联锁控制逻辑

基于STM32F103单片机的时间同步项目

一、前言 本项目为前一个时间同步项目的更迭版本&#xff0c;由于之前的G031开发板没有外部晶振&#xff0c;从机守时能力几乎没有&#xff0c;5秒以上不同步从机时间就开始飞了。在考虑成本选型后&#xff0c;选择了带有外部有缘晶振的STM32F103C8T6最小单片机&#xff0c;来作…

解决mac本git安装后找不到命令的问题

不熟悉mac配置&#xff0c;折腾了半天&#xff0c;记录一下。 1.问题描述2.解决方法 1.问题描述 从https://sourceforge.net/projects/git-osx-installer/files/下载的git安装包&#xff1a; 安装时提示&#xff1a; 这里的解决办法是按住control键再打开文件安装。 安装完…

react antd 实现修改密码(原密码,新密码,再次输入新密码,新密码增加正则复杂度校验)

先看样子 组件代码&#xff1a; import React, { useState, useEffect } from react import { Row, Col, Modal, Spin, Input, Button, message, Form } from antd import { LockOutlined, EyeTwoTone, EyeInvisibleOutlined } from ant-design/icons import * as Serve from …