Skip to content

Commit 405c217

Browse files
committed
1 parent 6a36c4b commit 405c217

File tree

3 files changed

+84
-2
lines changed

3 files changed

+84
-2
lines changed

LCP/24 Nums Game/NumsGame.swift

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//
2+
// Copyright © 2024 Zhiwei Sun. All rights reserved.
3+
//
4+
// File name: NumsGame.swift
5+
// Author: Zhiwei Sun @szwathub
6+
7+
//
8+
// Description:
9+
// https://leetcode.cn/problems/5TxKeK/
10+
// History:
11+
// 2024/2/1: Created by szwathub on 2024/2/1
12+
//
13+
14+
import Structure
15+
16+
class NumsGame {
17+
18+
func numsGame(_ nums: [Int]) -> [Int] {
19+
var ans: [Int] = [Int](repeating: 0, count: nums.count)
20+
21+
let MOD = 1_000_000_007
22+
23+
var lowerHeap = Heap<Int>(sort: >) // 大根堆, 维护较小的一半
24+
var upperHeap = Heap<Int>(sort: <) // 小根堆, 维护较大的一半
25+
var lowerSum = 0, upperSum = 0
26+
27+
for (index, num) in nums.enumerated() {
28+
var x = num - index
29+
if index % 2 == 0 { // 前缀长度是奇数
30+
if let top = lowerHeap.peek(), x < top {
31+
lowerSum -= top - x
32+
lowerHeap.insert(x)
33+
lowerHeap.remove()
34+
x = top
35+
}
36+
upperSum += x
37+
upperHeap.insert(x)
38+
ans[index] = (upperSum - (upperHeap.peek() ?? 0) - lowerSum) % MOD
39+
} else {
40+
if let top = upperHeap.peek(), x > top {
41+
upperSum += x - top
42+
upperHeap.insert(x)
43+
upperHeap.remove()
44+
x = top
45+
}
46+
47+
lowerSum += x
48+
lowerHeap.insert(x)
49+
ans[index] = (upperSum - lowerSum) % MOD
50+
}
51+
}
52+
53+
return ans
54+
}
55+
}

Package.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ let package = Package(
77
name: "LeetCode",
88
products: [
99
// Products define the executables and libraries a package produces, and make them visible to other packages.
10+
.library(name: "Structure", targets: ["Structure"]),
11+
.library(name: "LCP", targets: ["LCP"]),
1012
.library(name: "LeetCode", targets: ["LeetCode"])
1113
],
1214
dependencies: [
@@ -16,7 +18,11 @@ let package = Package(
1618
targets: [
1719
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
1820
// Targets can depend on other targets in this package, and on products in packages this package depends on.
19-
.target(name: "LeetCode", dependencies: [], path: "LeetCode"),
20-
.testTarget(name: "LeetCodeTests", dependencies: ["LeetCode"]),
21+
.target(name: "Structure", dependencies: [], path: "Structure"),
22+
.target(name: "LCP", dependencies: ["Structure"], path: "LCP"),
23+
.target(name: "LeetCode", dependencies: ["Structure"], path: "LeetCode"),
24+
.testTarget(name: "LCPTests", dependencies: ["LCP", "Structure"]),
25+
.testTarget(name: "LeetCodeTests", dependencies: ["LeetCode", "Structure"]),
26+
.testTarget(name: "StructureTests", dependencies: ["Structure"])
2127
]
2228
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import XCTest
2+
@testable import LCP
3+
4+
final class NumsGameSpec: XCTestCase {
5+
6+
fileprivate let questions: [(([Int]), [Int])] = [
7+
(([3, 4, 5, 1, 6, 7]), [0, 0, 0, 5, 6, 7]),
8+
(([1, 2, 3, 4, 5]), [0, 0, 0, 0, 0]),
9+
(([1, 1, 1, 2, 3, 4]), [0, 1, 2, 3, 3, 3])
10+
]
11+
12+
func testNumsGame() {
13+
let solution = NumsGame()
14+
for ((nums), answer) in questions {
15+
XCTAssertEqual(
16+
solution.numsGame(nums),
17+
answer
18+
)
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)