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

offer题目51:数组中的逆序对

题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)、(5,4)。

分析:可以用类似归并排序的思想,将数组二分,直到数组中只有一个元素时,此时数组逆序数组个数为0,然后开始合并数组,分别统计两个合并数组中逆序对的个数,这样自底向上地完成数组的排序及逆序对的统计,实际上是和归并排序是相同的方法。

 

具体地对于计算统计两个子数组的逆序对的个数,我们用两个指针分别指向两个子数组的末尾,并每次比较两个指针指向的数字,如果第一个子数组中的数字大于第二个子数组中的数字,则构成逆序对,并且逆序对的数目等于第二个子数组中剩余数字的个数。如果第一个数组中的数字小于或等于第二个数组中的数字,则不构成逆序对。每次比较,我们都把较大的数字从后往前复制到一个辅助数组,确保辅助数组中的数字是递增排列。

int InversePairs(int* data,int length){if(data == nullptr || length  < 0){return 0;}int* copy = new int[length];for(int i = 0;i < length;++i){      //用一个辅助数组存放排序后的数组元素copy[i] = data[i];              //****归并排序需要将辅助数组元素merge回原数组完成排序*****//}int count = InversePairsCore(data,copy,0,length - 1);//如果要保存排序后的数组可将data和copy参数交换位置:即InversePairCore(copy,data,0,length - 1);delete[] copy;return count;
}int InversePairsCore(int* data,int* copy,int start,int end){if(start == end){            //数组中只有一个元素,返回0//  copy[start] = data[start];     return 0;}int length = (end - start) / 2;int left = InversePairsCore(copy,data,start,start + length);  //copy数组中存放已排序的子数组,接下来会对copy数组作合并和排序操作,//操作的结果放在data数组中,作为下一次合并排序的copy数组(即两个数组,是互相备份的关系),            //***此操作也修改了原输入数组中的元素值***int right = InversePairsCore(copy,data,start + length + 1,end);//i初始化为前半段最后一个元素的一下标int i = start + length;//j初始化为后半段最后一个元素的一下标int j = end;int indexCopy = end;      //辅助数组的下标元素从数组结尾开始int count = 0;while(i >= start && j >= start + length + 1){if(data[i] > data[j]){copy[indexCopy--] = data[i--];count += j - start - length;}else{copy[indexCopy--] = data[j--];}}for(;i >= start;--i){copy[indexCopy--] = data[i];}for(;j >= start + length + 1;--j){copy[indexCopy--] = data[j];}return left + right + count;
}

 

http://www.lryc.cn/news/405305.html

相关文章:

  • 45、PHP 实现滑动窗口的最大值
  • 【计算机视觉】siamfc论文复现实现目标追踪
  • 数学建模学习(111):改进遗传算法(引入模拟退火、轮盘赌和网格搜索)求解JSP问题
  • Golang | Leetcode Golang题解之第241题为运算表达式设计优先级
  • Unity客户端接入原生Google支付
  • Spring Cloud之五大组件
  • 在 CentOS 7 上安装 Docker 并安装和部署 .NET Core 3.1
  • redis的学习(一):下载安装启动连接
  • 前端设计模式面试题汇总
  • linux(CentOS、Ubuntu)安装python3.12.2环境
  • CSS 中border-radius 属性
  • 【大数据专题】数据仓库
  • go关于string与[]byte再学深一点
  • Qt 实战(7)元对象系统 | 7.4、属性系统:深度解析与应用
  • Docker核心技术:容器技术要解决哪些问题
  • sklearn中的增量学习:特征提取的艺术
  • PostgreSQL 中如何处理数据的唯一性约束?
  • VAE论文阅读
  • 【数据分享】2013-2022年我国省市县三级的逐月SO2数据(excel\shp格式\免费获取)
  • 【Jmeter】记录一次Jmeter实战测试
  • volatile,最轻量的同步机制
  • 在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法
  • Mamba-yolo|结合Mamba注意力机制的视觉检测
  • 语音识别标记语言(SSML):自动标识中文多音字
  • 排序算法与复杂度介绍
  • Kafka介绍及Go操作kafka详解
  • DAY05 CSS
  • HTTPS 的加密过程 详解
  • spring整合mybatis,junit纯注解开发(包括连接druid报错的所有解决方法)
  • ClusterIP、NodePort、LoadBalancer 和 ExternalName