本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目 

  在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

思路

  如果遍历数组,对每个数字都和后面的数字比较大小,时间复杂度为O(n^2),效率太低。

  利用归并排序的思想,先将数组分解成为n个长度为1的子数组,然后进行两两合并同时排好顺序。

  在对两个子区域合并排序时,记左边区域(下标为start~mid)的指针为i,右边区域(下标为mid+1~end)的指针为j,两个指针都指向该区域内最大的数字,排序时:

  (1)如果i指向的数字大于j指向的数字,说明:逆序对有j-mid个,我们把i指向的数字放入临时创建的排序数组中,然后令i-1,指向该区域前一个数字,继续进行排序;

  (2)如果i指向的数字小于等于j指向的数字,说明暂时不存在逆序对,将j指向的数字放入临时创建的排序数组中,然后令j-1,指向该区域前一个数字,继续进行排序;

  (3)某一子区域数字都放入排序数组后,将另一个子区域剩下的数字放入排序数组中,完成排序;

  (4)最后将排序好的数字按顺序赋值给原始数组的两个子区域,以便合并后的区域与别的区域合并。

测试算例 

  1.功能测试(普通数组,递增数组,递减数组,含重复数字)

  2.边界值测试(数组只有两个数字,只有一个数字

  2.特殊测试(null)

Java代码、

//题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组
//成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 public class InversePairs {
public static int inversePairs(int [] array) {
if(array==null || array.length<=0)
return 0;
int count=getCount(array,0,array.length-1);
return count;
} private static int getCount(int[] array,int start,int end){
if(start>=end)
return 0;
int mid=(end+start)>>1;
int left=getCount(array,start,mid);
int right=getCount(array,mid+1,end); //合并
int count=0;
int i=mid; //左边区域的指针
int j=end; //右边区域的指针
int[] temp= new int[end-start+1]; //临时区域
int k=end-start; //临时区域的指针
while(i>=start && j>=mid+1){
if(array[i]>array[j]){
count+=(j-mid);
temp[k--]=array[i--];
}else{
temp[k--]=array[j--];
}
}
while(i>=start)
temp[k--]=array[i--];
while(j>=mid+1)
temp[k--]=array[j--];
for(k=0;k<temp.length;k++)
array[k+start]=temp[k]; return count+left+right;
}
}

  

收获

  1.要对归并排序的实现非常熟练。

  

更多:《剑指Offer》Java实现合集  

  

【Java】 剑指offer(51)数组中的逆序对的更多相关文章

  1. 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组

    剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...

  2. 微软面试题:剑指 Offer 51. 数组中的逆序对 Hard 出现次数:3

    题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. 输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...

  3. 【剑指offer】数组中的逆序对

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/27520535 转载请注明出处:http:// ...

  4. Go语言实现:【剑指offer】数组中的逆序对

    该题目来源于牛客网<剑指offer>专题. 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对10000 ...

  5. 【剑指offer】数组中的逆序对。C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 题目 # 思路 基于归并排序的思想统计逆序对:先把数组分割成子数组,再子数组合并的过程中统计逆序对的数目.统计逆序对 ...

  6. 剑指Offer 35. 数组中的逆序对 (数组)

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  7. [剑指Offer] 35.数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  8. 剑指offer:数组中的逆序对

    题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...

  9. 剑指offer——54数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

随机推荐

  1. Linux - 服务基础

    /etc/init.d/sendmail start # 启动服务 /etc/init.d/sendmail stop # 关闭服务 /etc/init.d/sendmail status # 查看服 ...

  2. JavaScript之Dom1|DOM2|DOM3之DOM1【节点层次】

    长文慎读. 导航: 1.节点层次 2.Node类型 3.Document类型 4.Element类型 5.Text类型 6.Comment类型 7.CDATASection类型 8.DocumentT ...

  3. cetus系列~ 读写分离具体分析

    一 简介:上一章我们讲了cetus的基本安装,这章继续分析cetus 二 分析 1 基本配置       1 开启主从延迟检测需在后端数据库创建库proxy_heart_beat和表tb_heartb ...

  4. Android如何降低service被杀死概率

    http://www.jianshu.com/p/06a1a434e057 http://www.cnblogs.com/ylligang/articles/2665181.html Android应 ...

  5. geeksforgeeks-Array-Rotation and deletion

      As usual Babul is again back with his problem and now with numbers. He thought of an array of numb ...

  6. IOS中的用户安全

    用户安全: 原则:在网络传输过程中,关于用户的密码是不能传递明文的,需要通过加密之后进行传递, 一般采用的加密技术是: (1)md5+盐 (2)hmac+md5 (3)hmac+md5+时间戳   这 ...

  7. DFP算法(转载)

    转载链接:http://blog.csdn.net/itplus/article/details/21896981 注意:式(2.25)中,蓝色变量之所以是实数可以根据它们的矩阵系数相乘为1*1得到.

  8. Word 2017 快捷键

    Ctrl + D: 呼出[字体] Ctrl + S: 进行[保存] Ctrl + F: 呼出[导航] Ctrl + D: 呼出[字体] Ctrl + B: 进行[加粗] Ctrl + G: 呼出[查找 ...

  9. java 基础(转自索宁)

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  10. (常用)time,datetime,random,shutil(zipfile,tarfile),sys模块

    a.time模块import time 时间分为三种形式1.时间戳 (时间秒数的表达形式, 从1970年开始)print(time.time())start_time=time.time()time. ...