[剑指Offer][数组]数组中的逆序对

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。
 
 1 public class Solution {
 2     public int InversePairs(int[] array) {
 3         if(array.length == 0) {
 4             return 0;
 5         }
 6         int result = 0;
 7         for(int i = 0; i < array.length - 1; i ++) {
 8             for(int j = i + 1; j < array.length; j ++) {
 9                 if(array[i] > array[j]) {
10                     result ++;
11                 }
12             }
13         }
14         return result % 1000000007;
15     }
16 }
 1 public class Solution {
 2     public int InversePairs(int[] array) {
 3         return mergeSort(array, 0, array.length - 1);
 4     }
 5 
 6     public int mergeSort(int[] data, int left, int right) {
 7         if(left >= right) {
 8             return 0;
 9         }
10         int inversePairNum = 0;
11         int middle = (left + right) / 2;
12         inversePairNum = (inversePairNum + mergeSort(data, left, middle)) % 1000000007;
13         inversePairNum = (inversePairNum + mergeSort(data, middle + 1, right)) % 1000000007;
14         inversePairNum = (inversePairNum + mergeArray(data, left, middle, right)) % 1000000007;
15         return inversePairNum;
16     }
17 
18     public int mergeArray(int[] data, int left, int middle, int right) {
19         int[] temp = new int[right - left + 1];
20         int pointerOne = left;
21         int pointerTwo = middle + 1;
22         int count = 0;
23         int inversePairNum = 0;
24         for(count = 0; count < temp.length; count ++) {
25             if((pointerOne > middle) || (pointerTwo > right)) {
26                 break;
27             }
28             if(data[pointerOne] <= data[pointerTwo]) {
29                 temp[count] = data[pointerOne ++];
30             }
31             else {
32                 temp[count] = data[pointerTwo ++];
33                 inversePairNum = (inversePairNum + (middle - pointerOne + 1)) % 1000000007;
34             }
35         }
36         while(pointerOne <= middle) {
37             temp[count ++] = data[pointerOne ++];
38         }
39         while(pointerTwo <= right) {
40             temp[count ++] = data[pointerTwo ++];
41         }
42         for(int i = 0; i < count; i ++) {
43             data[left + i] = temp[i];
44         }
45         return inversePairNum;
46     }
47 }

 

posted @ 2021-05-12 11:47  StringBuilder  阅读(48)  评论(0)    收藏  举报