[剑指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 ...
随机推荐
- python 阿狸的进阶之路(7)
面向对象 转自林海峰的博客 http://www.cnblogs.com/linhaifeng/articles/6182264.html 面向对象的理解: 将数据分类,比如学生类.数据有关的函数, ...
- Nginx代理webSocket经常中断的解决方案, 如何保持长连接
背景 这天气够热的,要处理的事情也够多的.... 1 2 想看解决的,直接 ctrl+f搜索关键字‘配置点’ 开始前交代(想看原因的看这个,个人观点,不代表正确) 解说:今天用nginx反代通讯项目, ...
- Delphi 泛型详解
http://www.cnblogs.com/jxgxy/category/216671.html
- Erlang 笔记
集成开发环境:IntelliJ IDEA的Erlang插件 教程:www.erlang-cn.com/462.html,寻找erlang程序设计第2版pdf f():释放之前绑定过的所有变量. -ex ...
- 好玩的Raft动画演示,原理秒懂
关于Raft原理,许多朋友也许不是很明白原理,下面的地址是一个好玩的Raft动画,看完后能够很快的掌握Raft原理: http://thesecretlivesofdata.com/raft/ 动画中 ...
- PHP 操作Mongodb 实例
缩略版本<?php //1.连接MongoDB $mongo = new Mongo(); $mongo = new Mongo("mongodb://username:passwor ...
- 记录Git的安装过程
从https://git-scm.com/download/win,选择Windos版本下载. 选择打开的工具,用的Notepad. 下一步 下一步
- ANg-线性回归算法
线性回归算法 linear regression 对于线性回归模型,我们期望对于样本数据集,通过假设函数,得出目标值 代价函数 m在这里指的是训练样本的数量 所以我们的目的就是得出代价函数(平方误差代 ...
- RabbitMQ、Memcached、SQLAlchemy
一.RabbitMQ 1.基础概念 rabbitMQ说白了就是一个消息队列,类似于Queue,也是生产者与消费者模型.只不过做了扩展,所不同的是Queue在内存中的消息队列,而RabbitMQ是部署在 ...
- javascript:getElementsByName td name
问题: 今天写动态生成HTML表格的时候需要用到统计td内的数据,在生成的时候设置了td的name属性,但是document.getElementsByName("tdname&quo ...