Skip to content

Commit f53861b

Browse files
committed
feat: add solutions to lcof problem: No.51
1 parent c78ce6a commit f53861b

File tree

10 files changed

+761
-586
lines changed

10 files changed

+761
-586
lines changed

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

+368-189
Large diffs are not rendered by default.

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

+29-22
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,36 @@ class Solution {
22
public:
33
int reversePairs(vector<int>& nums) {
44
int n = nums.size();
5-
vector<int> temp(n);
6-
return mergeSort(nums, temp, 0, n - 1);
7-
}
8-
9-
private:
10-
int mergeSort(vector<int>& nums, vector<int>& temp, int l, int r) {
11-
if (l >= r) {
5+
if (n == 0) {
126
return 0;
137
}
14-
int m = l + (r - l) / 2;
15-
int count = mergeSort(nums, temp, l, m) + mergeSort(nums, temp, m + 1, r);
16-
int i = l, j = m + 1, k = l;
17-
while (i <= m || j <= r) {
18-
if (i > m) {
19-
temp[k++] = nums[j++];
20-
} else if (j > r || nums[i] <= nums[j]) {
21-
temp[k++] = nums[i++];
22-
} else {
23-
count += m - i + 1;
24-
temp[k++] = nums[j++];
8+
int t[n];
9+
function<int(int, int)> mergeSort = [&](int l, int r) -> int {
10+
if (l >= r) {
11+
return 0;
2512
}
26-
}
27-
copy(temp.begin() + l, temp.begin() + r + 1, nums.begin() + l);
28-
return count;
13+
int mid = (l + r) >> 1;
14+
int ans = mergeSort(l, mid) + mergeSort(mid + 1, r);
15+
int i = l, j = mid + 1, k = 0;
16+
while (i <= mid && j <= r) {
17+
if (nums[i] <= nums[j]) {
18+
t[k++] = nums[i++];
19+
} else {
20+
ans += mid - i + 1;
21+
t[k++] = nums[j++];
22+
}
23+
}
24+
while (i <= mid) {
25+
t[k++] = nums[i++];
26+
}
27+
while (j <= r) {
28+
t[k++] = nums[j++];
29+
}
30+
for (i = l; i <= r; ++i) {
31+
nums[i] = t[i - l];
32+
}
33+
return ans;
34+
};
35+
return mergeSort(0, n - 1);
2936
}
30-
};
37+
};
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,38 @@
11
public class Solution {
2-
int[] nums, aux;
2+
private int[] nums;
3+
private int[] t;
4+
35
public int ReversePairs(int[] nums) {
4-
int n = nums.Length;
5-
if (n == 0) {
6-
return 0;
7-
}
86
this.nums = nums;
9-
aux = new int[n];
10-
return Merge(0, n - 1);
7+
int n = nums.Length;
8+
this.t = new int[n];
9+
return mergeSort(0, n - 1);
1110
}
1211

13-
int Merge(int l, int r)
14-
{
15-
if (l == r) {
12+
private int mergeSort(int l, int r) {
13+
if (l >= r) {
1614
return 0;
1715
}
18-
var mid = (l + r) >> 1;
19-
int ans = Merge(l, mid) + Merge(mid + 1, r);
20-
for (int k = l; k <= r; k++) {
21-
aux[k] = nums[k];
22-
}
23-
for (int i = l, j = mid + 1, k = l; k <= r; k++)
24-
{
25-
if (i == mid + 1) {
26-
nums[k] = aux[j++];
27-
} else if (j == r + 1) {
28-
nums[k] = aux[i++];
29-
} else if (aux[i] <= aux[j]) {
30-
nums[k] = aux[i++];
16+
int mid = (l + r) >> 1;
17+
int ans = mergeSort(l, mid) + mergeSort(mid + 1, r);
18+
int i = l, j = mid + 1, k = 0;
19+
while (i <= mid && j <= r) {
20+
if (nums[i] <= nums[j]) {
21+
t[k++] = nums[i++];
3122
} else {
32-
nums[k] = aux[j++];
33-
ans += mid + 1 - i;
23+
ans += mid - i + 1;
24+
t[k++] = nums[j++];
3425
}
3526
}
27+
while (i <= mid) {
28+
t[k++] = nums[i++];
29+
}
30+
while (j <= r) {
31+
t[k++] = nums[j++];
32+
}
33+
for (i = l; i <= r; ++i) {
34+
nums[i] = t[i - l];
35+
}
3636
return ans;
3737
}
38-
39-
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,34 @@
11
func reversePairs(nums []int) int {
2-
return mergeSort(nums, 0, len(nums)-1)
3-
}
4-
5-
func mergeSort(nums []int, left, right int) int {
6-
if left >= right {
7-
return 0
8-
}
9-
mid := (left + right) >> 1
10-
res := mergeSort(nums, left, mid) + mergeSort(nums, mid+1, right)
11-
i, j := left, mid+1
12-
var tmp []int
13-
for i <= mid && j <= right {
14-
if nums[i] <= nums[j] {
15-
tmp = append(tmp, nums[i])
16-
i++
17-
} else {
18-
res += (mid - i + 1)
19-
tmp = append(tmp, nums[j])
20-
j++
2+
n := len(nums)
3+
t := make([]int, n)
4+
var mergeSort func(l, r int) int
5+
mergeSort = func(l, r int) int {
6+
if l >= r {
7+
return 0
218
}
9+
mid := (l + r) >> 1
10+
ans := mergeSort(l, mid) + mergeSort(mid+1, r)
11+
i, j, k := l, mid+1, 0
12+
for i <= mid && j <= r {
13+
if nums[i] <= nums[j] {
14+
t[k] = nums[i]
15+
k, i = k+1, i+1
16+
} else {
17+
ans += mid - i + 1
18+
t[k] = nums[j]
19+
k, j = k+1, j+1
20+
}
21+
}
22+
for ; i <= mid; i, k = i+1, k+1 {
23+
t[k] = nums[i]
24+
}
25+
for ; j <= r; j, k = j+1, k+1 {
26+
t[k] = nums[j]
27+
}
28+
for i = l; i <= r; i++ {
29+
nums[i] = t[i-l]
30+
}
31+
return ans
2232
}
23-
for i <= mid {
24-
tmp = append(tmp, nums[i])
25-
i++
26-
}
27-
for j <= right {
28-
tmp = append(tmp, nums[j])
29-
j++
30-
}
31-
for i = left; i <= right; i++ {
32-
nums[i] = tmp[i-left]
33-
}
34-
return res
33+
return mergeSort(0, n-1)
3534
}
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,38 @@
11
class Solution {
2-
private static int[] tmp = new int[50010];
2+
private int[] nums;
3+
private int[] t;
34

45
public int reversePairs(int[] nums) {
5-
return mergeSort(nums, 0, nums.length - 1);
6+
this.nums = nums;
7+
int n = nums.length;
8+
this.t = new int[n];
9+
return mergeSort(0, n - 1);
610
}
711

8-
private int mergeSort(int[] nums, int left, int right) {
9-
if (left >= right) {
12+
private int mergeSort(int l, int r) {
13+
if (l >= r) {
1014
return 0;
1115
}
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+
int mid = (l + r) >> 1;
17+
int ans = mergeSort(l, mid) + mergeSort(mid + 1, r);
18+
int i = l, j = mid + 1, k = 0;
19+
while (i <= mid && j <= r) {
1620
if (nums[i] <= nums[j]) {
17-
tmp[k++] = nums[i++];
21+
t[k++] = nums[i++];
1822
} else {
19-
res += (mid - i + 1);
20-
tmp[k++] = nums[j++];
23+
ans += mid - i + 1;
24+
t[k++] = nums[j++];
2125
}
2226
}
2327
while (i <= mid) {
24-
tmp[k++] = nums[i++];
28+
t[k++] = nums[i++];
2529
}
26-
while (j <= right) {
27-
tmp[k++] = nums[j++];
30+
while (j <= r) {
31+
t[k++] = nums[j++];
2832
}
29-
for (i = left; i <= right; ++i) {
30-
nums[i] = tmp[i - left];
33+
for (i = l; i <= r; ++i) {
34+
nums[i] = t[i - l];
3135
}
32-
return res;
36+
return ans;
3337
}
3438
}

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

+17-18
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,33 @@
33
* @return {number}
44
*/
55
var reversePairs = function (nums) {
6-
const mergeSort = (nums, left, right) => {
7-
if (left >= right) {
6+
const mergeSort = (l, r) => {
7+
if (l >= r) {
88
return 0;
99
}
10-
const mid = (left + right) >> 1;
11-
let res = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);
12-
let i = left;
10+
const mid = (l + r) >> 1;
11+
let ans = mergeSort(l, mid) + mergeSort(mid + 1, r);
12+
let i = l;
1313
let j = mid + 1;
14-
let tmp = [];
15-
while (i <= mid && j <= right) {
14+
let t = [];
15+
while (i <= mid && j <= r) {
1616
if (nums[i] <= nums[j]) {
17-
tmp.push(nums[i++]);
17+
t.push(nums[i++]);
1818
} else {
19-
tmp.push(nums[j++]);
20-
res += mid - i + 1;
19+
ans += mid - i + 1;
20+
t.push(nums[j++]);
2121
}
2222
}
2323
while (i <= mid) {
24-
tmp.push(nums[i++]);
24+
t.push(nums[i++]);
2525
}
26-
while (j <= right) {
27-
tmp.push(nums[j++]);
26+
while (j <= r) {
27+
t.push(nums[j++]);
2828
}
29-
for (i = left, j = 0; i <= right; ++i, ++j) {
30-
nums[i] = tmp[j];
29+
for (i = l; i <= r; ++i) {
30+
nums[i] = t[i - l];
3131
}
32-
return res;
32+
return ans;
3333
};
34-
35-
return mergeSort(nums, 0, nums.length - 1);
34+
return mergeSort(0, nums.length - 1);
3635
};
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
11
class Solution:
22
def reversePairs(self, nums: List[int]) -> int:
3-
def merge_sort(nums, left, right):
4-
if left >= right:
3+
def merge_sort(l, r):
4+
if l >= r:
55
return 0
6-
mid = (left + right) >> 1
7-
res = merge_sort(nums, left, mid) + merge_sort(nums, mid + 1, right)
8-
i, j = left, mid + 1
9-
tmp = []
10-
while i <= mid and j <= right:
6+
mid = (l + r) >> 1
7+
ans = merge_sort(l, mid) + merge_sort(mid + 1, r)
8+
t = []
9+
i, j = l, mid + 1
10+
while i <= mid and j <= r:
1111
if nums[i] <= nums[j]:
12-
tmp.append(nums[i])
12+
t.append(nums[i])
1313
i += 1
1414
else:
15-
res += mid - i + 1
16-
tmp.append(nums[j])
15+
ans += mid - i + 1
16+
t.append(nums[j])
1717
j += 1
18-
while i <= mid:
19-
tmp.append(nums[i])
20-
i += 1
21-
while j <= right:
22-
tmp.append(nums[j])
23-
j += 1
24-
for i in range(left, right + 1):
25-
nums[i] = tmp[i - left]
26-
return res
18+
t.extend(nums[i : mid + 1])
19+
t.extend(nums[j : r + 1])
20+
nums[l : r + 1] = t
21+
return ans
2722

28-
return merge_sort(nums, 0, len(nums) - 1)
23+
return merge_sort(0, len(nums) - 1)

0 commit comments

Comments
 (0)