剑指offer_数组中的逆序对
方法一:直接穷举遍历,两层循环
小数据可以,大数据会超时
1 public class Solution { 2 public int InversePairs(int [] array) { 3 int temp=0; 4 for(int i=0;i<array.length-1;i++){ 5 for(int j=i+1;j<array.length;j++){ 6 if(array[i]>array[j]) 7 { 8 temp++; 9 temp=temp%1000000007; 10 } 11 } 12 } 13 return temp; 14 } 15 }
方法二,利用递归排序的思想解决
1 public class Solution { 2 int cnt;//统计逆序对的个数 3 public int InversePairs(int [] array) { 4 if(array.length!=0) 5 divide(array,0,array.length-1); 6 return cnt; 7 } 8 //归并排序的分治:分 9 private void divide(int[] arr,int start,int end){ 10 if(start>=end) return; 11 //计算中间值 12 int mid = start + (end - start)/2; 13 divide(arr,start,mid); 14 divide(arr,mid+1,end); 15 merge(arr,start,mid,end); 16 } 17 18 private void merge(int[] arr,int start,int mid,int end){ 19 int [] temp = new int[end-start+1]; 20 int i=start,j=mid+1,k=0; 21 while(i<=mid&&j<=end){ 22 if(arr[i]<=arr[j]) temp[k++]=arr[i++]; 23 else{ 24 temp[k++]=arr[j++]; 25 cnt = (cnt+mid-i+1)%1000000007; 26 } 27 28 } 29 while(i<=mid) 30 temp[k++] = arr[i++]; 31 while(j<=end) 32 temp[k++] = arr[j++]; 33 //覆盖原数组 34 for (k = 0; k < temp.length; k++) 35 arr[start + k] = temp[k]; 36 } 37 }

浙公网安备 33010602011771号