Skip to content

Commit 5e9d13f

Browse files
committed
feat: update solutions to lcof problem: No.051. Count Reverse Pairs
1 parent 55b0511 commit 5e9d13f

File tree

5 files changed

+153
-180
lines changed

5 files changed

+153
-180
lines changed

basic/searching/BinarySearch/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
二分的本质并非“单调性”,而是“边界”,只要找到某种性质,使得整个区间一分为二,那么就可以用二分把边界点二分出来。
44

5-
整数二分算法模板:
5+
**整数二分算法模板:**
66

77
```java
88
/** 检查x是否满足某种性质 */

lcof/面试题51. 数组中的逆序对/README.md

+76-90
Original file line numberDiff line numberDiff line change
@@ -32,41 +32,33 @@
3232
```python
3333
class Solution:
3434
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
4546
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)
7062
```
7163

7264
### **Java**
@@ -75,47 +67,37 @@ class Solution:
7567

7668
```java
7769
class Solution {
78-
private int res = 0;
70+
private static int[] tmp = new int[50000];
71+
7972
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);
8674
}
8775

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;
9179
}
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++];
10686
} else {
107-
help[idx++] = nums[i++];
87+
tmp[k++] = nums[j++];
88+
res += (mid - i + 1);
10889
}
10990
}
11091
while (i <= mid) {
111-
help[idx++] = nums[i++];
92+
tmp[k++] = nums[i++];
11293
}
113-
while (j <= e) {
114-
help[idx++] = nums[j++];
94+
while (j <= right) {
95+
tmp[k++] = nums[j++];
11596
}
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++];
11899
}
100+
return res;
119101
}
120102
}
121103
```
@@ -127,33 +109,37 @@ class Solution {
127109
* @param {number[]} nums
128110
* @return {number}
129111
*/
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;
151140
}
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);
157143
};
158144
```
159145

Original file line numberDiff line numberDiff line change
@@ -1,44 +1,34 @@
11
class Solution {
2-
private int res = 0;
2+
private static int[] tmp = new int[50000];
3+
34
public int reversePairs(int[] nums) {
4-
int n = nums.length;
5-
if (n < 2) {
6-
return 0;
7-
}
8-
mergeSort(nums, 0, n - 1);
9-
return res;
5+
return mergeSort(nums, 0, nums.length - 1);
106
}
117

12-
private void mergeSort(int[] nums, int s, int e) {
13-
if (s == e) {
14-
return;
8+
private int mergeSort(int[] nums, int left, int right) {
9+
if (left >= right) {
10+
return 0;
1511
}
16-
int mid = (s + e) >>> 1;
17-
mergeSort(nums, s, mid);
18-
mergeSort(nums, mid + 1, e);
19-
merge(nums, s, mid, e);
20-
}
21-
22-
private void merge(int[] nums, int s, int mid, int e) {
23-
int n = e - s + 1;
24-
int[] help = new int[n];
25-
int i = s, j = mid + 1, idx = 0;
26-
while (i <= mid && j <= e) {
27-
if (nums[i] > nums[j]) {
28-
res += (mid - i + 1);
29-
help[idx++] = nums[j++];
12+
int mid = (left + right) >>> 1;
13+
int res = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);
14+
int i = left, j = mid + 1, k = 0;
15+
while (i <= mid && j <= right) {
16+
if (nums[i] <= nums[j]) {
17+
tmp[k++] = nums[i++];
3018
} else {
31-
help[idx++] = nums[i++];
19+
tmp[k++] = nums[j++];
20+
res += (mid - i + 1);
3221
}
3322
}
3423
while (i <= mid) {
35-
help[idx++] = nums[i++];
24+
tmp[k++] = nums[i++];
3625
}
37-
while (j <= e) {
38-
help[idx++] = nums[j++];
26+
while (j <= right) {
27+
tmp[k++] = nums[j++];
3928
}
40-
for (int t = 0; t < n; ++t) {
41-
nums[s + t] = help[t];
29+
for (i = left, j = 0; i <= right; ++i) {
30+
nums[i] = tmp[j++];
4231
}
32+
return res;
4333
}
4434
}

lcof/面试题51. 数组中的逆序对/Solution.js

+30-26
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,35 @@
22
* @param {number[]} nums
33
* @return {number}
44
*/
5-
var reversePairs = function (nums) {
6-
if (!nums || nums.length < 2) return 0;
7-
let res = 0;
8-
function mergeSort(arr) {
9-
if (arr.length === 1) {
10-
return arr;
11-
}
12-
let mid = ~~(arr.length / 2);
13-
return merge(mergeSort(arr.slice(0, mid)), mergeSort(arr.slice(mid)));
14-
}
15-
function merge(a, b) {
16-
let r = [];
17-
let cnt = 0;
18-
while (a && b && a.length && b.length) {
19-
if (a[0] <= b[0]) {
20-
res += cnt;
21-
r.push(a.shift());
22-
} else {
23-
r.push(b.shift());
24-
cnt++;
5+
var reversePairs = function(nums) {
6+
const mergeSort = (nums, left, right) => {
7+
if (left >= right) {
8+
return 0;
9+
}
10+
const mid = (left + right) >> 1;
11+
let res = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);
12+
let i = left;
13+
let j = mid + 1;
14+
let tmp = [];
15+
while (i <= mid && j <= right) {
16+
if (nums[i] <= nums[j]) {
17+
tmp.push(nums[i++]);
18+
} else {
19+
tmp.push(nums[j++]);
20+
res += (mid - i + 1);
21+
}
22+
}
23+
while (i <= mid) {
24+
tmp.push(nums[i++]);
25+
}
26+
while (j <= right) {
27+
tmp.push(nums[j++]);
28+
}
29+
for (i = left, j = 0; i <= right; ++i, ++j) {
30+
nums[i] = tmp[j];
2531
}
26-
}
27-
res += a.length * cnt;
28-
return r.concat(a, b);
32+
return res;
2933
}
30-
mergeSort(nums);
31-
return res;
32-
};
34+
35+
return mergeSort(nums, 0, nums.length - 1);
36+
};

0 commit comments

Comments
 (0)