This commit is contained in:
krahets 2023-02-08 20:30:14 +08:00
parent 7156a5f832
commit 30ed83e5b1
10 changed files with 130 additions and 49 deletions

View file

@ -1517,6 +1517,15 @@ comments: true
// 更新列表容量 // 更新列表容量
_capacity = nums.count _capacity = nums.count
} }
/* 将列表转换为数组 */
func toArray() -> [Int] {
var nums = Array(repeating: 0, count: _size)
for i in 0 ..< _size {
nums[i] = get(index: i)
}
return nums
}
} }
``` ```

View file

@ -1342,12 +1342,14 @@ $$
```swift title="space_complexity.swift" ```swift title="space_complexity.swift"
/* 平方阶(递归实现) */ /* 平方阶(递归实现) */
@discardableResult
func quadraticRecur(n: Int) -> Int { func quadraticRecur(n: Int) -> Int {
if n <= 0 { if n <= 0 {
return 0 return 0
} }
// 数组 nums 长度为 n, n-1, ..., 2, 1 // 数组 nums 长度为 n, n-1, ..., 2, 1
let nums = Array(repeating: 0, count: n) let nums = Array(repeating: 0, count: n)
print("递归 n = \(n) 中的 nums 长度 = \(nums.count)")
return quadraticRecur(n: n - 1) return quadraticRecur(n: n - 1)
} }
``` ```

View file

@ -161,6 +161,7 @@ comments: true
=== "Swift" === "Swift"
```swift title="leetcode_two_sum.swift" ```swift title="leetcode_two_sum.swift"
/* 方法一:暴力枚举 */
func twoSumBruteForce(nums: [Int], target: Int) -> [Int] { func twoSumBruteForce(nums: [Int], target: Int) -> [Int] {
// 两层循环,时间复杂度 O(n^2) // 两层循环,时间复杂度 O(n^2)
for i in nums.indices.dropLast() { for i in nums.indices.dropLast() {
@ -344,6 +345,7 @@ comments: true
=== "Swift" === "Swift"
```swift title="leetcode_two_sum.swift" ```swift title="leetcode_two_sum.swift"
/* 方法二:辅助哈希表 */
func twoSumHashTable(nums: [Int], target: Int) -> [Int] { func twoSumHashTable(nums: [Int], target: Int) -> [Int] {
// 辅助哈希表,空间复杂度 O(n) // 辅助哈希表,空间复杂度 O(n)
var dic: [Int: Int] = [:] var dic: [Int: Int] = [:]

View file

@ -903,7 +903,7 @@ $$
/* 常数阶 */ /* 常数阶 */
func constant(n: Int) -> Int { func constant(n: Int) -> Int {
var count = 0 var count = 0
let size = 100000 let size = 100_000
for _ in 0 ..< size { for _ in 0 ..< size {
count += 1 count += 1
} }

View file

@ -976,50 +976,90 @@ $$
class Entry { class Entry {
var key: Int var key: Int
var val: String var val: String
init(key: Int, val: String) { init(key: Int, val: String) {
self.key = key self.key = key
self.val = val self.val = val
} }
} }
/* 基于数组简易实现的哈希表 */ /* 基于数组简易实现的哈希表 */
class ArrayHashMap { class ArrayHashMap {
private var bucket: [Entry?] = [] private var bucket: [Entry?] = []
init() { init() {
// 初始化一个长度为 100 的桶(数组) // 初始化一个长度为 100 的桶(数组)
for _ in 0 ..< 100 { for _ in 0 ..< 100 {
bucket.append(nil) bucket.append(nil)
} }
} }
/* 哈希函数 */ /* 哈希函数 */
private func hashFunc(key: Int) -> Int { private func hashFunc(key: Int) -> Int {
let index = key % 100 let index = key % 100
return index return index
} }
/* 查询操作 */ /* 查询操作 */
func get(key: Int) -> String? { func get(key: Int) -> String? {
let index = hashFunc(key: key) let index = hashFunc(key: key)
let pair = bucket[index] let pair = bucket[index]
return pair?.val return pair?.val
} }
/* 添加操作 */ /* 添加操作 */
func put(key: Int, val: String) { func put(key: Int, val: String) {
let pair = Entry(key: key, val: val) let pair = Entry(key: key, val: val)
let index = hashFunc(key: key) let index = hashFunc(key: key)
bucket[index] = pair bucket[index] = pair
} }
/* 删除操作 */ /* 删除操作 */
func remove(key: Int) { func remove(key: Int) {
let index = hashFunc(key: key) let index = hashFunc(key: key)
// 置为 nil ,代表删除 // 置为 nil ,代表删除
bucket[index] = nil bucket[index] = nil
} }
/* 获取所有键值对 */
func entrySet() -> [Entry] {
var entrySet: [Entry] = []
for pair in bucket {
if let pair = pair {
entrySet.append(pair)
}
}
return entrySet
}
/* 获取所有键 */
func keySet() -> [Int] {
var keySet: [Int] = []
for pair in bucket {
if let pair = pair {
keySet.append(pair.key)
}
}
return keySet
}
/* 获取所有值 */
func valueSet() -> [String] {
var valueSet: [String] = []
for pair in bucket {
if let pair = pair {
valueSet.append(pair.val)
}
}
return valueSet
}
/* 打印哈希表 */
func print() {
for entry in entrySet() {
Swift.print("\(entry.key) -> \(entry.val)")
}
}
} }
``` ```

View file

@ -386,13 +386,6 @@ comments: true
=== "Swift" === "Swift"
```swift title="my_heap.swift" ```swift title="my_heap.swift"
var maxHeap: [Int]
/* 构造函数,建立空堆 */
init() {
maxHeap = []
}
/* 获取左子结点索引 */ /* 获取左子结点索引 */
func left(i: Int) -> Int { func left(i: Int) -> Int {
2 * i + 1 2 * i + 1

View file

@ -141,14 +141,14 @@ comments: true
```javascript title="quick_sort.js" ```javascript title="quick_sort.js"
/* 元素交换 */ /* 元素交换 */
function swap(nums, i, j) { swap(nums, i, j) {
let tmp = nums[i]; let tmp = nums[i];
nums[i] = nums[j]; nums[i] = nums[j];
nums[j] = tmp; nums[j] = tmp;
} }
/* 哨兵划分 */ /* 哨兵划分 */
function partition(nums, left, right) { partition(nums, left, right) {
// 以 nums[left] 作为基准数 // 以 nums[left] 作为基准数
let i = left, j = right; let i = left, j = right;
while (i < j) { while (i < j) {
@ -159,9 +159,9 @@ comments: true
i += 1; // 从左向右找首个大于基准数的元素 i += 1; // 从左向右找首个大于基准数的元素
} }
// 元素交换 // 元素交换
swap(nums, i, j); // 交换这两个元素 this.swap(nums, i, j); // 交换这两个元素
} }
swap(nums, i, left); // 将基准数交换至两子数组的分界线 this.swap(nums, i, left); // 将基准数交换至两子数组的分界线
return i; // 返回基准数的索引 return i; // 返回基准数的索引
} }
``` ```
@ -170,14 +170,14 @@ comments: true
```typescript title="quick_sort.ts" ```typescript title="quick_sort.ts"
/* 元素交换 */ /* 元素交换 */
function swap(nums: number[], i: number, j: number): void { swap(nums: number[], i: number, j: number): void {
let tmp = nums[i]; let tmp = nums[i];
nums[i] = nums[j]; nums[i] = nums[j];
nums[j] = tmp; nums[j] = tmp;
} }
/* 哨兵划分 */ /* 哨兵划分 */
function partition(nums: number[], left: number, right: number): number { partition(nums: number[], left: number, right: number): number {
// 以 nums[left] 作为基准数 // 以 nums[left] 作为基准数
let i = left, j = right; let i = left, j = right;
while (i < j) { while (i < j) {
@ -188,9 +188,9 @@ comments: true
i += 1; // 从左向右找首个大于基准数的元素 i += 1; // 从左向右找首个大于基准数的元素
} }
// 元素交换 // 元素交换
swap(nums, i, j); // 交换这两个元素 this.swap(nums, i, j); // 交换这两个元素
} }
swap(nums, i, left); // 将基准数交换至两子数组的分界线 this.swap(nums, i, left); // 将基准数交换至两子数组的分界线
return i; // 返回基准数的索引 return i; // 返回基准数的索引
} }
``` ```
@ -698,13 +698,12 @@ comments: true
} }
/* 哨兵划分(三数取中值) */ /* 哨兵划分(三数取中值) */
func partition(nums: inout [Int], left: Int, right: Int) -> Int { func partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {
// 选取三个候选元素的中位数 // 选取三个候选元素的中位数
let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right) let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)
// 将中位数交换至数组最左端 // 将中位数交换至数组最左端
swap(nums: &nums, i: left, j: med) swap(nums: &nums, i: left, j: med)
// 以 nums[left] 作为基准数 return partition(nums: &nums, left: left, right: right)
// 下同省略...
} }
``` ```
@ -879,7 +878,7 @@ comments: true
```swift title="quick_sort.swift" ```swift title="quick_sort.swift"
/* 快速排序(尾递归优化) */ /* 快速排序(尾递归优化) */
func quickSort(nums: inout [Int], left: Int, right: Int) { func quickSortTailCall(nums: inout [Int], left: Int, right: Int) {
var left = left var left = left
var right = right var right = right
// 子数组长度为 1 时终止 // 子数组长度为 1 时终止
@ -888,10 +887,10 @@ comments: true
let pivot = partition(nums: &nums, left: left, right: right) let pivot = partition(nums: &nums, left: left, right: right)
// 对两个子数组中较短的那个执行快排 // 对两个子数组中较短的那个执行快排
if (pivot - left) < (right - pivot) { if (pivot - left) < (right - pivot) {
quickSort(nums: &nums, left: left, right: pivot - 1) // 递归排序左子数组 quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // 递归排序左子数组
left = pivot + 1 // 剩余待排序区间为 [pivot + 1, right] left = pivot + 1 // 剩余待排序区间为 [pivot + 1, right]
} else { } else {
quickSort(nums: &nums, left: pivot + 1, right: right) // 递归排序右子数组 quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // 递归排序右子数组
right = pivot - 1 // 剩余待排序区间为 [left, pivot - 1] right = pivot - 1 // 剩余待排序区间为 [left, pivot - 1]
} }
} }

View file

@ -751,19 +751,19 @@ comments: true
private var front: ListNode? // 头结点 private var front: ListNode? // 头结点
private var rear: ListNode? // 尾结点 private var rear: ListNode? // 尾结点
private var _size = 0 private var _size = 0
init() {} init() {}
/* 获取队列的长度 */ /* 获取队列的长度 */
func size() -> Int { func size() -> Int {
_size _size
} }
/* 判断队列是否为空 */ /* 判断队列是否为空 */
func isEmpty() -> Bool { func isEmpty() -> Bool {
size() == 0 size() == 0
} }
/* 入队 */ /* 入队 */
func push(num: Int) { func push(num: Int) {
// 尾结点后添加 num // 尾结点后添加 num
@ -780,7 +780,7 @@ comments: true
} }
_size += 1 _size += 1
} }
/* 出队 */ /* 出队 */
@discardableResult @discardableResult
func poll() -> Int { func poll() -> Int {
@ -790,7 +790,7 @@ comments: true
_size -= 1 _size -= 1
return num return num
} }
/* 访问队首元素 */ /* 访问队首元素 */
func peek() -> Int { func peek() -> Int {
if isEmpty() { if isEmpty() {
@ -798,6 +798,17 @@ comments: true
} }
return front!.val return front!.val
} }
/* 将链表转化为 Array 并返回 */
func toArray() -> [Int] {
var node = front
var res = Array(repeating: 0, count: size())
for i in res.indices {
res[i] = node!.val
node = node?.next
}
return res
}
} }
``` ```
@ -1380,6 +1391,16 @@ comments: true
} }
return nums[front] return nums[front]
} }
/* 返回数组 */
func toArray() -> [Int] {
// 仅转换有效长度范围内的列表元素
var res = Array(repeating: 0, count: queSize)
for (i, j) in sequence(first: (0, front), next: { $0 < self.queSize - 1 ? ($0 + 1, $1 + 1) : nil }) {
res[i] = nums[j % capacity()]
}
return res
}
} }
``` ```

View file

@ -687,19 +687,19 @@ comments: true
class LinkedListStack { class LinkedListStack {
private var _peek: ListNode? // 将头结点作为栈顶 private var _peek: ListNode? // 将头结点作为栈顶
private var _size = 0 // 栈的长度 private var _size = 0 // 栈的长度
init() {} init() {}
/* 获取栈的长度 */ /* 获取栈的长度 */
func size() -> Int { func size() -> Int {
_size _size
} }
/* 判断栈是否为空 */ /* 判断栈是否为空 */
func isEmpty() -> Bool { func isEmpty() -> Bool {
size() == 0 size() == 0
} }
/* 入栈 */ /* 入栈 */
func push(num: Int) { func push(num: Int) {
let node = ListNode(x: num) let node = ListNode(x: num)
@ -707,7 +707,7 @@ comments: true
_peek = node _peek = node
_size += 1 _size += 1
} }
/* 出栈 */ /* 出栈 */
@discardableResult @discardableResult
func pop() -> Int { func pop() -> Int {
@ -716,7 +716,7 @@ comments: true
_size -= 1 _size -= 1
return num return num
} }
/* 访问栈顶元素 */ /* 访问栈顶元素 */
func peek() -> Int { func peek() -> Int {
if isEmpty() { if isEmpty() {
@ -724,6 +724,17 @@ comments: true
} }
return _peek!.val return _peek!.val
} }
/* 将 List 转化为 Array 并返回 */
func toArray() -> [Int] {
var node = _peek
var res = Array(repeating: 0, count: _size)
for i in sequence(first: res.count - 1, next: { $0 >= 0 + 1 ? $0 - 1 : nil }) {
res[i] = node!.val
node = node?.next
}
return res
}
} }
``` ```
@ -1076,27 +1087,27 @@ comments: true
/* 基于数组实现的栈 */ /* 基于数组实现的栈 */
class ArrayStack { class ArrayStack {
private var stack: [Int] private var stack: [Int]
init() { init() {
// 初始化列表(动态数组) // 初始化列表(动态数组)
stack = [] stack = []
} }
/* 获取栈的长度 */ /* 获取栈的长度 */
func size() -> Int { func size() -> Int {
stack.count stack.count
} }
/* 判断栈是否为空 */ /* 判断栈是否为空 */
func isEmpty() -> Bool { func isEmpty() -> Bool {
stack.isEmpty stack.isEmpty
} }
/* 入栈 */ /* 入栈 */
func push(num: Int) { func push(num: Int) {
stack.append(num) stack.append(num)
} }
/* 出栈 */ /* 出栈 */
@discardableResult @discardableResult
func pop() -> Int { func pop() -> Int {
@ -1105,7 +1116,7 @@ comments: true
} }
return stack.removeLast() return stack.removeLast()
} }
/* 访问栈顶元素 */ /* 访问栈顶元素 */
func peek() -> Int { func peek() -> Int {
if isEmpty() { if isEmpty() {
@ -1113,6 +1124,11 @@ comments: true
} }
return stack.last! return stack.last!
} }
/* 将 List 转化为 Array 并返回 */
func toArray() -> [Int] {
stack
}
} }
``` ```

View file

@ -773,7 +773,6 @@ AVL 树的独特之处在于「旋转 Rotation」的操作其可 **在不影
// 返回旋转后子树的根结点 // 返回旋转后子树的根结点
return child return child
} }
``` ```
=== "Zig" === "Zig"