剑指offer:(36)时间效率和空间效率的平衡 :数组中的逆序对
来源:互联网 发布:u盘安装linux卡在scsi 编辑:程序博客网 时间:2024/05/21 17:14
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
package cn.com.jianzhioffer;public class Solution36 {//public static int InversePairs(int[] array) {//int length = array.length;//return mergeSort(array, 0, length - 1);//}////private static int mergeSort(int[] data, int start, int end) {//// 递归终止条件//if (start >= end) {//return 0;//}////// 递归//int mid = (start + end) / 2;//int leftCounts = mergeSort(array, start, mid);//int rightCounts = mergeSort(array, mid + 1, end);////// 归并排序,并计算本次逆序对数//int[] copyArray = array;// 数组副本,用于归并排序//int foreIdx = mid;// 前半部分的指针//int backIdx = end;// 后半部分的指针//int counts = 0;// 记录本次逆序对数//int idxCopy = end;// 辅助数组的下标//while (foreIdx >= start && backIdx >= mid + 1) {//if (array[foreIdx] > array[backIdx]) {//copyArray[idxCopy--] = array[foreIdx--];//counts += backIdx - mid;//} else {//copyArray[idxCopy--] = array[backIdx--];//}//}////while (foreIdx >= start) {//copyArray[idxCopy--] = array[foreIdx--];//}//while (backIdx >= mid + 1) {//copyArray[idxCopy--] = array[backIdx--];//}////for (int i = start; i <= end; i++) {//array[i] = copyArray[i];//}////return (leftCounts + rightCounts + counts);//}/*归并排序的改进,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数组array[i]~array[mid]都是大于array[j]的,count += mid+1 - i参考剑指Offer,但是感觉剑指Offer归并过程少了一步拷贝过程。还有就是测试用例输出结果比较大,对每次返回的count mod(1000000007)求余*/ public static int InversePairs(int [] array) { if(array==null||array.length==0) { return 0; } int[] copy = new int[array.length]; for(int i=0;i<array.length;i++) { copy[i] = array[i]; } int count = InversePairsCore(array,copy,0,array.length-1);//数值过大求余 return count; } private static int InversePairsCore(int[] array,int[] copy,int low,int high) { if(low==high) { return 0; } int mid = (low+high)>>1; int leftCount = InversePairsCore(array,copy,low,mid)%1000000007; int rightCount = InversePairsCore(array,copy,mid+1,high)%1000000007; int count = 0; int i=mid; int j=high; int locCopy = high; while(i>=low&&j>mid) { if(array[i]>array[j]) { count += j-mid; copy[locCopy--] = array[i--]; if(count>=1000000007)//数值过大求余 { count%=1000000007; } } else { copy[locCopy--] = array[j--]; } } for(;i>=low;i--) { copy[locCopy--]=array[i]; } for(;j>mid;j--) { copy[locCopy--]=array[j]; } for(int s=low;s<=high;s++) { array[s] = copy[s]; } return (leftCount+rightCount+count)%1000000007; }public static void main(String[] args) {int[] array = {1,2,3,4,5,0};System.out.println(InversePairs(array));}}
阅读全文
0 0
- 剑指offer:(36)时间效率和空间效率的平衡 :数组中的逆序对
- 剑指offer-5-面试36:数组中的逆序对(时间效率和空间效率的平衡)
- 剑指offer 36题 【时间空间效率的平衡】数组中的逆序对
- 《剑指offer》刷题笔记(时间空间效率的平衡):数组中的逆序对
- 【剑指offer】5.3时间效率与空间效率的平衡——面试题36:数组中的逆序对
- 时间效率与空间效率的平衡-面试题36-数组中的逆序对
- 剑指offer:(34)时间效率和空间效率的平衡 :丑数
- 剑指offer 算法 (时间空间效率的平衡)
- 剑指offer:(35)时间效率和空间效率的平衡 :第一个只出现一次的字符
- 剑指offer:(37)时间效率和空间效率的平衡 :两个链表的第一个公共结点
- 剑指offer 33题 【时间空间效率的平衡】把数组排成最小的数
- 《剑指offer》刷题笔记(时间空间效率的平衡):丑数
- 时间效率与空间效率的平衡
- 剑指offer 5.3 时间与空间效率平衡 -丑数
- 剑指offer 35题 【时间空间效率的平衡】第一个只出现一次的字符
- 【剑指offer】5.3时间效率与空间效率的平衡——面试题34:丑数
- 剑指offer 34题 【时间空间效率的平衡】丑数
- 《剑指offer》刷题笔记(时间空间效率的平衡):第一个只出现一次的字符
- 在SpringCloud中使用Feign中出现util.concurrent.RejectedExecutionException和util.concurrent.TimeoutException
- bzoj 1191: [HNOI2006]超级英雄Hero
- 类和接口
- V$WAITSTAT视图
- SnowNLP
- 剑指offer:(36)时间效率和空间效率的平衡 :数组中的逆序对
- Java 垃圾收集器 ---(摘抄,算是笔记)
- 安装 和使用 armadillo
- 【Protocol Buffer】Protobuf的序列化和反序列化
- Centos 6.9 Install nodejs 6
- 文章标题
- java学习之路(5)-运算符
- Android学习之仿QQ讨论组和微信群聊头像
- Codeforces Round #423Div. 2 A-E题解