当前位置: 首页 > news >正文

leetcode LCR 170.交易逆序对的总数

一、问题描述

二、解题思路

整体思路

可以借鉴归并排序(递归)的求解过程。假设数组如图所示,总过程为:

(1)首先找到中间位置mid;

(2)在[left,mid]区间内统计逆序对的数量+排序;

(3)再在[mid+1,right]区间内统计逆序对的数量+排序;

(4)最后再一左一右统计逆序对的数量+排序;

(5)将三个数量累加,即为所求。

具体思路

(1)首先,考虑递归出口,如果left>=right,即区间内只有1个数或者没有数,此时逆序对的数量为0,return0;

(2)寻找中间位置,执行左区间寻找+排序、右区间寻找+排序,代码如下:

//1.寻找中间位置

int mid=left+(right-left)/2;

//2.左区间寻找+排序、右区间寻找+排序

ret+=mergeSort(nums,left,mid);

ret+=mergeSort(nums,mid+1,right);

(3)由于递归需要保证子问题一样,所以我们在一左一右统计逆序对的数量后,也进行排序处理。我们处理的总策略是寻找左边更大的数的个数,处理过程如下,此时的数组如图。当cur1<=mid且cur2<=right时进行归并处理,并进行逆序对数量统计:

<1>当nums[cur1]<=nums[cur2]时,执行tmp[i++]=nums[cur1++];

<2>当nums[cur1]>nums[cur2]时,此时[cur1,mid]区间内的数均比nums[cur2]大,所以ret+=mid-cur1+1,tmp[i++]=nums[cur2++];

(4)循环结束后,将归并排序的过程完成:

 //4.处理没有排序完的数字

        while(cur1<=mid) tmp[i++]=nums[cur1++];

        while(cur2<=right) tmp[i++]=nums[cur2++];

(5)排序完成后用排序完的辅助数组tmp覆盖原本的数组nums:

 //5.还原nums数组

        for(int i=left;i<=right;i++)

            nums[i]=tmp[i-left];

(6)最后返回ret;

三、代码实现

时间复杂度:T(n)=O(nlogn)

空间复杂度:S(n)=O(n)

class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& nums) {//结合归并排序tmp.resize(nums.size());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-left)/2;//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++];}}//4.处理没有排序完的数字while(cur1<=mid) tmp[i++]=nums[cur1++];while(cur2<=right) tmp[i++]=nums[cur2++];//5.还原nums数组for(int i=left;i<=right;i++)nums[i]=tmp[i-left];//6.返回retreturn ret;}
};


文章转载自:

http://IcDmqWEc.trsxw.cn
http://GWQSfVMr.trsxw.cn
http://sNf5BuJX.trsxw.cn
http://cdknBYjw.trsxw.cn
http://7fft44bV.trsxw.cn
http://ypTv5pDU.trsxw.cn
http://uJs42o9h.trsxw.cn
http://FZpH7d9S.trsxw.cn
http://SHxHyWBK.trsxw.cn
http://O7iAAceR.trsxw.cn
http://S3zsOW4t.trsxw.cn
http://pd6QO4gz.trsxw.cn
http://ceYVFxX2.trsxw.cn
http://W7CG1CAY.trsxw.cn
http://4jtP4ra1.trsxw.cn
http://9FB6ReAa.trsxw.cn
http://9jkcjQ7p.trsxw.cn
http://LusTe3va.trsxw.cn
http://lpZsbVvs.trsxw.cn
http://3n486JDF.trsxw.cn
http://CjMJMY4z.trsxw.cn
http://q3AFZKeb.trsxw.cn
http://ZND4Abqf.trsxw.cn
http://MijlD1w2.trsxw.cn
http://wHsRlDUO.trsxw.cn
http://swF25lAi.trsxw.cn
http://pgKzNTgJ.trsxw.cn
http://R3JrggiK.trsxw.cn
http://eOpnYnbY.trsxw.cn
http://cT7AoTlJ.trsxw.cn
http://www.dtcms.com/a/377448.html

相关文章:

  • 【学习笔记】Https证书如何升级到国密
  • 期权行权期限一般多久?
  • 0基础Java学习过程记录——枚举、注解
  • 【C++】C++ 内存管理
  • C++ STL之list的使用
  • Midjourney绘画创作入门操作创作(宣传创意)
  • 【数据库约束】
  • 小白成长之路-centos7部署ceph存储
  • python学习进阶之面向对象(二)
  • 【芯片设计-信号完整性 SI 学习 1.1.1 -- Unit Interval,比特周期】
  • sudo apt update sudo apt upgrade -y 两个命令的作用
  • 每日算法刷题Day68:9.10:leetcode 最短路6道题,用时2h30min
  • apache详细讲解(apache介绍+apache配置实验+apache实现https网站)
  • 一些常用的激活函数及绘图
  • 第3节-使用表格数据-数据库设计
  • 同步时钟系统在体育场游泳馆的应用
  • QT里获取UUID当做唯一文件名称
  • 【Python】pytorch数据操作
  • iOS应用启动深度解析:dyld动态链接器的工作机制与优化实践
  • [硬件电路-175]:multisim中如何给让光电二极管产生光电流?
  • 小巧精准,安全无忧:安科瑞ADL200N-CT/D16-WF防逆流电表守护阳台光伏
  • NLP(自然语言处理, Natural Language Processing)
  • 【竞赛系列】机器学习实操项目07——全球城市计算AI挑战赛(baseline、时间序列分析、地铁流量预测)
  • 华为昇腾CANN开发实战:算子自定义与模型压缩技术指南
  • Java 多线程(二)
  • TCGA(The Cancer Genome Atlas)数据库是癌症基因组学研究的重要资源,包含了多种癌症类型的基因组、转录组、表观基因组和临床数据
  • 单片机与PLC:定义、异同及替代可能性解析
  • 金融知识:投资和融资
  • 重学前端013 --- 响应式网页设计 CSS网格布局
  • hCaptcha 图像识别 API 对接说明