1+ // 就是个归并排序,不过在归并排序过程中统计了一下逆序对
2+ class Solution {
3+ public int reversePairs (int [] nums ) {
4+ // 利用归并排序,合并时,进行计算
5+ if (nums == null || nums .length == 0 ) return 0 ;
6+ return countReverse (nums , 0 , nums .length - 1 );
7+ }
8+
9+ int countReverse (int [] arr , int lo , int hi ) {
10+ if (lo >= hi ) return 0 ;
11+ int mid = lo + ((hi - lo ) >> 1 );
12+ int left = countReverse (arr , lo , mid );
13+ int right = countReverse (arr , mid +1 , hi );
14+ int res = merge (arr , lo , hi );
15+ return res + left + right ;
16+ }
17+
18+ // merge [lo, mid] [mid+1, hi]
19+ int merge (int [] arr , int lo , int hi ) {
20+ int mid = lo + ((hi - lo ) >> 1 );
21+ int [] tmp = new int [hi -lo +1 ];
22+ int i = lo , j = mid +1 , k = 0 ;
23+ int res = 0 ;
24+ while (i <= mid && j <= hi ) {
25+ if (arr [i ] <= arr [j ]) {
26+ tmp [k ++] = arr [i ++];
27+ }
28+ else {
29+ tmp [k ++] = arr [j ++];
30+ res += mid - i + 1 ;
31+ }
32+ }
33+ while (i <= mid ) tmp [k ++] = arr [i ++];
34+ while (j <= hi ) tmp [k ++] = arr [j ++];
35+ k = 0 ;
36+ while (k < hi - lo + 1 ) {
37+ arr [lo +k ] = tmp [k ];
38+ k ++;
39+ }
40+ return res ;
41+ }
42+ }
43+
44+
45+ // 会超时
46+ class Solution {
47+ public int reversePairs (int [] nums ) {
48+ // 冒泡排序,每次交换,逆序度减一
49+ // 插入排序,每次移动,逆序度减一
50+ int res = 0 ;
51+ int n = nums .length ;
52+ boolean flag ; // 本轮交换是否有数据交换
53+ for (int i = 0 ; i < n ; i ++) {
54+ flag = false ;
55+ for (int j = 0 ; j < n - i - 1 ; j ++) {
56+ if (nums [j ] > nums [j +1 ]) {
57+ swap (nums , j ,j +1 );
58+ flag = true ;
59+ res ++;
60+ }
61+ }
62+ if (!flag ) break ;
63+ }
64+ return res ;
65+ }
66+
67+ void swap (int [] arr , int a , int b ) {
68+ int tmp = arr [a ];
69+ arr [a ] = arr [b ];
70+ arr [b ] = tmp ;
71+ }
72+ }
0 commit comments