@@ -14,7 +14,7 @@ description: The problem is to reverse the pairs.
14
14
sidebar_position : 2667
15
15
---
16
16
17
- ## Problem Statement
17
+ ## Problem Statement
18
18
19
19
### Problem Description
20
20
@@ -58,14 +58,12 @@ Explanation: The reverse pairs are:
58
58
59
59
The intuition behind this solution is to use a modified Merge Sort algorithm to count the number of reverse pairs in the array.
60
60
61
-
62
61
### Approaches
63
62
64
63
- Divide the array into smaller subarrays until each subarray has only one element.
65
64
- Merge the subarrays back together, counting the number of reverse pairs between each pair of subarrays.
66
65
- The merge step is done in a way that ensures the count of reverse pairs is accurate.
67
66
68
-
69
67
#### Codes in Different Languages
70
68
71
69
<Tabs >
@@ -83,31 +81,30 @@ The intuition behind this solution is to use a modified Merge Sort algorithm to
83
81
}
84
82
85
83
function merge (nums , left , mid , right ) {
86
- let count = 0 ;
87
- let j = mid + 1 ;
88
- for (let i = left; i <= mid; i++ ) {
89
- while (j <= right && nums[i] > 2 * nums[j]) j++ ;
90
- count += j - mid - 1 ;
91
- }
92
- let temp = new Array (right - left + 1 );
93
- mergeSortedArrays (nums, left, mid, right, temp);
94
- for (let i = left; i <= right; i++ ) nums[i] = temp[i - left];
95
- return count;
84
+ let count = 0 ;
85
+ let j = mid + 1 ;
86
+ for (let i = left; i <= mid; i++ ) {
87
+ while (j <= right && nums[i] > 2 \ * nums[j]) j++ ;
88
+ count += j - mid - 1 ;
89
+ }
90
+ let temp = new Array (right - left + 1 );
91
+ mergeSortedArrays (nums, left, mid, right, temp);
92
+ for (let i = left; i <= right; i++ ) nums[i] = temp[i - left];
93
+ return count;
96
94
}
97
95
function mergeSort (nums , left , right ) {
98
- if (left >= right) return 0 ;
99
- let mid = left + (right - left) / 2 ;
100
- let count = mergeSort (nums, left, mid) + mergeSort (nums, mid + 1 , right);
101
- count += merge (nums, left, mid, right);
102
- return count;
96
+ if (left >= right) return 0 ;
97
+ let mid = left + (right - left) / 2 ;
98
+ let count = mergeSort (nums, left, mid) + mergeSort (nums, mid + 1 , right);
99
+ count += merge (nums, left, mid, right);
100
+ return count;
103
101
}
104
102
105
103
class Solution {
106
- reversePairs (nums ) {
107
- return mergeSort (nums, 0 , nums .length - 1 );
108
- }
104
+ reversePairs (nums ) {
105
+ return mergeSort (nums, 0 , nums .length - 1 );
106
+ }
109
107
}
110
-
111
108
112
109
```
113
110
@@ -126,29 +123,29 @@ class Solution {
126
123
}
127
124
128
125
function merge(nums: number[], left: number, mid: number, right: number) {
129
- let count = 0;
130
- let j = mid + 1;
131
- for (let i = left; i <= mid; i++) {
132
- while (j <= right && nums[i] > 2 * nums[j]) j++;
133
- count += j - mid - 1;
134
- }
135
- let temp = new Array(right - left + 1);
136
- mergeSortedArrays(nums, left, mid, right, temp);
137
- for (let i = left; i <= right; i++) nums[i] = temp[i - left];
138
- return count;
126
+ let count = 0;
127
+ let j = mid + 1;
128
+ for (let i = left; i <= mid; i++) {
129
+ while (j <= right && nums[i] > 2 \ * nums[j]) j++;
130
+ count += j - mid - 1;
131
+ }
132
+ let temp = new Array(right - left + 1);
133
+ mergeSortedArrays(nums, left, mid, right, temp);
134
+ for (let i = left; i <= right; i++) nums[i] = temp[i - left];
135
+ return count;
139
136
}
140
137
function mergeSort(nums: number[], left: number, right: number) {
141
- if (left >= right) return 0;
142
- let mid = left + (right - left) / 2;
143
- let count = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);
144
- count += merge(nums, left, mid, right);
145
- return count;
138
+ if (left >= right) return 0;
139
+ let mid = left + (right - left) / 2;
140
+ let count = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);
141
+ count += merge(nums, left, mid, right);
142
+ return count;
146
143
}
147
144
148
145
class Solution {
149
- reversePairs(nums: number[]) {
150
- return mergeSort(nums, 0, nums.length - 1);
151
- }
146
+ reversePairs(nums: number[]) {
147
+ return mergeSort(nums, 0, nums.length - 1);
148
+ }
152
149
}
153
150
154
151
` ` `
@@ -177,29 +174,29 @@ class Solution {
177
174
k += 1
178
175
179
176
def merge(nums, left, mid, right):
180
- count = 0
181
- j = mid + 1
182
- for i in range(left, mid + 1):
183
- while j <= right and nums[i] > 2 * nums[j]:
184
- j += 1
185
- count += j - mid - 1
186
- temp = [0] * (right - left + 1)
187
- merge_sorted_arrays(nums, left, mid, right, temp)
188
- for i in range(left, right + 1):
189
- nums[i] = temp[i - left]
190
- return count
177
+ count = 0
178
+ j = mid + 1
179
+ for i in range(left, mid + 1):
180
+ while j <= right and nums[i] > 2 _ nums[j]:
181
+ j += 1
182
+ count += j - mid - 1
183
+ temp = [0] _ (right - left + 1)
184
+ merge_sorted_arrays(nums, left, mid, right, temp)
185
+ for i in range(left, right + 1):
186
+ nums[i] = temp[i - left]
187
+ return count
191
188
192
189
def merge_sort(nums, left, right):
193
- if left >= right:
194
- return 0
195
- mid = left + (right - left) // 2
196
- count = merge_sort(nums, left, mid) + merge_sort(nums, mid + 1, right)
197
- count += merge(nums, left, mid, right)
198
- return count
190
+ if left >= right:
191
+ return 0
192
+ mid = left + (right - left) // 2
193
+ count = merge_sort(nums, left, mid) + merge_sort(nums, mid + 1, right)
194
+ count += merge(nums, left, mid, right)
195
+ return count
199
196
200
197
class Solution:
201
- def reversePairs(self, nums):
202
- return merge_sort(nums, 0, len(nums) - 1)
198
+ def reversePairs(self, nums):
199
+ return merge_sort(nums, 0, len(nums) - 1)
203
200
204
201
` ` `
205
202
@@ -255,9 +252,11 @@ class Solution:
255
252
temp[k++] = nums[j++];
256
253
}
257
254
}
255
+
258
256
}
259
257
260
258
` ` `
259
+
261
260
< / TabItem>
262
261
< TabItem value= " cpp" label= " C++" >
263
262
< SolutionAuthor name= " @Ishitamukherjee2004" / >
@@ -291,33 +290,29 @@ int mergeSort(vector<int>& nums, int left, int right) {
291
290
return count;
292
291
}
293
292
294
-
295
293
class Solution {
296
294
public:
297
- int reversePairs(vector<int>& nums) {
298
- return mergeSort(nums, 0, nums.size() - 1);
299
-
295
+ int reversePairs(vector<int>& nums) {
296
+ return mergeSort(nums, 0, nums.size() - 1);
300
297
301
298
}
299
+
302
300
};
303
- ` ` `
304
- < / TabItem>
301
+ ` ` `
302
+ < / TabItem>
305
303
< / Tabs>
306
304
307
305
### Complexity Analysis
308
306
309
307
- ** Time Complexity** : $$O (n* log (n))$$, where n is the length of the input array . This is because the solution uses a modified Merge Sort algorithm, which has a time complexity of O (n log n).
310
308
311
-
312
309
- ** Space Complexity** : $$O (n)$$, where n is the length of the input array . This is because the solution uses a temporary array to store the merged sorted arrays.
313
310
314
-
315
-
316
311
-- -
317
312
318
313
< h2> Authors: < / h2>
319
314
320
315
< div style= {{display: ' flex' , flexWrap: ' wrap' , justifyContent: ' space-between' , gap: ' 10px' }}>
321
316
{[' Ishitamukherjee2004' ].map (username => (
322
317
< Author key= {username} username= {username} / >
323
- ))} < / div>
318
+ ))} < / div>
0 commit comments