leetcode算法之分治-归并

目录

  • 1.排序数组
  • 2.数组中的逆序对
  • 3.计算右侧小于当前元素的个数
  • 4.翻转对

1.排序数组

排序数组
在这里插入图片描述

//分治-归并
class Solution {int tmp[50010];
public:vector<int> sortArray(vector<int>& nums) {mergeSort(nums,0,nums.size()-1);return nums;}void mergeSort(vector<int>& nums,int left,int right){if(left>=right) return;//1.选择中间点划分区间int mid = (left+right)>>1;//[left,mid][mid+1,right]//2.将左右两区间排序mergeSort(nums,left,mid);mergeSort(nums,mid+1,right);//3.合并两个有序数组int cur1 = left,cur2 = mid+1,i=0;while(cur1<=mid && cur2<=right){tmp[i++] = nums[cur1]>=nums[cur2]?nums[cur2++]:nums[cur1++];}while(cur1<=mid) tmp[i++] = nums[cur1++];while(cur2<=right) tmp[i++] = nums[cur2++];//还原for(int j=left;j<=right;j++){nums[j] = tmp[j-left];}}
};

2.数组中的逆序对

数组中的逆序对
在这里插入图片描述

class Solution {int tmp[50010];
public:int reversePairs(vector<int>& nums) {return mergeSort(nums,0,nums.size()-1);}int mergeSort(vector<int>& nums,int left,int right){if(left>=right) return 0;int ret = 0;//1.选择中间元素划分区间int mid = (left+right)>>1;//[left,mid][mid+1,right]//2.计算左右区间的逆序对的个数ret += mergeSort(nums,left,mid);ret += mergeSort(nums,mid+1,right);//3.计算一左一右逆序对的个数+合并两个有序数组int cur1 = left,cur2 = mid+1,i=0;while(cur1<=mid&& cur2<=right)//升序{if(nums[cur1]<=nums[cur2]) tmp[i++] = nums[cur1++];else{ret += mid-cur1+1;tmp[i++] = nums[cur2++];}}while(cur1<=mid) tmp[i++] = nums[cur1++];while(cur2<=right) tmp[i++] = nums[cur2++];//还原for(int j=left;j<=right;j++){nums[j] = tmp[j-left];}return ret;}
};

3.计算右侧小于当前元素的个数

计算右侧小于当前元素的个数
在这里插入图片描述

class Solution {vector<int> ret;vector<int> index;//记录nums当前元素的原始下标int tmpNums[500010];int tmpIndex[500010];
public:vector<int> countSmaller(vector<int>& nums) {//计算当前元素之后,有多少个比我小(降序)int n = nums.size();ret.resize(n);index.resize(n);//初始化index数组for(int i=0;i<n;i++){index[i] = i;}mergeSort(nums,0,n-1);return ret;}void mergeSort(vector<int>& nums,int left,int right){if(left>=right) return;//1.选择中间元素划分区间int mid = (left+right)>>1;//[left,mid][mid+1,right]//2.将左右区间进行排序mergeSort(nums,left,mid);mergeSort(nums,mid+1,right);//3.处理一左一右的情况int cur1 = left,cur2 = mid+1,i=0;while(cur1<=mid&& cur2<=right)//降序{if(nums[cur1]<=nums[cur2]){tmpNums[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}else{ret[index[cur1]] += right-cur2+1;tmpNums[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}}while(cur1<=mid) {tmpNums[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}while(cur2<=right){tmpNums[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}//还原for(int j=left;j<=right;j++){nums[j] = tmpNums[j-left];index[j] = tmpIndex[j-left];}}
};

4.翻转对

翻转对
在这里插入图片描述

//计算当前元素之前,有多少元素的一半比我大--升序
class Solution {int tmp[50010];
public:int reversePairs(vector<int>& nums) {return mergeSort(nums,0,nums.size()-1);  }int mergeSort(vector<int>& nums,int left,int right){if(left>=right) return 0;int ret = 0;//1.选择中间元素划分区间int mid = (left+right)>>1;//[left,mid][mid+1,right]//2.计算左右区间翻转对的个数ret += mergeSort(nums,left,mid);ret += mergeSort(nums,mid+1,right);//3.先计算翻转对的个数int cur1 = left,cur2 = mid+1,i=0;while(cur2<=right)//升序的情况{while(cur1<=mid && nums[cur1]/2.0<=nums[cur2]) cur1++;if(cur1 > mid) break;ret += mid-cur1+1;cur2++;}//4.合并两个有序数组cur1 = left,cur2 = mid+1;while(cur1<=mid && cur2<=right)//升序{tmp[i++] = nums[cur1]<=nums[cur2]?nums[cur1++]:nums[cur2++];}while(cur1<=mid) tmp[i++] = nums[cur1++];while(cur2<=right) tmp[i++] = nums[cur2++];//还原for(int j=left;j<=right;j++){nums[j] = tmp[j-left];}return ret;}
};
//计算当前元素后面,有多少元素的两倍比我小--降序
class Solution {int tmp[50010];
public:int reversePairs(vector<int>& nums) {return mergeSort(nums,0,nums.size()-1);  }int mergeSort(vector<int>& nums,int left,int right){if(left>=right) return 0;int ret = 0;//1.选择中间元素划分区间int mid = (left+right)>>1;//[left,mid][mid+1,right]//2.计算左右区间翻转对的个数ret += mergeSort(nums,left,mid);ret += mergeSort(nums,mid+1,right);//3.先计算翻转对的个数int cur1 = left,cur2 = mid+1,i=0;while(cur1<=mid)//降序的情况{while(cur2<=right && nums[cur1]/2.0<=nums[cur2]) cur2++;if(cur2 > right) break;ret +=right-cur2+1;cur1++;}//4.合并两个有序数组cur1 = left,cur2 = mid+1;while(cur1<=mid && cur2<=right)//降序{tmp[i++] = nums[cur1]<=nums[cur2]?nums[cur2++]:nums[cur1++];}while(cur1<=mid) tmp[i++] = nums[cur1++];while(cur2<=right) tmp[i++] = nums[cur2++];//还原for(int j=left;j<=right;j++){nums[j] = tmp[j-left];}return ret;}
};

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

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

相关文章

源启容器平台KubeGien 打造云原生转型的破浪之舰

云原生是应用上云的标准路径&#xff0c;也是未来发展大的趋势。如何将业务平滑过渡到云上&#xff1f;怎样应对上云期间的各项挑战呢&#xff1f;中电金信基于金融级数字底座“源启”打造了一款非常稳定可靠、多云异构、安全可控、开放灵活的容器平台产品——源启容器平台Kube…

主播-产品痛点话术

—、用户体验差我们的产品在用户体验方面存在一些问题。首先&#xff0c;产品的操作流程不够顺畅&#xff0c;导致用户在使用过程中经常遇到困扰。另外&#xff0c;我们的产品界面设计不够美观&#xff0c;无法给用户带来愉悦的使用体验。针对这些问题&#xff0c;我们将对产品…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

Unity 头顶图文字性能优化

如图&#xff1a;常规的排版&#xff0c;会有很多Batches。这是优化后的Batches只有3。 常用解决方案&#xff1a; 1、创建两个Canvas&#xff0c;一个放所有文本Text&#xff0c;一个放所有Image。但这里有会有两个问题&#xff1a;一旦文字夹在两个Image中间&#xff0c;还有…

外汇天眼:经济调控之术!升息如何化解通货膨胀的困扰?

为了遏制通货膨胀&#xff0c;美国在过去的一段时间一直持续进行升息。尽管通胀数据的降幅并不迅速&#xff0c;但至少上涨势头得到了抑制。那么&#xff0c;升息为何能够遏制通胀呢&#xff1f;本文将简要探讨这一问题。 通货膨胀的根本原因在于货币供应量过多&#xff0c;也就…

深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

中间件安全:Apache Tomcat 弱口令.(反弹 shell 拿到服务器的最高控制权.)

中间件安全&#xff1a;Apache Tomcat 弱口令. Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。 通过弱口令登录后台&#xff0c;部署 war 包…

重生之我是一名程序员 34

哈喽啊大家晚上好&#xff01; 今天给大家带来的知识是——库函数qsort。首先&#xff0c;给大家介绍一下qsort函数&#xff0c; qsort函数是C标准库中的一种排序函数&#xff0c;用于对数组中的元素进行快速排序。它接受四个参数&#xff1a;待排序数组的基地址&#xff0c;数…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第五套智能合约安全漏洞测试

第五套题的智能合约安全漏洞测试题目 环境 : ubuntu20 Truffle v5.8.3 (core: 5.8.3) Ganache v7.8.0 Solidity v0.8.3 Node v18.16.0 Web3.js v1.8.2 前言 请在测试的时候开启ganache打开,并且在truffle的配置文件配好ganache,之前两个帖子忘说了/(ㄒoㄒ)/~~ truffle-con…

YOLO改进系列之注意力机制(GAM Attention模型介绍)

模型结构 为了提高计算机视觉任务的性能&#xff0c;人们研究了各种注意力机制。然而以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此&#xff0c;liu提出了一种通过减少信息弥散和放大全局交互表示来提高深度神经网络性能的全局注意力机制。作者的目…

一文讲解eBPF helper 函数的设计与实现

您是否想为内核添加一个新的 eBPF 辅助&#xff08;helper&#xff09;函数&#xff0c;但不知道从何入手&#xff1f;或者&#xff0c;您是否曾遇到过类似于 R2 typectx expectedfp, pkt, pkt_meta, map_value 的 eBPF verifier 报错&#xff1f;本文将从代码层面对 eBPF 辅助…

“一键导出,高效整理:将之前的部分记录导出!“

亲爱的朋友们&#xff0c;你们是否曾经为了导出之前的记录而感到烦恼&#xff1f;冗长的过程&#xff0c;无法精确控制的选项&#xff0c;实在让人感到心力交瘁。但现在&#xff0c;我们为你带来一种全新的解决方案&#xff0c;让你的工作更轻松&#xff0c;更高效&#xff01;…

功率放大器应用领域分享:微流控细胞分选在“软骨”芯片关节炎治疗研究中的应用

微流控技术是一种通过微小的通道和微型装置对流体进行精确操控和分析的技术&#xff0c;它是现代医学技术发展过程中的一种重要的生物医学工程技术&#xff0c;具有广泛的应用前景和重要性&#xff0c;它在高通量分析、个性化医疗、细胞筛选等方面有着巨大的潜力&#xff0c;Ai…

Sui生态多家协议上线流动质押,兼顾收益与灵活性

在Sui上&#xff0c;流动质押协议允许DeFi用户质押SUI&#xff0c;并获得可交易或用于其他DeFi活动的流动质押标记token。这一过程绕过了传统质押中验证节点锁定token的问题。用户可以通过Sui的权益证明机制&#xff08;PoS&#xff09;确保网络的安全&#xff0c;同时参与生态…

k8s无法删除pv,pvc问题

问题&#xff1a; 在k8s里面创建了pv&#xff0c;pvc删除时报错&#xff1a;error: resource(s) were provided, but no name was specified 解决&#xff1a; 正确的删除顺序&#xff1a;1.先删除pod2.再删除pv 3.在删除pvc 删除pv&#xff0c;pvc命令&#xff1a; kubect…

【图像分类】【深度学习】【Pytorch版本】Inception-ResNet模型算法详解

【图像分类】【深度学习】【Pytorch版本】Inception-ResNet模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】Inception-ResNet模型算法详解前言Inception-ResNet讲解Inception-ResNet-V1Inception-ResNet-V2残差模块的缩放(Scaling of the Residuals)Inception-…

图解算法数据结构-LeetBook-栈和队列04_望远镜中最高的海拔_滑动窗口

科技馆内有一台虚拟观景望远镜&#xff0c;它可以用来观测特定纬度地区的地形情况。该纬度的海拔数据记于数组 heights &#xff0c;其中 heights[i] 表示对应位置的海拔高度。请找出并返回望远镜视野范围 limit 内&#xff0c;可以观测到的最高海拔值。 示例 1&#xff1a; 输…

为什么需要MuleSoft?如何与Salesforce协同工作?

MuleSoft通过一个集成平台将应用程序及其数据(跨云和内部云)连接起来。这被称为iPaaS&#xff0c;可将云应用程序相互集成&#xff0c;以及与本地和传统应用程序集成。 MuleSoft非常适合希望过渡到云的组织&#xff0c;提供了一种强大的集成解决方案。随着组织越来越依赖云及其…

CV计算机视觉每日开源代码Paper with code速览-2023.11.17

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【点云分割】&#xff08;CVPR2023&#xff09;Center Focusing Network for Real-Time LiDAR Panoptic Segmentation 论文地址&#xff1a;…

第2关:图的深度遍历

任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;以邻接表存储图&#xff0c;要求编写程序实现图的深度优先遍历。 相关知识 图的深度优先遍历类似于树的先序遍历, 是树的先序遍历的推广&#xff0c;其基本思想如下&#xff1a; 访…