forked from DreamCats/java-notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathT35.java
More file actions
58 lines (49 loc) · 1.57 KB
/
T35.java
File metadata and controls
58 lines (49 loc) · 1.57 KB
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
57
58
package web; /**
* @program LeetNiu
* @description: 数组中的逆序对
* @author: mf
* @create: 2020/01/15 09:45
*/
/**
* 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
* 输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
*/
public class T35 {
private Integer count = 0;
public int InversePairs(int [] array) {
if (array == null || array.length == 0) return 0;
mergeSort(array, 0, array.length - 1);
return (count % 1000000007);
}
private void mergeSort(int[] array, int left, int right) {
if (left < right) {
int mid = (left + right) >> 1;
mergeSort(array, left ,mid);
mergeSort(array, mid + 1, right);
merge(array, left, mid, right);
}
}
private void merge(int[] array, int left, int mid, int right) {
int[] help = new int[right - left + 1];
int i = 0;
int p1 = left;
int p2 = mid + 1;
while(p1 <= mid && p2 <= right) {
if(array[p1] > array[p2]) {
help[i++] = array[p2++];
count += mid - p1 + 1;
} else {
help[i++] = array[p1++];
}
}
while(p1 <= mid) {
help[i++] = array[p1++];
}
while(p2 <= right) {
help[i++] = array[p2++];
}
for(int j = 0; j < help.length; j++) {
array[left + j] = help[j];
}
}
}