博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer第36题—Java版
阅读量:6995 次
发布时间:2019-06-27

本文共 1272 字,大约阅读时间需要 4 分钟。

本题使用归并排序的思想,结合归并排序,写出的算法解。

 

//数组中的逆序对public static int InversePairs(int[] array){    if(array==null||array.length<=1)        return 0;    int[] copy = new int[array.length];    //复制原数组    copy = Arrays.copyOf(array, array.length);    return mergeCount(array, copy, 0, array.length-1);}public static int mergeCount(int[] array, int[] copy, int start, int end){    if(start==end){        copy[start] = array[start];        return 0;    }    int mid = (start+end)>>1;    int leftCount = mergeCount(copy, array, start, mid);    int rightCount = mergeCount(copy, array, mid+1, end);        //计算两个已经求解好的数组的逆序对    int i = mid;//i初始化为前半段最后一个数字的下标    int j = end;//j初始化为后半段最后一个数字的下标    //作为复制到临时数组的下标    int index = end;//辅助数组复制的数组的最后一个数字的下标    //计算两个数组在合并过程中的逆序对数    int count = 0;//计数--逆序对的数目    while(i>=start&&j>=mid+1){        if(array[i]>array[j]){        	//copy数组存放排序好的数,            copy[index--] = array[i--];            count += j-mid;        }else{            copy[index--] = array[j--];        }    }    //把左边剩下的放到copy数组    for(;i>=start;i--){        copy[index--] = array[i];    }    //把右边剩下的放到copy数组    for(;j>=mid+1;j--){        copy[index--] = array[j];    }    //返回的是某一边的数    return leftCount+rightCount+count;}

 

转载于:https://www.cnblogs.com/loren-Yang/p/7466140.html

你可能感兴趣的文章
Codeforces 832D - Misha, Grisha and Underground
查看>>
Project Euler 66: Diophantine equation
查看>>
Zookeeper
查看>>
C#网络编程概述 二
查看>>
修改Eclipse的EasyExplore插件的键盘快捷键
查看>>
关于rpm包的安装卸载等
查看>>
nginx 匹配顺序
查看>>
关于项目开发中涉及到输入表情的解决方案
查看>>
SQL Server表的创建及索引的控制
查看>>
Java
查看>>
MYSQL 主从复制(NIOT)
查看>>
Spring 4.0 中的 WebSocket 架构
查看>>
usaco1.4.3等差数列
查看>>
对于DQN的三大改进 - 这篇讲的好些
查看>>
Nutch中纠结我的classpath(转)
查看>>
setitimer()
查看>>
HTML5文件API
查看>>
Spring中 aop的 xml配置(简单示例)
查看>>
php面试专题---1、php中变量存储及引用的原理
查看>>
php class类的用法详细总结
查看>>