数组中的逆序对
问题陈述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
思路详解
1、很显然,此题可以双循环列举比较,复杂度为O(n^2),有没有更好的解法呢?有的,利用归并排序的思想。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
public class CountReversePairs { int count=0; public int reversePairs(int[] nums){ if(nums==null||nums.length==1) return 0; mergeSort(nums,0,nums.length-1); return count; } public void mergeSort(int[] nums,int start,int end){ if(start==end) return; int mid=start+((end-start)>>1); mergeSort(nums,start,mid); mergeSort(nums,mid+1,end); merge(nums,start,mid,end); } public void merge(int[] nums,int start,int mid,int end){ int[] helper=new int[end-start+1]; int k=0,pos1=start,pos2=mid+1; while (pos1<=mid&&pos2<=end){ if(nums[pos1]<=nums[pos2]){ helper[k++]=nums[pos1++]; }else{ helper[k++]=nums[pos2++]; count+=(mid-pos1+1); } } while (pos1<mid){ helper[k++]=nums[pos1++]; } while (pos2<end){ helper[k++]=nums[pos2++]; } for (int j = 0; j < helper.length; j++) { nums[start + j] = helper[j]; } }
|