forked from krahets/hello-algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add kotlin code for the chapter of divide and conquer (krahets#1098)
* feat(kotlin):new kotlin support files * fix(kotlin): reviewed the formatting, comments and so on. * fix(kotlin): fix the indentation and format * feat(kotlin): Add kotlin code for the backtraking chapter. * fix(kotlin): fix incorrect output of preorder_traversal_iii_template.kt file * fix(kotlin): simplify kotlin codes * fix(kotlin): modify n_queens.kt for consistency. * feat(kotlin): add kotlin code for computational complexity. * fix(kotlin): remove iteration folder. * fix(kotlin): remove n_queens.kt file out of folder. * fix(kotlin): remove some folders. * style(kotlin): modified two chapters. * feat(kotlin): add kotlin code for divide and conquer. * Update build_tree.kt * Update hanota.kt * Delete codes/kotlin/chapter_backtracking directory * Delete codes/kotlin/chapter_computational_complexity directory * Delete codes/kotlin/chapter_divide_and_conquer directory * feat(kotlin): add kotlin code for divide and conquer. * Update hanota.kt
- Loading branch information
Showing
3 changed files
with
154 additions
and
0 deletions.
There are no files selected for viewing
49 changes: 49 additions & 0 deletions
49
codes/kotlin/chapter_divide_and_conquer/binary_search_recur.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/** | ||
* File: binary_search_recur.kt | ||
* Created Time: 2024-01-25 | ||
* Author: curtishd ([email protected]) | ||
*/ | ||
|
||
package chapter_divide_and_conquer.binary_search_recur | ||
|
||
/* 二分查找:问题 f(i, j) */ | ||
fun dfs( | ||
nums: IntArray, | ||
target: Int, | ||
i: Int, | ||
j: Int | ||
): Int { | ||
// 若区间为空,代表无目标元素,则返回 -1 | ||
if (i > j) { | ||
return -1 | ||
} | ||
// 计算中点索引 m | ||
val m = (i + j) / 2 | ||
return if (nums[m] < target) { | ||
// 递归子问题 f(m+1, j) | ||
dfs(nums, target, m + 1, j) | ||
} else if (nums[m] > target) { | ||
// 递归子问题 f(i, m-1) | ||
dfs(nums, target, i, m - 1) | ||
} else { | ||
// 找到目标元素,返回其索引 | ||
m | ||
} | ||
} | ||
|
||
/* 二分查找 */ | ||
fun binarySearch(nums: IntArray, target: Int): Int { | ||
val n = nums.size | ||
// 求解问题 f(0, n-1) | ||
return dfs(nums, target, 0, n - 1) | ||
} | ||
|
||
/* Driver Code */ | ||
fun main() { | ||
val target = 6 | ||
val nums = intArrayOf(1, 3, 6, 8, 12, 15, 23, 26, 31, 35) | ||
|
||
// 二分查找(双闭区间) | ||
val index = binarySearch(nums, target) | ||
println("目标元素 6 的索引 = $index") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/** | ||
* File: build_tree.kt | ||
* Created Time: 2024-01-25 | ||
* Author: curtishd ([email protected]) | ||
*/ | ||
|
||
package chapter_divide_and_conquer.build_tree | ||
|
||
import utils.TreeNode | ||
import utils.printTree | ||
|
||
/* 构建二叉树:分治 */ | ||
fun dfs(preorder: IntArray, inorderMap: Map<Int?, Int?>, i: Int, l: Int, r: Int): TreeNode? { | ||
// 子树区间为空时终止 | ||
if (r - l < 0) return null | ||
// 初始化根节点 | ||
val root = TreeNode(preorder[i]) | ||
// 查询 m ,从而划分左右子树 | ||
val m = inorderMap[preorder[i]]!! | ||
// 子问题:构建左子树 | ||
root.left = dfs(preorder, inorderMap, i + 1, l, m - 1) | ||
// 子问题:构建右子树 | ||
root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r) | ||
// 返回根节点 | ||
return root | ||
} | ||
|
||
/* 构建二叉树 */ | ||
fun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? { | ||
// 初始化哈希表,存储 inorder 元素到索引的映射 | ||
val inorderMap: MutableMap<Int?, Int?> = HashMap() | ||
for (i in inorder.indices) { | ||
inorderMap[inorder[i]] = i | ||
} | ||
val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1) | ||
return root | ||
} | ||
|
||
/* Driver Code */ | ||
fun main() { | ||
val preorder = intArrayOf(3, 9, 2, 1, 7) | ||
val inorder = intArrayOf(9, 3, 1, 2, 7) | ||
println("前序遍历 = " + preorder.contentToString()) | ||
println("中序遍历 = " + inorder.contentToString()) | ||
|
||
val root = buildTree(preorder, inorder) | ||
println("构建的二叉树为:") | ||
printTree(root) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/** | ||
* File: hanota.kt | ||
* Created Time: 2024-1-25 | ||
* Author: curtishd ([email protected]) | ||
*/ | ||
|
||
package chapter_divide_and_conquer.hanota | ||
|
||
/* 移动一个圆盘 */ | ||
fun move(src: MutableList<Int>, tar: MutableList<Int>) { | ||
// 从 src 顶部拿出一个圆盘 | ||
val pan: Int = src.removeAt(src.size - 1) | ||
// 将圆盘放入 tar 顶部 | ||
tar.add(pan) | ||
} | ||
|
||
/* 求解汉诺塔问题 f(i) */ | ||
fun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) { | ||
// 若 src 只剩下一个圆盘,则直接将其移到 tar | ||
if (i == 1) { | ||
move(src, tar) | ||
return | ||
} | ||
// 子问题 f(i-1) :将 src 顶部 i-1 个圆盘借助 tar 移到 buf | ||
dfs(i - 1, src, tar, buf) | ||
// 子问题 f(1) :将 src 剩余一个圆盘移到 tar | ||
move(src, tar) | ||
// 子问题 f(i-1) :将 buf 顶部 i-1 个圆盘借助 src 移到 tar | ||
dfs(i - 1, buf, src, tar) | ||
} | ||
|
||
/* 求解汉诺塔问题 */ | ||
fun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) { | ||
val n = A.size | ||
// 将 A 顶部 n 个圆盘借助 B 移到 C | ||
dfs(n, A, B, C) | ||
} | ||
|
||
/* Driver Code */ | ||
fun main() { | ||
// 列表尾部是柱子顶部 | ||
val A: MutableList<Int> = ArrayList(mutableListOf(5, 4, 3, 2, 1)) | ||
val B: MutableList<Int> = ArrayList() | ||
val C: MutableList<Int> = ArrayList() | ||
println("初始状态下:") | ||
println("A = $A") | ||
println("B = $B") | ||
println("C = $C") | ||
|
||
solveHanota(A, B, C) | ||
|
||
println("圆盘移动完成后:") | ||
println("A = $A") | ||
println("B = $B") | ||
println("C = $C") | ||
} |