[剑指offer]51-数组中的逆序对(归并排序)
题目链接
https://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5
题意
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。题目保证输入的数组中没有的相同的数字。
解题思路
在归并排序的过程中计逆序对。时间复杂度O(nlogn),空间复杂度O(n)。
- 将数组从中间分成前后两个数组(递归到只有一个数据项)。注意数组都是含该数组首尾坐标元素的。
- 然后合并并排序两个数组,排序结果在copy数组。具体地,i、j指针从两个数组后向前遍历,将大的拷贝到copy数组(copy数组从后往前填)。最后剩下的数组的剩下的部分一并拷贝到copy数组
- 在合并过程中计逆序对,若i指向的元素大于j,则count+=j-mid;即mid+1到j的元素都比i指向的元素小。
- 最终返回的count是两个数组内部的逆序对 + 合并过程中的逆序对数(即上一条)。
注意
- 每次递归传参copy和array换位置(滚动数组)。保证(左右子数组返回后)开始时data[l,mid]和data[mid+1,r]内部有序,结束时copy[l,r]内部有序。
- size_t 是>=0 所以当i=0,i--,i会等于一个较大正数而不是-1,仍满足
while(i>=l),使得程序错误。 cnt+=(j-mid)%1000000007应改为cnt=(cnt+(j-mid))%1000000007
代码
class Solution {
public:
int InversePairs(vector<int> data) {
int cnt=0;
if(!data.empty()){
vector<int> copy;
for(auto it=data.begin();it!=data.end();++it){
copy.push_back(*it);
}
cnt=inversePairCnt(data,copy,0,data.size()-1);
}
return cnt;
}
private:
int inversePairCnt(vector<int>& data,vector<int>& copy,int l,int r){
if(l==r){
return 0;
}
int mid=(l+r)>>1;
int leftCnt=inversePairCnt(copy,data,l,mid);
int rightCnt=inversePairCnt(copy,data,mid+1,r);
//开始:此时data[l,mid]和data[mid+1,r]内部有序,copy[l,mid]和copy[mid+1,r]内部无序
int i=mid;
int j=r;
int copyIndex=r;
int cnt=0;
while(i>=l&&j>mid){
if(data[j]>data[i]){
copy[copyIndex--]=data[j--];
}
else{
cnt=(cnt+(j-mid))%1000000007;//
copy[copyIndex--]=data[i--];
}
}
while(i>=l){//
copy[copyIndex--]=data[i--];
}
while(j>mid){
copy[copyIndex--]=data[j--];
}
//结束:此时copy[l,r]内部有序,data[l,r]内部无序
return (leftCnt+rightCnt+cnt)%1000000007;
}
};
[剑指offer]51-数组中的逆序对(归并排序)的更多相关文章
- 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...
- 【Java】 剑指offer(51)数组中的逆序对
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成 ...
- 微软面试题:剑指 Offer 51. 数组中的逆序对 Hard 出现次数:3
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. 输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...
- 【剑指offer】数组中的逆序对
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/27520535 转载请注明出处:http:// ...
- Go语言实现:【剑指offer】数组中的逆序对
该题目来源于牛客网<剑指offer>专题. 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对10000 ...
- 【剑指offer】数组中的逆序对。C++实现
原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 题目 # 思路 基于归并排序的思想统计逆序对:先把数组分割成子数组,再子数组合并的过程中统计逆序对的数目.统计逆序对 ...
- 剑指Offer 35. 数组中的逆序对 (数组)
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- [剑指Offer] 35.数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指offer:数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...
- 剑指offer——54数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
随机推荐
- day40-socket编程
一.socket介绍 看socket之前,先来回顾一下五层通讯流程: 但实际上从传输层开始以及以下,都是操作系统帮咱们完成的 Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象 ...
- UI5-学习篇-14-基于BSP应用部署Fiori Launchpad
1.UI5应用发布前端服务器 UI5-学习篇-10-本地UI5应用部署到SAP前端服务器 2.登录Fiori https://XXXXXX:50000/sap/bc/ui5_ui5/sap/arsrv ...
- UNITY2018 真机开启deepprofiling的操作
手机上运行游戏并开启deepprofiling的命令如下 命令一:adb shell am start -n com.szyh.YHP1.kaopu/com.szyh.YHP1.kaopu.MainA ...
- PostgresQL 中有没有rownum这样的,显示结果集的序号
select * from (select row_number() over() as rownum,tablename from pg_tables) t where rownum<10;
- Django后台邮箱配置
Django可以通过发送邮件的方式找回密码,具体细节可以看Django的文档,这里只介绍在settings.py中如何正确进行邮箱的相关配置. 网上很多教程都说了需要在settings.py里添加如下 ...
- vue项目遇到的坑
一.启动项目问题 1. 如何从git上拉下项目:点我 2. 启动项目失败: 点我 and 点我 二.搭建项目问题 1. 先改分辨率,否则可能影响布局 以我的项目为例,分辨率修改位置如下: 2. .v ...
- 创建DLL动态链接库——模块定义法(def)
DLL模块定义法(Module-Definition File,即DEF):在VS家族IDE中,根据提示新增.def文件,如下: LIBRARY 关键字; mytestDll 库名; DLL_ADD ...
- set 转 enumeration
- 解决:python 连接Oracle 11g 报错:ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
其次,将查询到的service_name替换sid即可:conn=cx_Oracle.connect('hr/admin@localhost:1521/EE.oracle.docker')
- /src/log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...