数组中的逆序对
2016-06-23 21:54
204 查看
题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题
方法一:暴力public class Solution { public int InversePairs(int [] array) { if(array == null || array.length <=1) return 0; int count = 0; int len = array.length; for(int i=0;i<len;i++){ for(int j=i+1;j<len;j++){ if(array[i] > array[j]){ count ++; } } } return count; } }
方法二:归并排序
public class Solution { public int InversePairs(int [] array) { if(array.length<=0) return 0; return mergeSort(array,0,array.length-1); } public int mergeSort(int[] array,int l,int r){ if(l>=r){ return 0; } int mid=(l+r)/2; int lnums=mergeSort(array,l,mid); int rnums=mergeSort(array,mid+1,r); return lnums+rnums+merge(array,l,mid,r); } public int merge(int[] array,int l,int mid,int r){ int [] temp = new int[r-l+1]; int count=0; int i=l; int j=mid+1; int t=0; while(i<=mid && j<=r){ if(array[i]>array[j]){ // 说明:i - mid 内的数都大于 array[j] temp[t++]=array[j]; count+=mid-i+1; // 计算逆序对个数 j++; }else { temp[t++]=array[i]; i++; } } // 剩余的数补上去 // i越界了 增加 j while(i>mid&&j<=r){ temp[t++]=array[j]; j++; } // j越界了 增加 i while(i<=mid&&j>r){ temp[t++]=array[i]; i++; } // 利用temp数组更新array数组 for(i=l;i<=r;i++){ array[i]=temp[i-l]; } return count; } }
相关文章推荐
- BZOJ1024: [SCOI2009]生日快乐
- 我的SPARK调试java代码
- 深入探讨 Java 类加载器
- 2. 代理模式-为别人做嫁衣
- 网站如何突破瓶颈
- ubuntu14.04安装opencv2.4.9
- Android IntentService完全解析 当Service遇到Handler
- 个人总结
- 以操作系统的角度述说线程与进程
- Restrictions运算符
- 第二冲刺阶段个人博客
- 链接指示符extern “C”
- Android 基于Message的进程间通信 Messenger完全解析
- Git常用命令总结2
- Git 常用命令整理1
- IO流操作规律
- 如何保护你的linux操作系统
- 微信支付PHP SDK —— 公众号支付代码详解
- 输出100-999之间所有的水仙花数
- 操作系统面试—进程同步