数组中的逆序对
2016-05-13 14:46
78 查看
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
思路一:
暴力破解,通过两次for循环来判断。
思路二:
使用归并排序的思想:先把数组分割成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目,在统计逆序对的过程中,还需要对数组进行排序。
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
思路一:
暴力破解,通过两次for循环来判断。
public int InversePairs(int [] array) { if(array.length<2) return 0; int nums = 0; for(int i=0;i<array.length;i++){ for(int j=i+1;j<array.length;j++){ if(array[i] > array[j]) nums++; } } return nums; }
思路二:
使用归并排序的思想:先把数组分割成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目,在统计逆序对的过程中,还需要对数组进行排序。
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,j=mid+1,t=0; while(i<=mid||j<=r){ if(i>mid&&j<=r){ temp[t++]=array[j]; j++; continue; }else if(i<=mid&&j>r){ temp[t++]=array[i]; i++; continue; } if(array[i]>array[j]){ temp[t++]=array[j]; count+=mid-i+1; j++; }else { temp[t++]=array[i]; i++; } } for(i=l;i<=r;i++){ array[i]=temp[i-l]; } return count; }
相关文章推荐
- gcc/g++/ldd等常用命令基本参数(整理)
- 常用Meta整理
- nodejs连接mongodb的方法
- RabbitMQ Server的安装、配置及常用命令
- hdu 4496(并查集的边删除)
- 线性代数中向量、矩阵深度理解(PartI)
- 关于oracle实例即localhost:1521/orcl中的orcl
- 论Android网络请求库——android-async-http
- 数据库应用软件
- Android通知代码
- HDU 2089 不要62 数位dp
- webService 客户端接口调用【java】
- Android Studio使用gradle打包指定包名和类的jar
- mysql Sort aborted: Out of sort memory, consider increasing server sort buffer size的解决方法
- 使用WebRTC搭建前端视频聊天室——入门篇
- vs2010使用boost库,安装
- 《构建之法》阅读笔记--2
- 项目管理工具---maven
- Android ListView与EditText共存错位
- string类的常用的几个小东西find,substr