Skip to content

Commit a62e79a

Browse files
authored
feat: add swift implementation to lcp problem: No.24 (#3773)
1 parent 68bfa43 commit a62e79a

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

lcp/LCP 24. 数字游戏/README.md

+75
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,81 @@ func (h *hp) Pop() any {
307307
}
308308
```
309309

310+
#### Swift
311+
312+
```swift
313+
class MedianFinder {
314+
private var lowerHeap: [Int] = []
315+
private var upperHeap: [Int] = []
316+
private let mod = 1_000_000_007
317+
private var sumLower = 0
318+
private var sumUpper = 0
319+
320+
init() {}
321+
322+
func addNum(_ num: Int) {
323+
324+
upperHeap.append(num)
325+
sumUpper += num
326+
upperHeap.sort()
327+
328+
329+
if let minUpper = upperHeap.first {
330+
upperHeap.removeFirst()
331+
lowerHeap.append(minUpper)
332+
sumUpper -= minUpper
333+
sumLower += minUpper
334+
lowerHeap.sort(by: >)
335+
}
336+
337+
338+
if lowerHeap.count > upperHeap.count + 1 {
339+
if let maxLower = lowerHeap.first {
340+
lowerHeap.removeFirst()
341+
upperHeap.append(maxLower)
342+
sumLower -= maxLower
343+
sumUpper += maxLower
344+
upperHeap.sort()
345+
}
346+
}
347+
}
348+
349+
func findMedian() -> Int {
350+
if lowerHeap.count > upperHeap.count {
351+
return lowerHeap.first ?? 0
352+
} else if let minUpper = upperHeap.first, let maxLower = lowerHeap.first {
353+
return (minUpper + maxLower) / 2
354+
}
355+
return 0
356+
}
357+
358+
func cal() -> Int {
359+
let median = findMedian()
360+
var result = (sumUpper - median * upperHeap.count) + (median * lowerHeap.count - sumLower)
361+
result %= mod
362+
if result < 0 {
363+
result += mod
364+
}
365+
return Int(result)
366+
}
367+
}
368+
369+
class Solution {
370+
func numsGame(_ nums: [Int]) -> [Int] {
371+
let n = nums.count
372+
var result = [Int]()
373+
let finder = MedianFinder()
374+
375+
for i in 0..<n {
376+
finder.addNum(nums[i] - i)
377+
result.append(finder.cal())
378+
}
379+
380+
return result
381+
}
382+
}
383+
```
384+
310385
<!-- tabs:end -->
311386

312387
<!-- solution:end -->
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
class MedianFinder {
2+
private var lowerHeap: [Int] = []
3+
private var upperHeap: [Int] = []
4+
private let mod = 1_000_000_007
5+
private var sumLower = 0
6+
private var sumUpper = 0
7+
8+
init() {}
9+
10+
func addNum(_ num: Int) {
11+
12+
upperHeap.append(num)
13+
sumUpper += num
14+
upperHeap.sort()
15+
16+
17+
if let minUpper = upperHeap.first {
18+
upperHeap.removeFirst()
19+
lowerHeap.append(minUpper)
20+
sumUpper -= minUpper
21+
sumLower += minUpper
22+
lowerHeap.sort(by: >)
23+
}
24+
25+
26+
if lowerHeap.count > upperHeap.count + 1 {
27+
if let maxLower = lowerHeap.first {
28+
lowerHeap.removeFirst()
29+
upperHeap.append(maxLower)
30+
sumLower -= maxLower
31+
sumUpper += maxLower
32+
upperHeap.sort()
33+
}
34+
}
35+
}
36+
37+
func findMedian() -> Int {
38+
if lowerHeap.count > upperHeap.count {
39+
return lowerHeap.first ?? 0
40+
} else if let minUpper = upperHeap.first, let maxLower = lowerHeap.first {
41+
return (minUpper + maxLower) / 2
42+
}
43+
return 0
44+
}
45+
46+
func cal() -> Int {
47+
let median = findMedian()
48+
var result = (sumUpper - median * upperHeap.count) + (median * lowerHeap.count - sumLower)
49+
result %= mod
50+
if result < 0 {
51+
result += mod
52+
}
53+
return Int(result)
54+
}
55+
}
56+
57+
class Solution {
58+
func numsGame(_ nums: [Int]) -> [Int] {
59+
let n = nums.count
60+
var result = [Int]()
61+
let finder = MedianFinder()
62+
63+
for i in 0..<n {
64+
finder.addNum(nums[i] - i)
65+
result.append(finder.cal())
66+
}
67+
68+
return result
69+
}
70+
}

0 commit comments

Comments
 (0)