剑指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 }

 

posted @ 2019-09-09 11:17  chyblogs  阅读(99)  评论(0)    收藏  举报