求数组的逆序对
来源:互联网 发布:淘宝代刷平台 编辑:程序博客网 时间:2024/05/20 05:08
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。
概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 构成一个逆序对。
分析:
方法1:暴力循环,时间复杂度为O(n2)
方法2:利用堆排序的思想,首先将数组拆分到底,然后在合并的过程中排序,同时计算逆序对的数量
以下是java代码的实现
package leetcode;public class Pairs {public static void main(String[] args) {// TODO Auto-generated method stubint[] A={3,2,5,6,9,4};int result=split(A,0,A.length-1);System.out.println(result);}public static int split(int[] A,int left,int right){int result=0;if(left>=right) return result;int mid=(left+right)/2;result+=split(A,left,mid);result+=split(A,mid+1,right);result+=merge(A,left,right,mid);return result;}public static int merge(int[] A,int left,int right,int mid){int result=0;int[] temp=new int[right-left+1];int i=mid,j=right,k=0;//计算逆序对的数量,同时排序while(i>=left && j>mid){if(A[i]>A[j]){result+=(j-mid);temp[k++]=A[i--];}else{temp[k++]=A[j--];}}while(i>=left){temp[k++]=A[i--];}while(j>mid){temp[k++]=A[j--];}//将数组排好序,供下次下次循环使用for(int m=left;m<=right;m++){A[m]=temp[--k];}return result;}}
0 0
- 求数组的逆序对
- 求数组中逆序对的个数
- 求数组的逆序对个数
- 求数组中逆序对的个数
- 算法题/求数组的逆序对
- 求数组中的逆序对
- 求数组中的逆序对
- 树状数组求逆序对
- 求数组逆序对个数
- 树状数组求逆序对
- 求数组中的逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- 树状数组求逆序对
- 求数组中的逆序对
- 《APUE》读书笔记-第十四章高级I/O
- 源码简读之AsyncTask
- ASP.NET MVC框架入门
- (转)android AsyncTask介绍
- 信息系统项目管理知识--软件工程
- 求数组的逆序对
- GDOI第四轮模拟day2总结
- Mac操作
- DSP实验三(外部扩展)
- 数值的整数次方
- 1212: 该死的密码 [字符串]
- 代码混淆之后定位线上bug
- gradle的简单使用
- Android Canvas 实现指南针(Compass)