From 2a9db6d0394847bd509939b15ffc67ab4ebfb1dc Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Mon, 25 Nov 2024 19:21:11 +0800 Subject: [PATCH] Bug fixes and improvements (#1572) * Sync zh and zh-hant versions. * Remove the polyfill.io link from mkdocs.yml * Update contributors' info for code reviewers and en/zh-hant versions reviewers. * Fix graph.md * Update avatars for English version reviewers. * Sync zh and zh-hant versions. * Fix two_sum_brute_force.png * Sync zh and zh-hant versions. Optimize structrue of index.html. * Format index.html --- .../two_sum_brute_force.png | Bin 13071 -> 13087 bytes docs/index.html | 2 +- .../two_sum_brute_force.png | Bin 15075 -> 13263 bytes en/docs/index.html | 2 +- zh-hant/codes/c/chapter_searching/two_sum.c | 10 +- .../codes/c/chapter_sorting/counting_sort.c | 1 + zh-hant/codes/c/chapter_sorting/radix_sort.c | 6 +- .../min_path_sum.cs | 8 +- zh-hant/codes/csharp/chapter_heap/heap.cs | 4 +- .../min_path_sum.dart | 8 +- .../min_path_sum_test.go | 8 +- .../min_path_sum.py | 8 +- .../min_path_sum.rb | 8 +- .../chapter_array_and_linkedlist/array.rs | 3 +- .../linked_list.rs | 4 +- .../rust/chapter_array_and_linkedlist/list.rs | 3 +- .../chapter_array_and_linkedlist/my_list.rs | 2 +- .../preorder_traversal_i_compact.rs | 4 +- .../preorder_traversal_ii_compact.rs | 4 +- .../preorder_traversal_iii_compact.rs | 4 +- .../preorder_traversal_iii_template.rs | 4 +- .../space_complexity.rs | 5 +- .../worst_best_time_complexity.rs | 3 +- .../chapter_divide_and_conquer/build_tree.rs | 3 +- .../chapter_graph/graph_adjacency_list.rs | 2 +- .../rust/chapter_hashing/build_in_hash.rs | 3 +- .../codes/rust/chapter_hashing/hash_map.rs | 2 +- zh-hant/codes/rust/chapter_heap/heap.rs | 2 +- zh-hant/codes/rust/chapter_heap/my_heap.rs | 2 +- zh-hant/codes/rust/chapter_heap/top_k.rs | 2 +- .../rust/chapter_searching/hashing_search.rs | 4 +- .../rust/chapter_searching/linear_search.rs | 4 +- .../codes/rust/chapter_searching/two_sum.rs | 3 +- .../codes/rust/chapter_sorting/bubble_sort.rs | 2 +- .../codes/rust/chapter_sorting/bucket_sort.rs | 2 +- .../rust/chapter_sorting/counting_sort.rs | 2 +- .../codes/rust/chapter_sorting/heap_sort.rs | 2 +- .../rust/chapter_sorting/insertion_sort.rs | 2 +- .../codes/rust/chapter_sorting/radix_sort.rs | 2 +- .../rust/chapter_sorting/selection_sort.rs | 2 +- .../chapter_stack_and_queue/array_deque.rs | 4 +- .../chapter_stack_and_queue/array_stack.rs | 2 +- .../rust/chapter_stack_and_queue/deque.rs | 3 +- .../linkedlist_deque.rs | 2 +- .../linkedlist_queue.rs | 3 +- .../linkedlist_stack.rs | 3 +- .../rust/chapter_stack_and_queue/queue.rs | 2 +- .../rust/chapter_stack_and_queue/stack.rs | 2 +- .../rust/chapter_tree/array_binary_tree.rs | 13 +-- zh-hant/codes/rust/chapter_tree/avl_tree.rs | 3 +- .../rust/chapter_tree/binary_search_tree.rs | 12 +- .../codes/rust/chapter_tree/binary_tree.rs | 3 +- .../rust/chapter_tree/binary_tree_bfs.rs | 4 +- .../rust/chapter_tree/binary_tree_dfs.rs | 50 ++++++--- zh-hant/codes/rust/src/include/list_node.rs | 57 ++++++++++ zh-hant/codes/rust/src/include/mod.rs | 16 +++ zh-hant/codes/rust/src/include/print_util.rs | 103 ++++++++++++++++++ zh-hant/codes/rust/src/include/tree_node.rs | 92 ++++++++++++++++ zh-hant/codes/rust/src/include/vertex.rs | 21 ++++ zh-hant/codes/rust/src/lib.rs | 1 + .../min_path_sum.swift | 8 +- zh-hant/docs/chapter_heap/heap.md | 4 +- .../two_sum_brute_force.png | Bin 14870 -> 13209 bytes zh-hant/docs/chapter_tree/avl_tree.md | 2 +- zh-hant/docs/index.html | 2 +- 65 files changed, 414 insertions(+), 140 deletions(-) create mode 100644 zh-hant/codes/rust/src/include/list_node.rs create mode 100644 zh-hant/codes/rust/src/include/mod.rs create mode 100644 zh-hant/codes/rust/src/include/print_util.rs create mode 100644 zh-hant/codes/rust/src/include/tree_node.rs create mode 100644 zh-hant/codes/rust/src/include/vertex.rs create mode 100644 zh-hant/codes/rust/src/lib.rs diff --git a/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png index 33fca976ab7f3704de7bd37cfc08319341cd410b..a9db1579dde2da50a6b57e4bc2cfdef2d5466827 100644 GIT binary patch literal 13087 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 literal 13071 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 z贡献者 - + \ No newline at end of file diff --git a/en/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/en/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png index 6e942957ada76c5fbb8446d7940fd4d55a54c3d9..8481ea4eccb6b4655ce4e66fed53043ce788542d 100644 GIT binary patch literal 13263 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 literal 15075 zcmd6OcQ{;K*Y}wjJz6A^=t2-gNknue5hVoCdr1UA^xg+a5S{2fh#G|Gh7rB@-bU}e zm*G3^`+lGIdEe{${&@cQuIoG3aAwBd`|P#$TEF#MYi|K>d8=iqgEes*?tetLR# za&mHfc6@kxbaZ^Ycf5Cac({LXad2?3d%UxCw6%4(wQ;bqw|}&^x3{~yyS;O?w!gNr zx3amly|J;ezP`S)ak{d)w!FMNzdeuMnwi~1&uq@jtSyYJj0`Rh_Am7>E-sENq8Anx z=I6oJ{M`J)+}zyk+`{ba?9AL28jYTwS(urbnVy~=nnicab+pVhk4&sjO-)TsPEJfr zjE|3xjg5_rj*pCt3=a{M@^zolXbnro81E|0|Nscearp*{e69XsIj`< z-rkm;?Vg^V?(XhC?Q30KU7eks9UUF*?d@%CZLO`XEiEmmW^{9Nb5m1OV`F1OL&Kjx zf9mV&Q7BaPSXKE*dF4<=$x!j{!IGkZ!ovQ7{GPn*o~(?njPIRkRBv$M0ZvNAI>)6>(_($Z2= zQj(IA;P|Q#;L@_#6(3!MMg$OL_~y#hlhoQ zg@%TPgoFeK2L}ZOef|11ARxf|+oV(An7_ZjpP%2CFJC@=`sD5HjX)qgJw45QCJf!i zOgsnO+}vDUU0qyUoSd8-931TJ?d|OBY;0_-t*x!BtSl`pEi5cPe*9=|Zm#bgwv~=xA$eOTX_I z)#(+`=+V;B($v&cS65e4Q&Uw{eX7#^M5&AGO&5oJmx_vtl9H05qN0L=g1o%EoSfY2 z*RN$|Wo2Y!UcGuHEiEl2B_$~-DIp>8^5si$aq$-~UOa#P91e$ziHV7dii(Jc2n!1f z2?_n$&6@-OzT{UgpQ|{JZ%*B?k37Vj>{>YjQ(R^VCRzx!vy$zNjm-Alz>)Xgln zMJ|{|KEt<2Ydd!cd0?6>oBY({d@|zUwNL(kdcmX2RMC3ocIz1SB~4*Q!0b=lacCcG~WPOqRGEZzVbQ4Q~zdIdPIa z+Zmgxj!CIL8kn0yj;v`r#H^bO#aN6X-MmG%BtkdJ;z_4eQH zAu>4n^I5Lb$h-B8rvQ*EfM|OA!z%@+aJvGfo9E^jh=ClWLj<4;Bh$JbUW>d#a-=3P4dq=L6>5$X!t8LfvH zEEI5?hX{54q;bu29+Nb2cyn%887ItiUriYDv1li@2DOa?KMb72%~l6SR#io&8fj*M z0_`G$FYb~|*P|D*Miso6fCo7|psaZ0c8X;a7Y@7&=Z$W$ zdqd_mG>PmK4_(@u2q?ye|it#r9$O7ehD!e zBen&k!OgiO?Z)b5k9bHDBVyBmn1$9hw@dnmib_*lF$?F>VHUueU6SE!yXqlRVnVLlQxv zeiDVBbaZThW#n-gh8Zo`vLJeG15->(gLjjvdDh1{1|c;DvcG}xJiie^lZHpi?Sv)h z*T{DjhLv{5TF3UQ4`_X<;C0e;c4OM_AJtI+L!1qX7d7)^9Mx9E>gz`zbxgMLYEpFo zxzi)dF-l>QopI#R2cZ{P^`lO8hZ`XrEH_cZVy$S}d1l%8Ak6`tDN23{PGQqc! zYYPe5l@FWq60*XxEMj!-K6r)oW{QnrhNkx_X#Ne5h@W+`dBi{E1jzHOJ5D

}#HE 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 UU zHSq#WV;j4B4Udd|14}Exuk2=ip3R+aSOYVT#NS@tFaV8Jx=q^c@e4X8kh&^?)OATC z5R5j9y38&3Hdzcl+Cpt?v5cYNNZaG|hMQ3@mbK;}5T7D? zY_}fMt!Qw5;?IeWS{HQ?bWReG&d=H{Nx225p9PMDI490EF^BrAB1?()T&e{@lkn7Ic7C19o2SP4Q6;}$>UDgjg|Cy} z+~*A5*iMXGn*<8N)A`;@kbp9rUH-$F*>9)oW$yh&aV3T){Jzf6j;$Wky3HI-o#d^#!{l zAe-?r)b_)hK|qVkkC-MFma+X6OV8d<+x~Uo=<1c|+Pfw^G+B67Vieb@-Aka0ay9^> z2)lP!z{GOEuv*#%OCw>?HJZlD@;VC^h(7nmnz>Z80YoBKkAJrAGS)l!XzWk2#(q9{ z^lN#($VYZtb8Cmn)rsHliKF)Lp^!N4vt;%<{ho9AF#W1+tg-4x)crdN(s=Y?Z-Ac@ zPOHfttJFCgC!e}g+)GFHbx2iM+C1~k zNLFX{yW7=G^1#ogtD(pfkTHKPF$wUMUBlx9Lvllb*Fea)o$I;7NnO{u5O|hP7Pb04?}}mAw?c2mElB`kZ2qBUT{tDc6=UV6 z-}Ic6z71f|O9O^eXWfP|{Z+O>>EV6+wq}N4R2ITLBCX(M7SRfXw z2S0osZw3;3^h3OA0OAM*$^1u{uPy?}Ll|I_8jzFbgNISS^1NN4gF~KQ0R(twxNqPY zsm~IjL}BnfT+~pu5mmSUtKE}Q(^r@ON!c2%$#GuJxgS~MW!Lvn+Ov|~f&n^O zx$U18U8`2O?Ee-?B|&5mSwm@;0S&o*`#BN?)LE@kqKPD3oBJ{@Oq z_=a3ofhWCq2~P0u6B3m()WYq9Y$ieaYW7mvYH8kDejMxK48E|8L z?|5Tzl3c~a+Vi;nQkLTTS=P{Fsblz6t5J68s+Dt%a_jV)(N9af|l5 zI?zF)<1|_1%9ifpEO>Y^HPq|PW<^-X2n=Nu)SYK~US+C>=BRJUNWKKT)?VhPi{-tF zl*Q1bV-;1`#r1n{WN3x{T8%dP-Q7;{_`$na+DkPVqI=pb!qzYSefcJ<*G}yQ(Y0%4 z;7O=)!u2VSm7*;VT**o$QG|=9w&geA&dECKP-jY3{Nfm8E{-^69w#)I(7^nP=&ttV zg}*oBvnDQwf(oabaA2sQC)E>qKFOV7@{N5FHaeCvrDcAH32}NUd2`)HGP%x9gqQmX zA~&>PIn1~Z$8xjB_MeWNP6sR9Q&PcQ0k#r3OTM^Ig9r_%+}8O))_?-ZlmfopY9#oHQR23R-HSQ>FGs<(O-Y4-l=$_j+_GJD&D+= zIao_Od|h$jF>c?9r*HbyaWHc@_Wt1?<*k*vDhIBsQRdmVYrzykMG6W@NPlnNlHP<` zSV?t|8AVkfctp^#3v@j@9Vg)XZQNxU& zS|pR_CyRRcuZlS5iy6LDR;bTh8g?~XI-}8#RHmj4FD|L#KX2vcsXxQLlTDj`N)F-Y zT^r&!kF4rit2pM(TSxY1>&3mLdfIContributors - + \ No newline at end of file diff --git a/zh-hant/codes/c/chapter_searching/two_sum.c b/zh-hant/codes/c/chapter_searching/two_sum.c index 30f32dd9e9..b753b354a1 100644 --- a/zh-hant/codes/c/chapter_searching/two_sum.c +++ b/zh-hant/codes/c/chapter_searching/two_sum.c @@ -37,12 +37,12 @@ HashTable *find(HashTable *h, int key) { } /* 雜湊表元素插入 */ -void insert(HashTable *h, int key, int val) { - HashTable *t = find(h, key); +void insert(HashTable **h, int key, int val) { + HashTable *t = find(*h, key); if (t == NULL) { HashTable *tmp = malloc(sizeof(HashTable)); tmp->key = key, tmp->val = val; - HASH_ADD_INT(h, key, tmp); + HASH_ADD_INT(*h, key, tmp); } else { t->val = val; } @@ -59,7 +59,7 @@ int *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) { *returnSize = 2; return res; } - insert(hashtable, nums[i], i); + insert(&hashtable, nums[i], i); } *returnSize = 0; return NULL; @@ -83,4 +83,4 @@ int main() { printArray(res, returnSize); return 0; -} +} \ No newline at end of file diff --git a/zh-hant/codes/c/chapter_sorting/counting_sort.c b/zh-hant/codes/c/chapter_sorting/counting_sort.c index 3c887a9817..ba1759fabb 100644 --- a/zh-hant/codes/c/chapter_sorting/counting_sort.c +++ b/zh-hant/codes/c/chapter_sorting/counting_sort.c @@ -65,6 +65,7 @@ void countingSort(int nums[], int size) { // 使用結果陣列 res 覆蓋原陣列 nums memcpy(nums, res, size * sizeof(int)); // 5. 釋放記憶體 + free(res); free(counter); } diff --git a/zh-hant/codes/c/chapter_sorting/radix_sort.c b/zh-hant/codes/c/chapter_sorting/radix_sort.c index 6598dd0e7f..cdb7effb95 100644 --- a/zh-hant/codes/c/chapter_sorting/radix_sort.c +++ b/zh-hant/codes/c/chapter_sorting/radix_sort.c @@ -16,6 +16,7 @@ int digit(int num, int exp) { void countingSortDigit(int nums[], int size, int exp) { // 十進位制的位範圍為 0~9 ,因此需要長度為 10 的桶陣列 int *counter = (int *)malloc((sizeof(int) * 10)); + memset(counter, 0, sizeof(int) * 10); // 初始化為 0 以支持後續記憶體釋放 // 統計 0~9 各數字的出現次數 for (int i = 0; i < size; i++) { // 獲取 nums[i] 第 k 位,記為 d @@ -39,13 +40,16 @@ void countingSortDigit(int nums[], int size, int exp) { for (int i = 0; i < size; i++) { nums[i] = res[i]; } + // 釋放記憶體 + free(res); + free(counter); } /* 基數排序 */ void radixSort(int nums[], int size) { // 獲取陣列的最大元素,用於判斷最大位數 int max = INT32_MIN; - for (size_t i = 0; i < size - 1; i++) { + for (int i = 0; i < size; i++) { if (nums[i] > max) { max = nums[i]; } diff --git a/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs b/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs index c25f149d89..f3f77e09ca 100644 --- a/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs +++ b/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs @@ -105,7 +105,7 @@ public void Test() { // 暴力搜尋 int res = MinPathSumDFS(grid, n - 1, m - 1); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); // 記憶化搜尋 int[][] mem = new int[n][]; @@ -114,14 +114,14 @@ public void Test() { Array.Fill(mem[i], -1); } res = MinPathSumDFSMem(grid, mem, n - 1, m - 1); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); // 動態規劃 res = MinPathSumDP(grid); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); // 空間最佳化後的動態規劃 res = MinPathSumDPComp(grid); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); } } diff --git a/zh-hant/codes/csharp/chapter_heap/heap.cs b/zh-hant/codes/csharp/chapter_heap/heap.cs index ac8b34d543..71289029e1 100644 --- a/zh-hant/codes/csharp/chapter_heap/heap.cs +++ b/zh-hant/codes/csharp/chapter_heap/heap.cs @@ -24,8 +24,8 @@ public void Test() { /* 初始化堆積 */ // 初始化小頂堆積 PriorityQueue minHeap = new(); - // 初始化大頂堆積(使用 lambda 表示式修改 Comparator 即可) - PriorityQueue maxHeap = new(Comparer.Create((x, y) => y - x)); + // 初始化大頂堆積(使用 lambda 表示式修改 Comparer 即可) + PriorityQueue maxHeap = new(Comparer.Create((x, y) => y.CompareTo(x))); Console.WriteLine("以下測試樣例為大頂堆積"); /* 元素入堆積 */ diff --git a/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart b/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart index 4cf15a7548..6e897cb682 100644 --- a/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart +++ b/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart @@ -103,18 +103,18 @@ void main() { // 暴力搜尋 int res = minPathSumDFS(grid, n - 1, m - 1); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); // 記憶化搜尋 List> mem = List.generate(n, (i) => List.filled(m, -1)); res = minPathSumDFSMem(grid, mem, n - 1, m - 1); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); // 動態規劃 res = minPathSumDP(grid); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); // 空間最佳化後的動態規劃 res = minPathSumDPComp(grid); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); } diff --git a/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go b/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go index 9a57c6c31c..e8e8ce51a3 100644 --- a/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go +++ b/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go @@ -20,7 +20,7 @@ func TestMinPathSum(t *testing.T) { // 暴力搜尋 res := minPathSumDFS(grid, n-1, m-1) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) // 記憶化搜尋 mem := make([][]int, n) @@ -31,13 +31,13 @@ func TestMinPathSum(t *testing.T) { } } res = minPathSumDFSMem(grid, mem, n-1, m-1) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) // 動態規劃 res = minPathSumDP(grid) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) // 空間最佳化後的動態規劃 res = minPathSumDPComp(grid) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) } diff --git a/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py b/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py index 97d20e9d86..f202abcaea 100644 --- a/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py +++ b/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py @@ -88,17 +88,17 @@ def min_path_sum_dp_comp(grid: list[list[int]]) -> int: # 暴力搜尋 res = min_path_sum_dfs(grid, n - 1, m - 1) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") # 記憶化搜尋 mem = [[-1] * m for _ in range(n)] res = min_path_sum_dfs_mem(grid, mem, n - 1, m - 1) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") # 動態規劃 res = min_path_sum_dp(grid) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") # 空間最佳化後的動態規劃 res = min_path_sum_dp_comp(grid) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") diff --git a/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb b/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb index 32591613ef..141d1b92d0 100644 --- a/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb +++ b/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb @@ -76,18 +76,18 @@ def min_path_sum_dp_comp(grid) # 暴力搜尋 res = min_path_sum_dfs(grid, n - 1, m - 1) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" # 記憶化搜尋 mem = Array.new(n) { Array.new(m, - 1) } res = min_path_sum_dfs_mem(grid, mem, n - 1, m -1) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" # 動態規劃 res = min_path_sum_dp(grid) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" # 空間最佳化後的動態規劃 res = min_path_sum_dp_comp(grid) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" end diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs index f276b6d74d..1184dcfff1 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs @@ -4,8 +4,7 @@ * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use rand::Rng; /* 隨機訪問元素 */ diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs index d9020ed8c7..916cb51217 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs @@ -4,9 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::{print_util, ListNode}; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs index dd0d8706b2..e7ab8b05a3 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs @@ -3,8 +3,7 @@ * Created Time: 2023-01-18 * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ - -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* Driver Code */ fn main() { diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs index 04a8a6612d..8c6991d64b 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 串列類別 */ #[allow(dead_code)] diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs index 7e94e8c539..cae60f54d1 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪:例題一 */ fn pre_order(res: &mut Vec>>, root: Option<&Rc>>) { diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs index d709738a03..b627ebae25 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪:例題二 */ fn pre_order( diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs index f61b862889..9e449bdbbc 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪:例題三 */ fn pre_order( diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs index 8b7deff790..7a1663b7d2 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 判斷當前狀態是否為解 */ fn is_solution(state: &mut Vec>>) -> bool { diff --git a/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs b/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs index d542f2be2b..a21f08bdf5 100644 --- a/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs +++ b/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs @@ -4,13 +4,10 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::{print_util, ListNode, TreeNode}; use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; -use tree_node::TreeNode; /* 函式 */ fn function() -> i32 { diff --git a/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs b/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs index f54e7c7340..ab912d9ed1 100644 --- a/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs +++ b/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs @@ -4,8 +4,7 @@ * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use rand::seq::SliceRandom; use rand::thread_rng; diff --git a/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs b/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs index 96aa1c61bd..4bf9f73d8f 100644 --- a/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs +++ b/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs @@ -4,10 +4,9 @@ * Author: codingonion (coderonion@gmail.com) */ +use hello_algo_rust::include::{print_util, TreeNode}; use std::collections::HashMap; use std::{cell::RefCell, rc::Rc}; -include!("../include/include.rs"); -use tree_node::TreeNode; /* 構建二元樹:分治 */ fn dfs( diff --git a/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs b/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs index 07b02caa63..c06e5fae99 100644 --- a/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs +++ b/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/vertex.rs"); +pub use hello_algo_rust::include::{vals_to_vets, vets_to_vals, Vertex}; use std::collections::HashMap; diff --git a/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs b/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs index 47e327619b..f4dee23bde 100644 --- a/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs +++ b/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs @@ -4,9 +4,8 @@ * Author: WSL0809 (wslzzy@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::ListNode; -use crate::list_node::ListNode; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; diff --git a/zh-hant/codes/rust/chapter_hashing/hash_map.rs b/zh-hant/codes/rust/chapter_hashing/hash_map.rs index ad32c45ebe..330f66c8ca 100644 --- a/zh-hant/codes/rust/chapter_hashing/hash_map.rs +++ b/zh-hant/codes/rust/chapter_hashing/hash_map.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::collections::HashMap; diff --git a/zh-hant/codes/rust/chapter_heap/heap.rs b/zh-hant/codes/rust/chapter_heap/heap.rs index 979e83e146..1bf198ceaa 100644 --- a/zh-hant/codes/rust/chapter_heap/heap.rs +++ b/zh-hant/codes/rust/chapter_heap/heap.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::collections::BinaryHeap; diff --git a/zh-hant/codes/rust/chapter_heap/my_heap.rs b/zh-hant/codes/rust/chapter_heap/my_heap.rs index 7a3652a8df..493986a7ad 100644 --- a/zh-hant/codes/rust/chapter_heap/my_heap.rs +++ b/zh-hant/codes/rust/chapter_heap/my_heap.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 大頂堆積 */ struct MaxHeap { diff --git a/zh-hant/codes/rust/chapter_heap/top_k.rs b/zh-hant/codes/rust/chapter_heap/top_k.rs index d978b7c8a1..d16a3c28e8 100644 --- a/zh-hant/codes/rust/chapter_heap/top_k.rs +++ b/zh-hant/codes/rust/chapter_heap/top_k.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::cmp::Reverse; use std::collections::BinaryHeap; diff --git a/zh-hant/codes/rust/chapter_searching/hashing_search.rs b/zh-hant/codes/rust/chapter_searching/hashing_search.rs index 1f8e6ead4e..d2b94c7a93 100644 --- a/zh-hant/codes/rust/chapter_searching/hashing_search.rs +++ b/zh-hant/codes/rust/chapter_searching/hashing_search.rs @@ -4,9 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::ListNode; use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_searching/linear_search.rs b/zh-hant/codes/rust/chapter_searching/linear_search.rs index e731bf1d0a..1ef589cccf 100644 --- a/zh-hant/codes/rust/chapter_searching/linear_search.rs +++ b/zh-hant/codes/rust/chapter_searching/linear_search.rs @@ -4,9 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::ListNode; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_searching/two_sum.rs b/zh-hant/codes/rust/chapter_searching/two_sum.rs index 3cf044dbe1..5192d3accd 100644 --- a/zh-hant/codes/rust/chapter_searching/two_sum.rs +++ b/zh-hant/codes/rust/chapter_searching/two_sum.rs @@ -4,8 +4,7 @@ * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use std::collections::HashMap; /* 方法一:暴力列舉 */ diff --git a/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs b/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs index f68602589e..8a89023179 100644 --- a/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 泡沫排序 */ fn bubble_sort(nums: &mut [i32]) { diff --git a/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs b/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs index c85d64f87e..5efbebe1d5 100644 --- a/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 桶排序 */ fn bucket_sort(nums: &mut [f64]) { diff --git a/zh-hant/codes/rust/chapter_sorting/counting_sort.rs b/zh-hant/codes/rust/chapter_sorting/counting_sort.rs index e854b88bb2..eac4c3f6d9 100644 --- a/zh-hant/codes/rust/chapter_sorting/counting_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/counting_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 計數排序 */ // 簡單實現,無法用於排序物件 diff --git a/zh-hant/codes/rust/chapter_sorting/heap_sort.rs b/zh-hant/codes/rust/chapter_sorting/heap_sort.rs index 2d71c348c3..db1cbc95c6 100644 --- a/zh-hant/codes/rust/chapter_sorting/heap_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/heap_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 堆積的長度為 n ,從節點 i 開始,從頂至底堆積化 */ fn sift_down(nums: &mut [i32], n: usize, mut i: usize) { diff --git a/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs b/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs index a804c668a1..f99716f87f 100644 --- a/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs @@ -4,7 +4,7 @@ * Author: xBLACKICEx (xBLACKICEx@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 插入排序 */ fn insertion_sort(nums: &mut [i32]) { diff --git a/zh-hant/codes/rust/chapter_sorting/radix_sort.rs b/zh-hant/codes/rust/chapter_sorting/radix_sort.rs index d818a58f1b..b991e915fd 100644 --- a/zh-hant/codes/rust/chapter_sorting/radix_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/radix_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 獲取元素 num 的第 k 位,其中 exp = 10^(k-1) */ fn digit(num: i32, exp: i32) -> usize { diff --git a/zh-hant/codes/rust/chapter_sorting/selection_sort.rs b/zh-hant/codes/rust/chapter_sorting/selection_sort.rs index 70f51dce00..9c47336a71 100644 --- a/zh-hant/codes/rust/chapter_sorting/selection_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/selection_sort.rs @@ -4,7 +4,7 @@ * Author: WSL0809 (wslzzy@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 選擇排序 */ fn selection_sort(nums: &mut [i32]) { diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs b/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs index f9308ea7d4..5dbe16ef15 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs @@ -3,9 +3,7 @@ * Created Time: 2023-03-11 * Author: codingonion (coderonion@gmail.com) */ - -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; /* 基於環形陣列實現的雙向佇列 */ struct ArrayDeque { nums: Vec, // 用於儲存雙向佇列元素的陣列 diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs b/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs index 8eaa0117ef..6a850f8c77 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs @@ -4,7 +4,7 @@ * Author: WSL0809 (wslzzy@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 基於陣列實現的堆疊 */ struct ArrayStack { diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs b/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs index 287808cc13..e5ad4abe1c 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs @@ -4,8 +4,7 @@ * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use std::collections::VecDeque; /* Driver Code */ diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs index 93e288531b..bbc7a5588b 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs index d123290028..4e114e70de 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs @@ -4,9 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, ListNode}; -use list_node::ListNode; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs index d5ca545baf..ac07580fb6 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs @@ -4,9 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, ListNode}; -use list_node::ListNode; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs b/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs index 10e0d1b59d..2605a41113 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::collections::VecDeque; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs b/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs index cc871dbdd2..83f895c715 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* Driver Code */ pub fn main() { diff --git a/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs b/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs index 2a60242a3a..a7f32721df 100644 --- a/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, tree_node}; /* 陣列表示下的二元樹類別 */ struct ArrayBinaryTree { @@ -49,18 +49,11 @@ impl ArrayBinaryTree { /* 層序走訪 */ fn level_order(&self) -> Vec { - let mut res = vec![]; - // 直接走訪陣列 - for i in 0..self.size() { - if let Some(val) = self.val(i) { - res.push(val) - } - } - res + self.tree.iter().filter_map(|&x| x).collect() } /* 深度優先走訪 */ - fn dfs(&self, i: i32, order: &str, res: &mut Vec) { + fn dfs(&self, i: i32, order: &'static str, res: &mut Vec) { if self.val(i).is_none() { return; } diff --git a/zh-hant/codes/rust/chapter_tree/avl_tree.rs b/zh-hant/codes/rust/chapter_tree/avl_tree.rs index c414a06e4f..eb48530cf7 100644 --- a/zh-hant/codes/rust/chapter_tree/avl_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/avl_tree.rs @@ -4,12 +4,11 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, TreeNode}; use std::cell::RefCell; use std::cmp::Ordering; use std::rc::Rc; -use tree_node::TreeNode; type OptionTreeNodeRc = Option>>; diff --git a/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs b/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs index 99bf6ae61f..1186f6bca6 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs @@ -4,13 +4,13 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com)、night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::cell::RefCell; use std::cmp::Ordering; use std::rc::Rc; -use tree_node::TreeNode; +use hello_algo_rust::include::TreeNode; type OptionTreeNodeRc = Option>>; @@ -126,7 +126,7 @@ impl BinarySearchTree { // 刪除節點 cur if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) { let left = pre.borrow().left.clone(); - if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) { + if left.is_some() && Rc::ptr_eq(left.as_ref().unwrap(), &cur) { pre.borrow_mut().left = child; } else { pre.borrow_mut().right = child; @@ -147,11 +147,11 @@ impl BinarySearchTree { break; } } - let tmpval = tmp.unwrap().borrow().val; + let tmp_val = tmp.unwrap().borrow().val; // 遞迴刪除節點 tmp - self.remove(tmpval); + self.remove(tmp_val); // 用 tmp 覆蓋 cur - cur.borrow_mut().val = tmpval; + cur.borrow_mut().val = tmp_val; } } } diff --git a/zh-hant/codes/rust/chapter_tree/binary_tree.rs b/zh-hant/codes/rust/chapter_tree/binary_tree.rs index f87b7f891e..22da1089a1 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_tree.rs @@ -4,8 +4,7 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com) */ use std::rc::Rc; -include!("../include/include.rs"); -use tree_node::TreeNode; +use hello_algo_rust::include::{print_util, TreeNode}; /* Driver Code */ fn main() { diff --git a/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs b/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs index 01a19adfd3..20ef8b0058 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs @@ -4,11 +4,11 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use hello_algo_rust::op_vec; use std::collections::VecDeque; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 層序走訪 */ fn level_order(root: &Rc>) -> Vec { diff --git a/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs b/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs index dc0c005640..35f236d0ac 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs @@ -4,22 +4,27 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use hello_algo_rust::op_vec; use std::cell::RefCell; use std::rc::Rc; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪 */ fn pre_order(root: Option<&Rc>>) -> Vec { let mut result = vec![]; - if let Some(node) = root { - // 訪問優先順序:根節點 -> 左子樹 -> 右子樹 - result.push(node.borrow().val); - result.extend(pre_order(node.borrow().left.as_ref())); - result.extend(pre_order(node.borrow().right.as_ref())); + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // 訪問優先順序:根節點 -> 左子樹 -> 右子樹 + let node = node.borrow(); + res.push(node.val); + dfs(node.left.as_ref(), res); + dfs(node.right.as_ref(), res); + } } + dfs(root, &mut result); + result } @@ -27,12 +32,17 @@ fn pre_order(root: Option<&Rc>>) -> Vec { fn in_order(root: Option<&Rc>>) -> Vec { let mut result = vec![]; - if let Some(node) = root { - // 訪問優先順序:左子樹 -> 根節點 -> 右子樹 - result.extend(in_order(node.borrow().left.as_ref())); - result.push(node.borrow().val); - result.extend(in_order(node.borrow().right.as_ref())); + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // 訪問優先順序:左子樹 -> 根節點 -> 右子樹 + let node = node.borrow(); + dfs(node.left.as_ref(), res); + res.push(node.val); + dfs(node.right.as_ref(), res); + } } + dfs(root, &mut result); + result } @@ -40,12 +50,18 @@ fn in_order(root: Option<&Rc>>) -> Vec { fn post_order(root: Option<&Rc>>) -> Vec { let mut result = vec![]; - if let Some(node) = root { - // 訪問優先順序:左子樹 -> 右子樹 -> 根節點 - result.extend(post_order(node.borrow().left.as_ref())); - result.extend(post_order(node.borrow().right.as_ref())); - result.push(node.borrow().val); + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // 訪問優先順序:左子樹 -> 右子樹 -> 根節點 + let node = node.borrow(); + dfs(node.left.as_ref(), res); + dfs(node.right.as_ref(), res); + res.push(node.val); + } } + + dfs(root, &mut result); + result } diff --git a/zh-hant/codes/rust/src/include/list_node.rs b/zh-hant/codes/rust/src/include/list_node.rs new file mode 100644 index 0000000000..941e334c3d --- /dev/null +++ b/zh-hant/codes/rust/src/include/list_node.rs @@ -0,0 +1,57 @@ +/* + * File: list_node.rs + * Created Time: 2023-03-05 + * Author: codingonion (coderonion@gmail.com), rongyi (hiarongyi@gmail.com) + */ + +use std::cell::RefCell; +use std::collections::HashMap; +use std::rc::Rc; + +#[derive(Debug)] +pub struct ListNode { + pub val: T, + pub next: Option>>>, +} + +impl ListNode { + pub fn new(val: T) -> Rc>> { + Rc::new(RefCell::new(ListNode { val, next: None })) + } + + /* 將陣列反序列化為鏈結串列 */ + pub fn arr_to_linked_list(array: &[T]) -> Option>>> + where + T: Copy + Clone, + { + let mut head = None; + // insert in reverse order + for item in array.iter().rev() { + let node = Rc::new(RefCell::new(ListNode { + val: *item, + next: head.take(), + })); + head = Some(node); + } + head + } + + /* 將鏈結串列轉化為雜湊表 */ + pub fn linked_list_to_hashmap( + linked_list: Option>>>, + ) -> HashMap>>> + where + T: std::hash::Hash + Eq + Copy + Clone, + { + let mut hashmap = HashMap::new(); + let mut node = linked_list; + + while let Some(cur) = node { + let borrow = cur.borrow(); + hashmap.insert(borrow.val.clone(), cur.clone()); + node = borrow.next.clone(); + } + + hashmap + } +} diff --git a/zh-hant/codes/rust/src/include/mod.rs b/zh-hant/codes/rust/src/include/mod.rs new file mode 100644 index 0000000000..6cba6f9a52 --- /dev/null +++ b/zh-hant/codes/rust/src/include/mod.rs @@ -0,0 +1,16 @@ +/* + * File: include.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICE@outlook.com) + */ + +pub mod list_node; +pub mod print_util; +pub mod tree_node; +pub mod vertex; + +// rexport to include +pub use list_node::*; +pub use print_util::*; +pub use tree_node::*; +pub use vertex::*; diff --git a/zh-hant/codes/rust/src/include/print_util.rs b/zh-hant/codes/rust/src/include/print_util.rs new file mode 100644 index 0000000000..fd93f36264 --- /dev/null +++ b/zh-hant/codes/rust/src/include/print_util.rs @@ -0,0 +1,103 @@ +/* + * File: print_util.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) + */ + +use std::cell::{Cell, RefCell}; +use std::fmt::Display; +use std::collections::{HashMap, VecDeque}; +use std::rc::Rc; + +use super::list_node::ListNode; +use super::tree_node::{TreeNode, vec_to_tree}; + +struct Trunk<'a, 'b> { + prev: Option<&'a Trunk<'a, 'b>>, + str: Cell<&'b str>, +} + +/* 列印陣列 */ +pub fn print_array(nums: &[T]) { + print!("["); + if nums.len() > 0 { + for (i, num) in nums.iter().enumerate() { + print!("{}{}", num, if i == nums.len() - 1 {"]"} else {", "} ); + } + } else { + print!("]"); + } +} + +/* 列印雜湊表 */ +pub fn print_hash_map(map: &HashMap) { + for (key, value) in map { + println!("{key} -> {value}"); + } +} + +/* 列印佇列(雙向佇列) */ +pub fn print_queue(queue: &VecDeque) { + print!("["); + let iter = queue.iter(); + for (i, data) in iter.enumerate() { + print!("{}{}", data, if i == queue.len() - 1 {"]"} else {", "} ); + } +} + +/* 列印鏈結串列 */ +pub fn print_linked_list(head: &Rc>>) { + print!("{}{}", head.borrow().val, if head.borrow().next.is_none() {"\n"} else {" -> "}); + if let Some(node) = &head.borrow().next { + return print_linked_list(node); + } +} + +/* 列印二元樹 */ +pub fn print_tree(root: &Rc>) { + _print_tree(Some(root), None, false); +} + +/* 列印二元樹 */ +fn _print_tree(root: Option<&Rc>>, prev: Option<&Trunk>, is_right: bool) { + if let Some(node) = root { + let mut prev_str = " "; + let trunk = Trunk { prev, str: Cell::new(prev_str) }; + _print_tree(node.borrow().right.as_ref(), Some(&trunk), true); + + if prev.is_none() { + trunk.str.set("———"); + } else if is_right { + trunk.str.set("/———"); + prev_str = " |"; + } else { + trunk.str.set("\\———"); + prev.as_ref().unwrap().str.set(prev_str); + } + + show_trunks(Some(&trunk)); + println!(" {}", node.borrow().val); + if let Some(prev) = prev { + prev.str.set(prev_str); + } + trunk.str.set(" |"); + + _print_tree(node.borrow().left.as_ref(), Some(&trunk), false); + } +} + +fn show_trunks(trunk: Option<&Trunk>) { + if let Some(trunk) = trunk { + show_trunks(trunk.prev); + print!("{}", trunk.str.get()); + } +} + +/* 列印堆積 */ +pub fn print_heap(heap: Vec) { + println!("堆積的陣列表示:{:?}", heap); + println!("堆積的樹狀表示:"); + if let Some(root) = vec_to_tree(heap.into_iter().map(|val| Some(val)).collect()) { + print_tree(&root); + } +} diff --git a/zh-hant/codes/rust/src/include/tree_node.rs b/zh-hant/codes/rust/src/include/tree_node.rs new file mode 100644 index 0000000000..514491862a --- /dev/null +++ b/zh-hant/codes/rust/src/include/tree_node.rs @@ -0,0 +1,92 @@ +/* + * File: tree_node.rs + * Created Time: 2023-02-27 + * Author: xBLACKICEx (xBLACKICE@outlook.com), night-cruise (2586447362@qq.com) + */ + +use std::cell::RefCell; +use std::rc::Rc; + +/* 二元樹節點型別 */ +#[derive(Debug)] +pub struct TreeNode { + pub val: i32, + pub height: i32, + pub parent: Option>>, + pub left: Option>>, + pub right: Option>>, +} + +impl TreeNode { + /* 建構子 */ + pub fn new(val: i32) -> Rc> { + Rc::new(RefCell::new(Self { + val, + height: 0, + parent: None, + left: None, + right: None, + })) + } +} + +#[macro_export] +macro_rules! op_vec { + ( $( $x:expr ),* ) => { + vec![ + $( Option::from($x).map(|x| x) ),* + ] + }; +} + +// 序列化編碼規則請參考: +// https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ +// 二元樹的陣列表示: +// [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] +// 二元樹的鏈結串列表示: +// /——— 15 +// /——— 7 +// /——— 3 +// | \——— 6 +// | \——— 12 +// ——— 1 +// \——— 2 +// | /——— 9 +// \——— 4 +// \——— 8 + +/* 將串列反序列化為二元樹:遞迴 */ +fn vec_to_tree_dfs(arr: &[Option], i: usize) -> Option>> { + if i >= arr.len() || arr[i].is_none() { + return None; + } + let root = TreeNode::new(arr[i].unwrap()); + root.borrow_mut().left = vec_to_tree_dfs(arr, 2 * i + 1); + root.borrow_mut().right = vec_to_tree_dfs(arr, 2 * i + 2); + Some(root) +} + +/* 將串列反序列化為二元樹 */ +pub fn vec_to_tree(arr: Vec>) -> Option>> { + vec_to_tree_dfs(&arr, 0) +} + +/* 將二元樹序列化為串列:遞迴 */ +fn tree_to_vec_dfs(root: Option<&Rc>>, i: usize, res: &mut Vec>) { + if let Some(root) = root { + // i + 1 is the minimum valid size to access index i + while res.len() < i + 1 { + res.push(None); + } + res[i] = Some(root.borrow().val); + tree_to_vec_dfs(root.borrow().left.as_ref(), 2 * i + 1, res); + tree_to_vec_dfs(root.borrow().right.as_ref(), 2 * i + 2, res); + } +} + +/* 將二元樹序列化為串列 */ +pub fn tree_to_vec(root: Option>>) -> Vec> { + let mut res = vec![]; + tree_to_vec_dfs(root.as_ref(), 0, &mut res); + res +} diff --git a/zh-hant/codes/rust/src/include/vertex.rs b/zh-hant/codes/rust/src/include/vertex.rs new file mode 100644 index 0000000000..6d9b5e5508 --- /dev/null +++ b/zh-hant/codes/rust/src/include/vertex.rs @@ -0,0 +1,21 @@ +/* + * File: vertex.rs + * Created Time: 2023-07-13 + * Author: night-cruise (2586447362@qq.com) + */ + +/* 頂點型別 */ +#[derive(Copy, Clone, Hash, PartialEq, Eq)] +pub struct Vertex { + pub val: i32, +} + +/* 輸入值串列 vals ,返回頂點串列 vets */ +pub fn vals_to_vets(vals: Vec) -> Vec { + vals.into_iter().map(|val| Vertex { val }).collect() +} + +/* 輸入頂點串列 vets ,返回值串列 vals */ +pub fn vets_to_vals(vets: Vec) -> Vec { + vets.into_iter().map(|vet| vet.val).collect() +} diff --git a/zh-hant/codes/rust/src/lib.rs b/zh-hant/codes/rust/src/lib.rs new file mode 100644 index 0000000000..2883b91047 --- /dev/null +++ b/zh-hant/codes/rust/src/lib.rs @@ -0,0 +1 @@ +pub mod include; diff --git a/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift b/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift index f2621f089c..ca3048e04e 100644 --- a/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift +++ b/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift @@ -105,19 +105,19 @@ enum MinPathSum { // 暴力搜尋 var res = minPathSumDFS(grid: grid, i: n - 1, j: m - 1) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") // 記憶化搜尋 var mem = Array(repeating: Array(repeating: -1, count: m), count: n) res = minPathSumDFSMem(grid: grid, mem: &mem, i: n - 1, j: m - 1) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") // 動態規劃 res = minPathSumDP(grid: grid) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") // 空間最佳化後的動態規劃 res = minPathSumDPComp(grid: grid) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") } } diff --git a/zh-hant/docs/chapter_heap/heap.md b/zh-hant/docs/chapter_heap/heap.md index 7d04a45d35..00a321b4f3 100644 --- a/zh-hant/docs/chapter_heap/heap.md +++ b/zh-hant/docs/chapter_heap/heap.md @@ -157,8 +157,8 @@ /* 初始化堆積 */ // 初始化小頂堆積 PriorityQueue minHeap = new(); - // 初始化大頂堆積(使用 lambda 表示式修改 Comparator 即可) - PriorityQueue maxHeap = new(Comparer.Create((x, y) => y - x)); + // 初始化大頂堆積(使用 lambda 表示式修改 Comparer 即可) + PriorityQueue maxHeap = new(Comparer.Create((x, y) => y.CompareTo(x))); /* 元素入堆積 */ maxHeap.Enqueue(1, 1); diff --git a/zh-hant/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/zh-hant/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png index 74017260e84ab9fb7017d81eb3dc989457b5d253..985012db71e3e7463968e3396d6e89ee0cc3f58a 100644 GIT binary patch literal 13209 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 literal 14870 zcmd731yCGc*FM-YxD!KyhJ=tHfk1+55+Fen+$CsmcNqd9xCV!T;0}S{HVN*|;DdYc z!5Oymd*AQf|9-o*RbSQqtF~)uW~%4j+kJ1J^PKZM_e}761!)q(`-A`hki2{QMhO6L zz^~9Dd@S(eEQ`Y!0I-1faw?KHH#Zmz<{EPi9#>bGtE;Pvt4r`W2VdtGCl@EDXV+(E zXQ!v9Xz+zTIX*rGyVT#`-`CgI+uPgI)6?DE-PP6A z+1c6A(b3-C-qzOEI`(?&?0@2da(%jr!*Sg-+)YRD6*wE1M z6Y;0Cxj&&jKBhG~yd^BSDdfPceh{|3L5`r^;^ezmo=H8nNW)zwv1RX>0JEUaEF z{LxoYQSsx)kMi>J%+mR?va-~om6DQ@;^N|>qN2jW!h(W={QUgH+}XUmyxiQ}?Ck8U ztgP?fzo)0C!{P9>w6v6zl;q^(#KgpegoK#9>8Ol_kW`dwiHmNkj%t!hTwL6@Z{K2L zW22*^KgTcl#>~5iPe(;XMMg$OL_~y#hlhrShJ=I!2M2%s`ZX{x@XMDk0RaL2{{DV` zelQr!*VorEXwoKN#sY@4^DZ}VoAC1T^7Qm{b8~Zcb~bV-addRFx3{;mv$M6ewXw0W zwzjskwEXnxlexLMnVFfXsi~2X(Z`P;4Gj$q3=H)3^>uZ1b#!#JwY9ahv@|s}H8eET z)zuX&Mx~8LM0JLE)dtkm)KpbfRa8{CmHN5f_diqYS5{V5Qd0Wx;lum)?-dmlITZR8 z6cps;{fo#6A;iroPKlKa4I@z zW;!5X8Yr-St+g#^mR@-(Fxq$CNf) z?ghK6&F;8w4#mtHj7^^1i2H|UO}`lM#HT!-a&qofzNNev)y+Z6#3$QQ6s}yiCTlQP z7#*;*gcL87VJ+MzT0qmyi&a;vU`?X)yVT)8waCHGi<&K^=!+|N;M?4p>)HM|t2SOB z8NnYOfBqpvofucmjO@rfLS>D6p>=n9A7x~pACx|_6 z)Tqbr-F&nDfzMiloS^2WN56 zG21n@q96w5CorQo_xCBG?@g20b@F*!>=u82X+G%V$Do0VX$?bdc0km6L~D)HO{Jm~w}D;M3wl%udZxc!bW zo6k{S$L3*)8rC8Mx_0s{f3{SQe6eav)vvO<3utAVx!(i^g{-UX>u1ZrlTM(ps+qLa zaXl#oBMi~WTJL^I+!RZ6JNETXo=9GRDWq24Q6fX~AWu!timZRt=NG(Txal-aIO`Eo( zJUPpoW=np7zWn4bE*JB`Bg3cUniQy

MK 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 diff --git a/zh-hant/docs/chapter_tree/avl_tree.md b/zh-hant/docs/chapter_tree/avl_tree.md index 38da5155b3..1a2c0a93d8 100644 --- a/zh-hant/docs/chapter_tree/avl_tree.md +++ b/zh-hant/docs/chapter_tree/avl_tree.md @@ -180,7 +180,7 @@ AVL 樹既是二元搜尋樹,也是平衡二元樹,同時滿足這兩類二 ```c title="" /* AVL 樹節點結構體 */ - TreeNode struct TreeNode { + typedef struct TreeNode { int val; int height; struct TreeNode *left; diff --git a/zh-hant/docs/index.html b/zh-hant/docs/index.html index 681f66b538..10919b59f4 100644 --- a/zh-hant/docs/index.html +++ b/zh-hant/docs/index.html @@ -372,4 +372,4 @@

貢獻者

- + \ No newline at end of file