32
32
``` python
33
33
class Solution :
34
34
def reversePairs (self , nums : List[int ]) -> int :
35
- self .res = 0
36
-
37
- def merge (part1 , part2 , nums ):
38
- len1, len2 = len (part1) - 1 , len (part2) - 1
39
- t = len (nums) - 1
40
- while len1 >= 0 and len2 >= 0 :
41
- if part1[len1] > part2[len2]:
42
- self .res += (len2 + 1 )
43
- nums[t] = part1[len1]
44
- len1 -= 1
35
+ def merge_sort (nums , left , right ):
36
+ if left >= right:
37
+ return 0
38
+ mid = (left + right) >> 1
39
+ res = merge_sort(nums, left, mid) + merge_sort(nums, mid + 1 , right)
40
+ i, j, k = left, mid + 1 , 0
41
+ tmp = []
42
+ while i <= mid and j <= right:
43
+ if nums[i] <= nums[j]:
44
+ tmp.append(nums[i])
45
+ i += 1
45
46
else :
46
- nums[t] = part2[len2]
47
- len2 -= 1
48
- t -= 1
49
- while len1 >= 0 :
50
- nums[t] = part1[len1]
51
- t -= 1
52
- len1 -= 1
53
- while len2 >= 0 :
54
- nums[t] = part2[len2]
55
- t -= 1
56
- len2 -= 1
57
-
58
- def merge_sort (nums ):
59
- if len (nums) < 2 :
60
- return
61
- mid = len (nums) // 2
62
- s1, s2 = nums[:mid], nums[mid:]
63
- merge_sort(s1)
64
- merge_sort(s2)
65
- merge(s1, s2, nums)
66
-
67
- merge_sort(nums)
68
- return self .res
69
-
47
+ tmp.append(nums[j])
48
+ j += 1
49
+ res += (mid - i + 1 )
50
+ while i <= mid:
51
+ tmp.append(nums[i])
52
+ i += 1
53
+ while j <= right:
54
+ tmp.append(nums[j])
55
+ j += 1
56
+ for i in range (left, right + 1 ):
57
+ nums[i] = tmp[k]
58
+ k += 1
59
+ return res
60
+
61
+ return merge_sort(nums, 0 , len (nums) - 1 )
70
62
```
71
63
72
64
### ** Java**
@@ -75,47 +67,37 @@ class Solution:
75
67
76
68
``` java
77
69
class Solution {
78
- private int res = 0 ;
70
+ private static int [] tmp = new int [50000 ];
71
+
79
72
public int reversePairs (int [] nums ) {
80
- int n = nums. length;
81
- if (n < 2 ) {
82
- return 0 ;
83
- }
84
- mergeSort(nums, 0 , n - 1 );
85
- return res;
73
+ return mergeSort(nums, 0 , nums. length - 1 );
86
74
}
87
75
88
- private void mergeSort (int [] nums , int s , int e ) {
89
- if (s == e ) {
90
- return ;
76
+ private int mergeSort (int [] nums , int left , int right ) {
77
+ if (left >= right ) {
78
+ return 0 ;
91
79
}
92
- int mid = (s + e) >>> 1 ;
93
- mergeSort(nums, s, mid);
94
- mergeSort(nums, mid + 1 , e);
95
- merge(nums, s, mid, e);
96
- }
97
-
98
- private void merge (int [] nums , int s , int mid , int e ) {
99
- int n = e - s + 1 ;
100
- int [] help = new int [n];
101
- int i = s, j = mid + 1 , idx = 0 ;
102
- while (i <= mid && j <= e) {
103
- if (nums[i] > nums[j]) {
104
- res += (mid - i + 1 );
105
- help[idx++ ] = nums[j++ ];
80
+ int mid = (left + right) >>> 1 ;
81
+ int res = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1 , right);
82
+ int i = left, j = mid + 1 , k = 0 ;
83
+ while (i <= mid && j <= right) {
84
+ if (nums[i] <= nums[j]) {
85
+ tmp[k++ ] = nums[i++ ];
106
86
} else {
107
- help[idx++ ] = nums[i++ ];
87
+ tmp[k++ ] = nums[j++ ];
88
+ res += (mid - i + 1 );
108
89
}
109
90
}
110
91
while (i <= mid) {
111
- help[idx ++ ] = nums[i++ ];
92
+ tmp[k ++ ] = nums[i++ ];
112
93
}
113
- while (j <= e ) {
114
- help[idx ++ ] = nums[j++ ];
94
+ while (j <= right ) {
95
+ tmp[k ++ ] = nums[j++ ];
115
96
}
116
- for (int t = 0 ; t < n ; ++ t ) {
117
- nums[s + t ] = help[t ];
97
+ for (i = left, j = 0 ; i <= right ; ++ i ) {
98
+ nums[i ] = tmp[j ++ ];
118
99
}
100
+ return res;
119
101
}
120
102
}
121
103
```
@@ -127,33 +109,37 @@ class Solution {
127
109
* @param {number[]} nums
128
110
* @return {number}
129
111
*/
130
- var reversePairs = function (nums ) {
131
- if (! nums || nums .length < 2 ) return 0 ;
132
- let res = 0 ;
133
- function mergeSort (arr ) {
134
- if (arr .length === 1 ) {
135
- return arr;
136
- }
137
- let mid = ~~ (arr .length / 2 );
138
- return merge (mergeSort (arr .slice (0 , mid)), mergeSort (arr .slice (mid)));
139
- }
140
- function merge (a , b ) {
141
- let r = [];
142
- let cnt = 0 ;
143
- while (a && b && a .length && b .length ) {
144
- if (a[0 ] <= b[0 ]) {
145
- res += cnt;
146
- r .push (a .shift ());
147
- } else {
148
- r .push (b .shift ());
149
- cnt++ ;
150
- }
112
+ var reversePairs = function (nums ) {
113
+ const mergeSort = (nums , left , right ) => {
114
+ if (left >= right) {
115
+ return 0 ;
116
+ }
117
+ const mid = (left + right) >> 1 ;
118
+ let res = mergeSort (nums, left, mid) + mergeSort (nums, mid + 1 , right);
119
+ let i = left;
120
+ let j = mid + 1 ;
121
+ let tmp = [];
122
+ while (i <= mid && j <= right) {
123
+ if (nums[i] <= nums[j]) {
124
+ tmp .push (nums[i++ ]);
125
+ } else {
126
+ tmp .push (nums[j++ ]);
127
+ res += (mid - i + 1 );
128
+ }
129
+ }
130
+ while (i <= mid) {
131
+ tmp .push (nums[i++ ]);
132
+ }
133
+ while (j <= right) {
134
+ tmp .push (nums[j++ ]);
135
+ }
136
+ for (i = left, j = 0 ; i <= right; ++ i, ++ j) {
137
+ nums[i] = tmp[j];
138
+ }
139
+ return res;
151
140
}
152
- res += a .length * cnt;
153
- return r .concat (a, b);
154
- }
155
- mergeSort (nums);
156
- return res;
141
+
142
+ return mergeSort (nums, 0 , nums .length - 1 );
157
143
};
158
144
```
159
145
0 commit comments