Skip to content

Commit db52146

Browse files
authored
feat: add swift implementation to lcof problem: No.51 (#2936)
1 parent 377f75f commit db52146

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,63 @@ public class Solution {
312312
}
313313
```
314314

315+
#### Swift
316+
317+
```swift
318+
class Solution {
319+
private var nums: [Int] = []
320+
private var temp: [Int] = []
321+
322+
func reversePairs(_ nums: [Int]) -> Int {
323+
self.nums = nums
324+
let n = nums.count
325+
self.temp = [Int](repeating: 0, count: n)
326+
return mergeSort(0, n - 1)
327+
}
328+
329+
private func mergeSort(_ left: Int, _ right: Int) -> Int {
330+
if left >= right {
331+
return 0
332+
}
333+
let mid = (left + right) / 2
334+
var count = mergeSort(left, mid) + mergeSort(mid + 1, right)
335+
var i = left
336+
var j = mid + 1
337+
var k = left
338+
339+
while i <= mid && j <= right {
340+
if nums[i] <= nums[j] {
341+
temp[k] = nums[i]
342+
i += 1
343+
} else {
344+
count += mid - i + 1
345+
temp[k] = nums[j]
346+
j += 1
347+
}
348+
k += 1
349+
}
350+
351+
while i <= mid {
352+
temp[k] = nums[i]
353+
i += 1
354+
k += 1
355+
}
356+
357+
while j <= right {
358+
temp[k] = nums[j]
359+
j += 1
360+
k += 1
361+
}
362+
363+
for i in left...right {
364+
nums[i] = temp[i]
365+
}
366+
367+
return count
368+
}
369+
}
370+
```
371+
315372
<!-- tabs:end -->
316373

317374
<!-- solution:end -->
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
class Solution {
2+
private var nums: [Int] = []
3+
private var temp: [Int] = []
4+
5+
func reversePairs(_ nums: [Int]) -> Int {
6+
self.nums = nums
7+
let n = nums.count
8+
self.temp = [Int](repeating: 0, count: n)
9+
return mergeSort(0, n - 1)
10+
}
11+
12+
private func mergeSort(_ left: Int, _ right: Int) -> Int {
13+
if left >= right {
14+
return 0
15+
}
16+
let mid = (left + right) / 2
17+
var count = mergeSort(left, mid) + mergeSort(mid + 1, right)
18+
var i = left
19+
var j = mid + 1
20+
var k = left
21+
22+
while i <= mid && j <= right {
23+
if nums[i] <= nums[j] {
24+
temp[k] = nums[i]
25+
i += 1
26+
} else {
27+
count += mid - i + 1
28+
temp[k] = nums[j]
29+
j += 1
30+
}
31+
k += 1
32+
}
33+
34+
while i <= mid {
35+
temp[k] = nums[i]
36+
i += 1
37+
k += 1
38+
}
39+
40+
while j <= right {
41+
temp[k] = nums[j]
42+
j += 1
43+
k += 1
44+
}
45+
46+
for i in left...right {
47+
nums[i] = temp[i]
48+
}
49+
50+
return count
51+
}
52+
}

0 commit comments

Comments
 (0)