From 6c313b143645e5cca2b9ab7a99cab2fe9542c3a3 Mon Sep 17 00:00:00 2001 From: krahets Date: Fri, 31 May 2024 17:45:23 +0800 Subject: [PATCH] deploy --- chapter_stack_and_queue/deque/index.html | 88 ++++++++++-------- chapter_stack_and_queue/queue/index.html | 50 +++++----- .../backtrack_remove_return_or_not.png | Bin 38502 -> 37306 bytes .../preorder_find_paths_step1.png | Bin 18342 -> 18355 bytes .../preorder_find_paths_step10.png | Bin 30995 -> 30995 bytes .../preorder_find_paths_step11.png | Bin 30028 -> 29489 bytes .../preorder_find_paths_step2.png | Bin 22379 -> 22379 bytes .../preorder_find_paths_step3.png | Bin 21957 -> 21897 bytes .../preorder_find_paths_step4.png | Bin 22156 -> 22156 bytes .../preorder_find_paths_step5.png | Bin 23751 -> 23658 bytes .../preorder_find_paths_step7.png | Bin 25291 -> 25291 bytes .../preorder_find_paths_step8.png | Bin 27100 -> 26815 bytes .../preorder_find_paths_step9.png | Bin 26859 -> 26863 bytes .../n_queens_constraints.png | Bin 29037 -> 28721 bytes .../permutations_i_pruning.png | Bin 28974 -> 29083 bytes .../permutations_ii.png | Bin 21819 -> 21902 bytes .../permutations_ii_pruning.png | Bin 26870 -> 26925 bytes .../subset_sum_i.png | Bin 41829 -> 42245 bytes .../subset_sum_i_pruning.png | Bin 35367 -> 35334 bytes .../subset_sum_ii.png | Bin 40414 -> 41315 bytes .../hanota_problem.assets/hanota_f3_step1.png | Bin 11955 -> 11392 bytes .../climbing_stairs_constraint_example.png | Bin 23844 -> 23540 bytes .../min_cost_cs_example.png | Bin 21017 -> 21113 bytes .../min_path_sum_dp_step1.png | Bin 12721 -> 12746 bytes .../min_path_sum_dp_step12.png | Bin 14039 -> 14054 bytes .../min_path_sum_solution_initial_state.png | Bin 25414 -> 25756 bytes ...min_path_sum_solution_state_definition.png | Bin 26754 -> 27213 bytes .../edit_distance_dp_step2.png | Bin 13786 -> 14017 bytes .../climbing_stairs_dfs_memo_tree.png | Bin 27030 -> 27164 bytes .../climbing_stairs_dfs_tree.png | Bin 24961 -> 25070 bytes .../climbing_stairs_dp.png | Bin 20267 -> 20459 bytes .../climbing_stairs_example.png | Bin 17162 -> 17498 bytes .../knapsack_problem.assets/knapsack_dfs.png | Bin 37814 -> 38014 bytes .../knapsack_dfs_mem.png | Bin 38488 -> 38862 bytes .../knapsack_dp_step14.png | Bin 18545 -> 18450 bytes .../coin_change_dp_step2.png | Bin 20905 -> 21183 bytes .../coin_change_example.png | Bin 16602 -> 16605 bytes .../adjacency_list_step1_initialization.png | Bin 23416 -> 23517 bytes .../adjacency_list_step2_add_edge.png | Bin 24982 -> 25076 bytes .../adjacency_list_step3_remove_edge.png | Bin 24286 -> 24398 bytes .../adjacency_list_step4_add_vertex.png | Bin 25248 -> 25364 bytes .../adjacency_list_step5_remove_vertex.png | Bin 22714 -> 22820 bytes .../adjacency_matrix_step1_initialization.png | Bin 20850 -> 20746 bytes .../adjacency_matrix_step2_add_edge.png | Bin 21737 -> 21584 bytes .../adjacency_matrix_step3_remove_edge.png | Bin 22075 -> 21921 bytes .../adjacency_matrix_step4_add_vertex.png | Bin 25088 -> 24916 bytes .../adjacency_matrix_step5_remove_vertex.png | Bin 21546 -> 21398 bytes .../fractional_knapsack_example.png | Bin 28629 -> 28656 bytes .../coin_change_greedy_strategy.png | Bin 35485 -> 34652 bytes .../coin_change_greedy_vs_dp.png | Bin 21495 -> 21344 bytes .../max_capacity_moving_long_board.png | Bin 17780 -> 17782 bytes .../max_capacity_moving_short_board.png | Bin 17468 -> 17507 bytes .../max_product_cutting_greedy_infer1.png | Bin 11866 -> 12170 bytes .../hash_map.assets/hash_table_reshash.png | Bin 28995 -> 29007 bytes .../heapify_operations_count.png | Bin 19890 -> 20426 bytes .../top_k.assets/top_k_heap_step1.png | Bin 16418 -> 16316 bytes .../top_k.assets/top_k_heap_step2.png | Bin 17869 -> 17748 bytes .../top_k.assets/top_k_heap_step3.png | Bin 19142 -> 19041 bytes .../top_k.assets/top_k_heap_step4.png | Bin 23808 -> 23701 bytes .../top_k.assets/top_k_heap_step5.png | Bin 25233 -> 25185 bytes .../top_k.assets/top_k_heap_step6.png | Bin 28463 -> 28243 bytes .../top_k.assets/top_k_heap_step7.png | Bin 23937 -> 23832 bytes .../top_k.assets/top_k_heap_step8.png | Bin 24532 -> 24441 bytes .../top_k.assets/top_k_traversal.png | Bin 21816 -> 22583 bytes .../binary_search_insertion_naive.png | Bin 13348 -> 14062 bytes .../two_sum_brute_force.png | Bin 15124 -> 15075 bytes .../bubble_sort_overview.png | Bin 34436 -> 34384 bytes .../heap_sort.assets/heap_sort_step1.png | Bin 18818 -> 19068 bytes .../heap_sort.assets/heap_sort_step10.png | Bin 19923 -> 20192 bytes .../heap_sort.assets/heap_sort_step11.png | Bin 21531 -> 21790 bytes .../heap_sort.assets/heap_sort_step12.png | Bin 22940 -> 23200 bytes .../heap_sort.assets/heap_sort_step2.png | Bin 22847 -> 23116 bytes .../heap_sort.assets/heap_sort_step3.png | Bin 24549 -> 24819 bytes .../heap_sort.assets/heap_sort_step4.png | Bin 22533 -> 22808 bytes .../heap_sort.assets/heap_sort_step5.png | Bin 24507 -> 24751 bytes .../heap_sort.assets/heap_sort_step6.png | Bin 21475 -> 21749 bytes .../heap_sort.assets/heap_sort_step7.png | Bin 23573 -> 23816 bytes .../heap_sort.assets/heap_sort_step8.png | Bin 20760 -> 21043 bytes .../heap_sort.assets/heap_sort_step9.png | Bin 22903 -> 23155 bytes .../insertion_operation.png | Bin 27556 -> 28108 bytes .../pivot_division_step4.png | Bin 31418 -> 31470 bytes .../pivot_division_step8.png | Bin 31620 -> 31675 bytes .../selection_sort_step11.png | Bin 10869 -> 10744 bytes .../selection_sort_step8.png | Bin 18208 -> 18196 bytes ...vltree_degradation_from_inserting_node.png | Bin 18493 -> 18783 bytes ...avltree_degradation_from_removing_node.png | Bin 18984 -> 18633 bytes .../avltree_right_rotate_step3.png | Bin 19373 -> 19237 bytes .../avltree_right_rotate_step4.png | Bin 23761 -> 23725 bytes .../avltree_rotation_cases.png | Bin 23631 -> 24063 bytes .../bst_degradation.png | Bin 19516 -> 19981 bytes .../bst_inorder_traversal.png | Bin 35151 -> 35107 bytes .../binary_search_tree.assets/bst_insert.png | Bin 26525 -> 26894 bytes .../bst_remove_case1.png | Bin 27901 -> 28023 bytes .../bst_remove_case2.png | Bin 28338 -> 28433 bytes .../bst_remove_case3_step1.png | Bin 17379 -> 17481 bytes .../bst_remove_case3_step2.png | Bin 27783 -> 27878 bytes .../bst_remove_case3_step3.png | Bin 28980 -> 29060 bytes .../bst_remove_case3_step4.png | Bin 31524 -> 31754 bytes en/index.html | 13 +++ en/sitemap.xml.gz | Bin 1008 -> 1008 bytes search/search_index.json | 2 +- sitemap.xml.gz | Bin 1011 -> 1011 bytes zh-hant/index.html | 26 ++++++ zh-hant/sitemap.xml.gz | Bin 1011 -> 1011 bytes 104 files changed, 114 insertions(+), 65 deletions(-) diff --git a/chapter_stack_and_queue/deque/index.html b/chapter_stack_and_queue/deque/index.html index 4d2933845..fa7f9bf74 100644 --- a/chapter_stack_and_queue/deque/index.html +++ b/chapter_stack_and_queue/deque/index.html @@ -6523,47 +6523,53 @@ /* 队首出队 */ func (q *arrayDeque) popFirst() any { num := q.peekFirst() - // 队首指针向后移动一位 - q.front = q.index(q.front + 1) - q.queSize-- - return num -} - -/* 队尾出队 */ -func (q *arrayDeque) popLast() any { - num := q.peekLast() - q.queSize-- - return num -} - -/* 访问队首元素 */ -func (q *arrayDeque) peekFirst() any { - if q.isEmpty() { - return nil - } - return q.nums[q.front] -} - -/* 访问队尾元素 */ -func (q *arrayDeque) peekLast() any { - if q.isEmpty() { - return nil - } - // 计算尾元素索引 - last := q.index(q.front + q.queSize - 1) - return q.nums[last] -} - -/* 获取 Slice 用于打印 */ -func (q *arrayDeque) toSlice() []int { - // 仅转换有效长度范围内的列表元素 - res := make([]int, q.queSize) - for i, j := 0, q.front; i < q.queSize; i++ { - res[i] = q.nums[q.index(j)] - j++ - } - return res -} + if num == nil { + return nil + } + // 队首指针向后移动一位 + q.front = q.index(q.front + 1) + q.queSize-- + return num +} + +/* 队尾出队 */ +func (q *arrayDeque) popLast() any { + num := q.peekLast() + if num == nil { + return nil + } + q.queSize-- + return num +} + +/* 访问队首元素 */ +func (q *arrayDeque) peekFirst() any { + if q.isEmpty() { + return nil + } + return q.nums[q.front] +} + +/* 访问队尾元素 */ +func (q *arrayDeque) peekLast() any { + if q.isEmpty() { + return nil + } + // 计算尾元素索引 + last := q.index(q.front + q.queSize - 1) + return q.nums[last] +} + +/* 获取 Slice 用于打印 */ +func (q *arrayDeque) toSlice() []int { + // 仅转换有效长度范围内的列表元素 + res := make([]int, q.queSize) + for i, j := 0, q.front; i < q.queSize; i++ { + res[i] = q.nums[q.index(j)] + j++ + } + return res +}
diff --git a/chapter_stack_and_queue/queue/index.html b/chapter_stack_and_queue/queue/index.html index 1d969d131..39fa6eb22 100644 --- a/chapter_stack_and_queue/queue/index.html +++ b/chapter_stack_and_queue/queue/index.html @@ -5441,29 +5441,33 @@ /* 出队 */ func (q *arrayQueue) pop() any { num := q.peek() - // 队首指针向后移动一位,若越过尾部,则返回到数组头部 - q.front = (q.front + 1) % q.queCapacity - q.queSize-- - return num -} - -/* 访问队首元素 */ -func (q *arrayQueue) peek() any { - if q.isEmpty() { - return nil - } - return q.nums[q.front] -} - -/* 获取 Slice 用于打印 */ -func (q *arrayQueue) toSlice() []int { - rear := (q.front + q.queSize) - if rear >= q.queCapacity { - rear %= q.queCapacity - return append(q.nums[q.front:], q.nums[:rear]...) - } - return q.nums[q.front:rear] -} + if num == nil { + return nil + } + + // 队首指针向后移动一位,若越过尾部,则返回到数组头部 + q.front = (q.front + 1) % q.queCapacity + q.queSize-- + return num +} + +/* 访问队首元素 */ +func (q *arrayQueue) peek() any { + if q.isEmpty() { + return nil + } + return q.nums[q.front] +} + +/* 获取 Slice 用于打印 */ +func (q *arrayQueue) toSlice() []int { + rear := (q.front + q.queSize) + if rear >= q.queCapacity { + rear %= q.queCapacity + return append(q.nums[q.front:], q.nums[:rear]...) + } + return q.nums[q.front:rear] +}
diff --git a/en/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png b/en/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png index db5625f1c75a4daaa1137ef96c97ad7ef6e6dba9..23d062272985b1a9e5e2de4026f929bceda102d9 100644 GIT binary patch delta 36730 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¬J|yl$=trf?henG45j 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 delta 37902 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 YZI%_;N<03Y06?Gl87s3AldIAH2WF3EqW}N^ diff --git a/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png b/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png index c4533b01702d05cad4a5407d65c84bb45dbd76a1..c79b452477c1a8ebd5f469f92c6614cc210968b9 100644 GIT binary patch delta 17149 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�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 JPDHLkV1lZyGvELK diff --git a/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png b/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png index ab02c3e50b0fb02e804849a39ce5a37545984a72..2d38db23818722098d95a92929593fdb331eca40 100644 GIT binary patch delta 27049 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 AGXMYp delta 27049 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 fS=Q2r!F$8e*NC;2ReR$AHr0>1@ouOh8{2(Gd0> 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%0ASd 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 literal 30028 zcmeFY1yfv2)CPEGkf1?>2MZG1EqL&tL4&(%AXu;=!Ciy9y9IZ53GVLhGT6@h?S56e zwZCAi_SBW>d#mes_nf{@2P-K^p`#F?004k4BQ35B00^+3;0Yu+*zG=t$pir403|t9 ziP!(=E-3|<@xdX8T#@JeSUs;e!72tg3;sS zBlPJB3WeT3Jw7}<+~42dJw4t&KHfY+uO1(+A095C_va6HCl9xW_cwQUcel5xfyFR?R+P%Hny}5+Z#l^+x>FLqwF^rCmjt&kE_V)I6c6PRIE;g>uH!siE zPmkA6*H*61mM%}`FOFx>ZEkLEY;3Hr zudl7Gt*oppFE1}GEiEoC&d<-!&CSiu&d$utOixcwO-)TsPEJfrjGXKZ9q;rVZFe1R zcJ6QVZ7w$LuQu$gbS&?5E_ZbNceJ-GjQ!nNs@h&G-<&VpoXuUIE?k+$tgEZ5t*x!DuCA!4C@U)~DJdx~E-oxAEGQ_*&CSiq%1Td9 zPfJTnNl8gcO8WEXPh4DFbaZr7R8&M{WO#UZXlQ6iNJwySuuFBlU~Mr?Lke|m5_v;1 zd2OOgQnGY%nV+8@Z|v}==per6AnM>TlEx&W#w6nUM8bwd;@Skl+CRiKafH>eM3pgw z{~ghUrSSv}i3D{C1b^cRs^bW%VhA$w@qCBh`40Q|_;`AHy1Tpo`0?ZW_wNo44t92S z*4EaRmX_w`=4NJQCMG5Z1_rviy4u>>T3T8f8XBsqs!B>q^78UuzI>6Al9G^+5EB#o z{Q0w}sHm{8u#k|DprD|DfB-)~{~4XU4*)p6kr5YFbz3}1LsrE#Z@N1&dTOA+raWvQ zN3xj443qq@UKy^#Wi>5s%*lvIyZsB&O;4~zM0joH2clve&90^~Vl`oqC9Y?6}LBUpYjqpjAe;jF;_hon2KefEeuvB`Fo;>K-g5kV#6dstzM`c+2S@J=i1z*1)&*!}$$`1rM;23Q@>}oHxMV_U;NKf{q zNy{XPZ;Ij|FvHJjYFn@RH z4Y>sX0}uu;-#X2I&IL6-=3v3*%VRWJ4F;VaQy(?mUe9GY0HV8*5<|+jyjc=vwSOvz z`vxBqFi>nLAS*7a^yKm=2rFK^#9USYAcAZ;EhRNWC@i&}oOIMAZ^?m<^7EmR*38O) zquX_{|FPePj};$h5$Ztzz<3Q_S#iJtfZxF#9f^ss8PMyoy2jYZ2;8gqL+0Z^qVFRD zKp=3~|1pDmfsJy{j(1HbHZUC%fTXP(I=nCGIJQx^FapED@oBKqXzRf7)c&X&u4Kgn zI)so|7!?Sqf5uIHYE9&!2{^`&>hMQ*<|1q;0)Xa@#@w=I$JT*P0@0f--EIO=*S!-g**FERn5W`-JTB3rQyP_Y~{0DvV>)+_buYJ{5FlCvqIls>7N**w5Gj z6$IRdcvwmL1wG;yUS7cmeI*^4WeJ;uhuJVuB=3=y(uW>d6*UhfAt=|myulw9J`xA> z2a&*Zg2)Q1+c%R33JJ#907PKE?4>H%?Awbt?s@0-;#e}}2ovlfZznN6Qhz&J--@u^ z7o-XZ(bsb?;K*Jnv^6vWKuRB1ZGKJd zzW2(?Lg`EIajZ0&ws;AP+x+u?ZXN?D{Y*>zcrx&*f{Q&QtT9AEq%nKG1*6fvmtj!)&1B$azWybetN@ zjEFxQcdv;!D>_JLWwR63V*>`w;$_6N+d!XEJ~f~wTG>QKl~q+=2G2tP7}S_>W{kVm z$G{bCf%~{_T|@y8z%46nDkWuF8c!mUhdN*m@^WNgnBBmG18mfR;ie_}>>qb#DF;Ax zgmGr^2REHco>Nw!!$pQJJ}+V-5;E!p@Zl?2e%659jC9(V}>@P0hJO@vL!>^@?j94@ia;qV23xVNerQ9BkA!gFOsI4{u$0mjl%Tau~FaWTiIj zU=KqY`pTh`(O#60L*EJ2nC#YiHo%n_Fi>&J(}BvK{PSl$zW zyx)x0inB2Zu;YIHDa)}Ik{bd6!J>Cwb!s`z$PmruK8-vXyf3f-S5E>MFn}DsDw?~d z|076b7r>M}6z83bdm4FYIDk2ZBCn{8Eg}XJu0QcTsATR}u*P5R9fcnGH^4k14o_}5 znY>Jp@2De)?gWW9C$FX%GxRe|PlST#zW)4Ujv8V=V$rfT1q)**6~tLF06-JSky>N9 z7$M-$75P$+;ntZC&xnE!5V+CoCFD1J5ttLeSDO3J?!<;Zx(Sqen~gentbHcWIk$$G zuz~IN++zQLH-qx#*hYOo4&|5oU{4w>XGtyPXYyj^Xwgl68w~Zp8)QP@_Jv65NdeXg zxe!@BR=LXs9bxHA87C2V@cLKFUP6L5Z~%crs*W5V|I%Mh1GGFr#AMp6{AZ<0>17W9 z;?)_fmHFdU@gpel>zZc9MnnoSK=6@NE2FCO2bMC;HPyAB$rTj8&^5a7Pu-Oa#-<{G z=$Euq7tT{V!mzZv*@wV={e0likh(lf{!Aks(4znRPRDUExw>Sizo;j@Q1_-Ow72W=y?0WukU>?|F}7&_-~>%zl^_r%}Q zm`Yu5)%8)f&j_f0*`R_BlX6p#5?TBQkk(kceZ4``bqmb}d=+}Nf!gpz}L&fESh z0UCU|=p(x=VzbX%eeD9bLMjTvScyvCFnxlJdX)C)Xb@UkMTXj zHIhv+!-A=@citlJh%s(6lYLhtwYLVN#}5Q=fuwb!G*dIT2#Y z3;#1``@0%N!4^JN8XB6E0bLgtIkdH%;h~J`N7oTUUvUF*O-0uto)09g|5(@HinN$vlc%dj)vCDEcKxvWx5zgt~}WtjoH1gI;al9rG9ANAs*NvPE!f|H!+1$N!l^boKr!^sgaC#b?bH+G{?q-mi~Z@NEbMMHusS?BIrw ze^E;#{lsCAXKA0&rc|4r_I)Ca8_O>Z++P&7LmpfuMSxo3VO5vN)-E;2Nt}d*@jG6S zs=ld!>svwD_66K{=g5-#P55}^WO6;)t+rqYBBT zg{-yKy5QX)et54a(6Wc#bg;qeHrER+xnXPk)M$# z`$Cdy6j@L<=&kYei0pNqT3C(bnl^>bl2h22@J_>@?<07!m>nhj1!K>C`NA7iXNpdw zgH2;7nX_tf6qVjJ?^&ki^hj%-oG#ab=oe>fnyd;SgPG$OjAw_1iw2W1BjeH6Ys{^b zY^k$s6b|H?bgWUx0X1A#5F&?QkHF?;7f?~bdTjMBTO-FhbqJ;!X$x&}?f2~r8VleItORBx`NS036a)!PMi4ATH zGj<9T5693q))CPKwG8YMBxy<0-@{{(EBJ3;zr%hzb&Yaj4KpLL&C5xD#)8gnauO-liY*71*TCwgH!qz0EO!j#mirn)$q`*^{syS!IMH( zb>`W{VibwZXW@bAoKFYBD~TE5N+BwaZ?Q_b;8^_+G>o=6i*{YG6 zxl=o#t;dYm3jT>S8M%`BIgtlCvT}eq>Fe#~s5WN_WuOe2r(fGx;fN^|kq&xhP4)Go zDzSv^!{%nKcD)>Chh~o?jbvIr9fU|@13{^9K}zOyJ!dAF#)2npjZPKs`c3`_1n0|Z zQooTemhX{iNHzNX?{5fwY1tJ%FAsYfZeEjE9VdU2w*nBNq9bIpDb7>*oVcBk*$;F3 z-W6DShx#K#B|jh!GOT{$P|y2JyFVNT_u~xt#5x#x9XtO%tt6qmhMxTfZ%f!qYM9O{ zq-kGwW06Fd_HOr*8V7zNnhHUP3SSi&mLF~)Tr2L{K>2(GawhMzV6=P4hf@=sly80WT|AO$7V{}r%%$arlz$G$zAU9=e%2hp(k&Oy=M zN{&@#Sn}AA>PV5HbO!RzM0~xdfb-TQ^~`p-TfdJ;t}%-Ovdy62cLw+6#$!kjHkgfx zQXim+fd|a7(2>@&`LB6!m)>W3b2B^YQPf%-X<31n3bGj>!x`zlPb81;Pdn|XsL+~g0SN#5Rh+fj-#)@}*ia00^2kn~bHeF^hNXyx)x1%f!hWx+N z`Zvyu33Hvc9=G5pS3G`Y|A`j$jyPPyPg=W_nC|vzdPr>mR+q%WACy;6Ta>>6GJAt> zLy|obG}3h$g5Z9J3ee^FP{Li8f9Kd)ox|>6NQE4ml90utw900yvImO6^aCxIQb0T! zPUnh*9hQsKKHo1MxnOQvf_xBRFO^8Yq}oGw&CC72sL-; zs2b4$mmkI^2z^!0nVHA1fKEzUM=KVhQP- zt~p&^UOok>4+W~*FRZ#FyeDX-EKt^K7Qq9TZ}Gda)8Fv|BT#I>pq+==_&=`|qHVZ&sx_NSz`>{0`A(YDifCPA6yfI@3ugdyo81y0~<<2`e; z{jg#f_mgMXvuC38cyDWI%c`-MWcK%rDEr5mJA$?E36AGyr13V^x}nBL=rQ2}<+vS1 z1&Mtt0%exDI*^rV|0`Yxes?T25j0#g`-w&%MUBK^7Spa|9o9)HJLrV z)44M9kw5J(mpzu?s`woK5|ZM~G;zFQGQ|44<5-LQ>AygaN2u%M+${7WPkfOrD;%L> zadwimwz3YR^2iP$HmTaB1rxGcX{D$*%$1EE&p5s3@=?i2VCJX{qdmfl(0}lA^ys>b zHz7#dpgKP`pOzhz)6Dzi+LNvJd028>Q*i0)Vr>JSK#d#&0*Cj5W3+#6Kl2sGx25A5 zt*`z2)};w0Yu{#9Qd+>tXQGR;(U@ zxw3B~t;Cd1+uqNgV^}LGI@61q33Ab$jJ78$%LaeYALy|0n(wA$;Mt9mm18b3A6WSu z5npuR{2d8KFxOeVwB6(xS1f4_FxTsf8cXPw{lL~TQ2W3!g#vQ*CC@nUe!AYAS5R7i z^!K)$W{78yt(Enlfuf6pBP$cu0J;)dkwtk>9~l~We$JDU`vDB*MY=HetW7owBAsOg%7@;D7NZ8$MtSpPdqJGv%Ls=@?>bVlq#PM-UAGw_)$?blO_QBci zaSVQ*`ugUm1g#x<=iWE?bpLLpHK}Zc$sMx;w0Sg~&`xxCx4tqgyeUfH$!wsNzD+`& z^5P*Y{G8yLRlqks@U1m^@PY97GlxuV8h!{3v4Dm!)&ORzzGl!2767RC4$2=UQ9a*P zO&khr}UD zni?C)$xb!IA=|#=3LA99(yGVFs+yYQyU32gBAr7okvTOfe3i(2BJONXDHnrMNI zifJPugL=5hlt0H8?WGc9^yU;W%fQ{DXF7&zOEl1t-VDh0tyUj zKmUG#S)I39i2D1e_oR08F{FHa5)rA>5`5m(0Cy zF0XEGHu8;6-XhTcUa9kAu+&n@KOsGMQ9sp_?Bx#t;Am>}4J4?NDOm&yNdo+f4Bcfj z>15n5kaJYLhE^grV)!K!-T?Sgq^F&v|JjuXWtBfg`qp_Py!fr0kp%5!?@c z#VXJ56x3U@yu;U-UCNT~T!XD`QiA-MuT@7J*384$Q4F$9M>*er)o4x?B9v02Yj?83+T-`_+)zRW@oOl79ZYybN4U*8_J(9q^p)s>#* z8@dr;vomAyin_Ymh~4nDaNK5W}ANynbVYwv~+#bn+QQ$jR+Ld2 zo&GXkZCHXl2E?EIvwVK1A-lDV_BR*SmQaW&L(f=0aMLCnk`e4K&xNBgofc!I<9D@1 z++R<9@_3)R(7>yjKXBKdk%+*~=9cuke+m5S5`}6s=biLxcvy&MrT$`K=Ke_$=7FW2 zJhm@Cf(BU4@s)2|oyYVx6fDW}*Eyay@eh*8$73t|FRs07 zZ^1!~zLO)IX)BDF#q9iZJ%#7_LyV8AzObwPX4?-(3xiEl7 zGcw4`@fq}gz<$#K`@crr^h}FxYipYIJgMG4n6A?|sV{(aANJzwkF0a`>vP~wa|rR7+Dj`ylXZ_zaqNkL$ z+C{%l_qWd?K87wFOl&YV%%s)3D^Mbk zND^iXrJa8R#R%tpy`eloz^dL%JJ>BQK4+M-b*}Q0r+F}7CbLx3sRq^0FT!7H>t%V= zB!{et0*@I82-FvECntTNX^81?YcK21A(a30bYU4Ru^*)^y^lE~j0G}jI}5GTHx_E? zE!eBGq=HYd)wPrZ=Ir#S$_Q$-6@h1$iEBc;xe!~$5*0t~ImStqz#Z+3nGs4m^NPCr zhXiM13pGReGVL1EqI3Wy?&hjF%O;Xpwq7V_)eRb-*L7HHF*=)PLTk6u!xXv{ zZg<;iyUCXYf5UzQTDU@Av`Hj5pEbU%O%a$g^o4m&T#J)SpvxAO$0LXV@!)%|E5n40 zwcU&dKXQgI`j^D`_*Y+U@p2qp*Ea9GdrzrK|0o||e&(`c}Qfn8@jwR`*$;VI*8NJUI2N3y4J zO~%gx5zRU-#^$6~tnwn9A3oV<)tX=^q6`k>O8}Nkc8=!Z?X!5zGff5#n{kBqc7b+~ zSo_AI?EbWL?5nsma+{3#|EPuiWR@#)@Uk=M6Nx0P;O=U#GRc}!x#NpKCliT6rX_>z z+boff7|DEgSo+1tDY3jg|=bds17=u>B0rb?b?DX!*q49rMb| zJNXQy{=kxoiMdssr)#?G=F*6#^Otn)oUw#E&NGi*;puf@xv#63Bpj)e6W=U8tg0x< z*s7HeRJQR^VY!L3Vo5h{&((5E^0T54MgO_g7t;dVnb|;_Mtw^LZ8P>YLfBW%IX(-m z`{;c+jRW)x$TYY)J4AdU>Oec6yJO>Dqfcq%{ePHsZ-ekc3l0zA%fJ3jEnGo|O0AwPj_7NYuvR$B`n2_!G5X}QlprW&mWqNr z6R2KJqe_^YWqrnYEEDPg=C;9`y>h7k@icudwuo;)DAGDsTTkS0BW~~TCs#z+xcRR( zZRH(S-`FCwO2>QGeZ$zU3YnsA15iG~Z57<>QRhs(WR`&!qHtrRswYosu^MbIY-;Ku z221NxJtvOaueJ=?4^G`lv&u$zjY<4%FHCK%z&k)9=MR$5V(a`4xz4j4+0`iJk&ukl zq0;PR$YmP-Bb~)}Fb|4!`y-s=mtlJ>j5(J5=Qo_Skfy_@ zLFGvw7YA7}lbKqHt)2+S;10E4{Q{nv{of6Z756&*#WaBm&&$C*4e8Sms_t3OrztL> zlsiOWZim6ko#D7IE*}0F5rCs;S+3D9uv@Uaxo(zEqqM=*3t0@~Tz_+IlXL~0*MO`^ z$NLHtDNCq%9YKov)&yfIc1L`HcZ1^*cNrbzvuQZWI?pwR9J%6}ZYfWI|GSPm%b$(x z<@zPM(%L{RLjom)UlTOl#DOW|ge20DAVTzm#<-ykO(tLsB(BCz&iIgL{V);+Zvi$5%#ek*Ok{$kR3cd#l{o~?uAGE zY~MPp-hPkwT+vNp?|6jedHpO1y-l(5eUK>1N|5m!E$Na;_6}vqPwH2Bw_9s>ApsrQ zp!W7I;6hN!Erka?1+{(H1bIuZX%}-o@`-^9bsLevh3@9$5E>58n2Ki6TDQ$oPZkMV zW2&tYt*osN9M&Fh`#vqi|HHW#U%#Ka%t2I0Nu*>zBWMCk_tiaZ-_c*i${jS7$?Zm? ztyNXDL1WaahsoH4z4eBW*E3*W?2Op5lF0QPENe1gs}7}$RcVp>?bEo4_Hle2#`J1# zDf!L`&Qz!EH&b2W9ROQy zbbP`7#bt$@dHbK058GR+)zh|eFfUJYs`j&hi&G1wNu^RQya59;pyfb5HBrY{S>bJa$CMu zKQdkuwkBz`B4GuJ`z9w1%&q3LRCn8-o|^FEt?J9MTiQFcttyt1RO%vSoX30*d4}2l z%GG_v)4I7&8S$`7({p*?rjYsdD;>ncf7l9n{mrsvN%>$=+n13U50Ko~eB_Mvm{JRRjC#Rt%Hg-T0YPNm0aW0c z+o2uW9@_REhMzx)1Ol=F`o@G_#IEZ+Sx#b%$M+wq7?$cUuqvF#*Gz7Yca>e{+P@-a z_858hzc_!hC&^5G&scp+<8>1*5$gInvOjR>ajocq&m!E%7vl&`*dz4UasJ)bv}Av9 z(Oi0YSuA35aaHh~E-166T%4%BQE)bq!Kf(?)$#E*?oAP9wRP93RVgWby2Nh+HzYh{ z81AWP;#&%Wt{+p|9y??5>~#$Tov%)|`atQ1#k!~U4^q%u(%<016^H+aUqyB8ofkj; z>yGG8`gWmcbRdjZe?RT8

|lHcs%z#=vOVCI*S>J%5UXBJyg5Qtnr=Z@`&nheYm> zX>lUK8L{bjANx!yclp{afAyV|Gi}gcBU!ttgll+*9dsxP&cplW?)&g|)}8ulLUt&= z*&}@taZ4cQiD}=O(dN<7NPFlo*N^Rk41$%me6A6tlJh%GuOnIZ0m(tT8->woeM^ft zM`qTfA1(>`2=M2ceY$P($u&|dLJB~F{`TM3RetXP1f`OVFF5{I(_GWZ?8N8kCt>jqhW;sO*=Ea>lbF1Xkt;h`Ql_0*O(OQ>Lbb|!rL1y zZi!o*1GN{k5;Eblu-5&zj$J1#3znvLaVivl(kWs+eI`>0vNZ2UiEWx}9%$wMX=k)| z`*%ITG+VQjd($}PT3`C`C(Y&YU389$&AFW9hw9G5%kd=Hr^}OJqLZzHE+z^m--BVP z1`FMis0@qlcp8+MLdH(lUlv6FX=->y`P}=vgN^JvQI+YQna8j{LVW5l$MkPDr@P(m zRPZT#lr+h;j}M(SJ(HJdpqWqaR0WD+i+=0lgG4?)N5iL=$+E-K`8@vm;{4|Fl~%1r zrzO}D>+$qT(O0*Hv9jaDjeh&`83 z<~hnmhaGCPnU4;zAx_;iMaN&sTvTaM5?|Z4DJP-5^Yr8c{jh?t(ft<;Kgk9(OAtv2 zNshfeDZH6TSI(S~plfZyN~KeKFMxx9RIWJvVNoVH6H&k^qBV(Nwd*eU@5rGdcTw~Z*(P) zk^)w%@+O{F6jm_2(*ZFsGP1GJ((c{Ny;3G*c)zwwtkKBG%h3EC^ySOYgtgKN%6k8y(P)l+ISXJK9`L@8>u&EgbXVAMjR;2#AX>3uo zDkpXJptpsM&Eyp`rh^YNSagIWDA{5EP(aHkNGCfJdQone9R>f1Z{d1>AAy?5pVDiZ z?bl&{a{$|C?EPfrWFZ3lU~e>fwjg&jE!xCcMS3Q*nNaVU%YtM0K|`aB9#(X(=|3G1 zv@EJ@^bITl9V)2WFd5E+S**dg5*%?6@K#Avv5M5&HgiL;Dr~`a`kRJ(R(X#o&;K3$ z$n|bQu)Vmci*${$=#Q`vMj@!emkN7Uy<@p)460Khde2IZD2d`wh*hzFV(BpV{k2Qg zI~@of`ptLvS?`^0+M7B4`IL*EXH?Y(cW}=~3^QxIP`g4)IifI*&2?}Wh{VbdPlIey zXO~Xy;3aq<;|qA^^B^m8eQ}+@{OYVUl4_F=A3VcNt_~FHDsclBEVQ$ zxwJt2Oe#WoRgZ_#m&mZPyCv?gL&_Ma$qy0v+S`O-$2J2Cc^dimN&xy~KL`csnb>iK zTtN$(Fi-%}=aB&wMVE7*yt>;I+erVLY9|mvZx}a0Ao(i-db5R;h#bWyo*M7~l&rxIb z(PgF~8Hl+)nrn%&R`@(pVGYn_nmw#{4SA9Yhye3!qF+0ST9f!nU#Q!dqs8ljido!p zE6|TRw?~G)lxh4lse$6xC{nW7V2!q|x1hF`9k~4hD)m2`zWI{Fi36E@7S6*+%#nj@ zqQTu+I{)IH{{7!;RvHj@`by{3VKd5U;H_=1%}h!G94E9itu~?Y)V}yv8CL$_ZQY)P z9MNmB3<#X`I0$9ckHhn}suqCe66j3+x%t6ZI9hugPR2Vm#j%wkZ&x-AB6K2$+>Tv| zx)?S5U+B;o(aPbj1|?d7&%iv(i~k)V>M)NqSz@wg-M9h z`^cmLZ;$|wKEswX@h?*#&abcY=R9F&$mv*Q<~0?lO>1-J4drka*)LTa_L(k&JtNf4KuY&kYsUT0TlTbxQ%pwoB0RTq8Xmk z#Z~QIYacjlhD1d6(FTfuKm^5aGba)LUObSaVpyPLCjHk^H3!j}sm}Zv>*$7q2yPO+ zulT8`6p{3n{D?Q;;(h0qfbF#M-AF)ys@gC1CAl|I&LnVLpMH^*SsWF1DG>n2F>xpo zUxVnu+~c5a9T8^4x8qCg|0LyaLc&sWu|O$%fFpCJB-(MbhMJF^5GfUK95vXxa>8Uu zgyoQ^36}2C=SFm4v3x8YdHa+_Fc!@bDsn==%Ui*^h@glKxCEJ7y7p(8po4J3AWqrS zxk0YKS-lNJG^GM5dllf77{T5LgZ%|>+DsaV#f>E^ONjeE!x?0hvRIEeO$9-mdhk2; zzR}{r)jW6Ho!DD4gjRahED)%>VGmeOHLB#BhW2+5pv=D+dEn{pFCJw{Dm&}ntb?@m zYCjO=u)<)lB0~bCU;f656T&^(4AqVzxozhNZK)FbdeSHc_0w5(p|Z&36!ug1b%^+@ z7#SHgH2Nn@pskf~S47E|8ohyriX(ejQnAQ zq?5XNBgMX)y}q1b;32IyFQu#53bmiW!(-0J0r_kcHTNQk;@atGn``sVS(M7ZfHv{3 z?Q>5|0+=+CPV7O(Hg$ym z|6PY+Qs7(DVsUyHI2Zk*;U2jOoam6*dL?omCg-QC^&)1tOP)uHW}Yjl0Ru(J)q}YiM;GfBM|BkBtJPM)YjqsTx!|~ z*zeOv z>K2v(=_8R>x`X8Gt?b8Q=^;lS>3a(SW{X3M3LRkrc!!ZQYSeXdDW>n@p!ctZ%h2Bu zz|U&%z*W(Uv-+_z8!1dK2!j8+yew=4)^Yz!@0CJe?BkIY-P>Aw&~idr+Nj^ahiVE4 zJ?Lq#py%YVUz~a8E>id@y1{(|m+MSrmhUN!H5#YGr`jXVQWSmrFN!cs90boC)vS;z z5(5$mTh4jWt{q_O^2*qDa(XcRa2)%Ss9t6vKJ_jT2mxMSLK zb4%KODExhkB4UME`=*Z~w7cL{l@{b5*!d*Jii`w;uM3U#ozRP$B0Kp8gNM7iluV{c zn*FNGIt$%|%esL-7e>(%V$kN9M~H&bmRR8kKMRlQVdB7_?|h)o{|xw|uOD!HzTpeg zpOi>62?=pqi9nbrsIKK3*KK?U17B0(u6#lJrZr~9o7=r*oV zwcj1scl%g30oge4^SBB}L+?_S^N=$uqD3d;tk~cSqQaxOdFgq1In)FN{y_k2{HQHz zxU`PNP>KfJ+FA{?Rf2E)Zw7cFuZiMcV{74AzlH#$4+$Zfm?Es}Zum2IB&t$&6~xkD zc6|uBrS+yt7J6-nn>jI$SB9@%)N%hHVWhdN4o(JUT)nX2xe#qGK5y9NOWf6U5TKCn zop-wbjQ$;&mLrB2nNP$(1N?1qIp;zsgXHDrk6GJ08A4FOw9D+?BJ@&e;pvD;;tiO{ zn;}Ml45@oS^eNQ=E@k22{g@8Y6NZZ_`Px7J3$iEPPH~vCXeDV>=`X!LTC!FCbN%%Z zfwiu<)+#n7JjL!K;-7N`OfL}0NZ}{J7a3)*_J_bzn@Hh8s5mTb(-R4>xZHX3u;5fA z*}eL9eK7@8WSxEoE;St>&i3#ia{b-)E!+e93^_ad)m;60?Ra{kz563*Zs&Mj5Io)E zQ;dMQ1^A{#ck?;!N_GtOR!Yj(4FbG;_FKGZ1oO*x;C{3`!wFB?fffg6vX}xZ1Xa>K z_jdFeH$EgJa)NISMI?N?d=PFyq=0>W`FctjT14()gj_$$^^Kz#F~oY{Rxk|kzQ1Lj z*Up6JJkS`-yE!CA3*4FS%>2e^x-bW-a>*<#IBr zkz79VWDu*E!(di6;L!m3zkv52_sM|Yi6m2#kl?so0*i=X3LM*U=Ck{67|-PMxiAR6 zsR7zwIMVk3A}F=cU*_)B#v6&ev*vF(&77_)3$2y!&10P{CMvsBVV z>;z6s_mO_$iFR#yTa9*|h-(FV7Ht+SRSIlFP3Lf60zJy!)&i)*`}_`T)#sQc6-@Kx z;MH^tI()!aXMg;;*FX8Q*YC)*9Xyfn{}Z7P4XZ4BJo;%hDY=;h?oc53qorD@x8KoS zu;WOFGSK7`mT`~Y_{4O=fOc2gDinn!YF5%>v0#dmLkK ziK?yRVg4KF(Xo(RMzVlyEb=1V6mEAWbb@zYz0g>J!hTT?$6%D$1Hwf3S>0b}#U6m=d2 zs8oDX;XxT$CGt{c_R%|l(gpGaQq$1vVm1yB%E)audul#x3AM8%oXs})c{F7gb*$vu zIA0M-5ms`UW&Ct=GLVx)bElSe`Cml5er8k|0O{QIt(SUeIiao&_Lpj?yeycM($xk5zu)xZI6kP);1NI3(4Z7&^c`a; zTQs8+@5DG(*3$O|mD!vV<9sOeCaMt@w?)5vRum8d=6Onfkfe$$93^7%hLz$H^uc%Y zCA*76)LLl_;av=ros|x9SXrYLILjfCNUNiunf%(Y85PK+&`ygDMKw-4e*z5f!;tXO z>(ASCUW&)cdq|$KAfJ5MWb$q64C`IQjLRsML(13|pdSFZy!ocgys}1KVEi3$3vv3g z<0}t-Oh9#Yv~vB0l#5XBuu^12v!qHpFi@C#{z$c0yn>AVu~YrCs+zer;cgem0DmN* z_J*5jV$Da@Br%0;0MaybIQm9~erRqfrnQ>{I-)K##9VB>xE=8Z74RT$$u4V^&Vp4Idj6f^-gs<%sj4! z34)FfY%>A&dO4JHl4fxHQUxdvX3)AOiN31j6DDh0K};zji9sTi&;Ru$AR+lPyvA04 zYz%|;_ZF9}-}7n*LyQ@$iMYR1&QLdIN1ybg7ayM}Ri5256`%1Xews}DFE~2nc0Eqa zT@HA5E?sT^75^%anDunsszbzezL}+pRwN9x3VGrK9hb>aSnIeK!E_mwq9xoj&OCXtl`{pIwe|FWJRKufJD70r^ol={ck$5GKB zp!CuRNWiuLVoCT{ftw4`qlXhT9Tw_)@lfA?)8UZi@XDQUD*sFQ47!blTf5rWC+%sI z8f?yPuBUNH#L~_gzq$6t^Xo^2?F7upE|I0F)LFA@eDablm+gxmQMUiYB&T>;J>x-c zaU`x7UDFz(v5EE8>Zu}RofQlWMc<~C?X;cGATH7n^{ZBO3isA z;}a)*U0EjBAva(EI@-7{#2TO8RsD{pHkCM5R;0FlKbmAWvVgS{Pn`wD=c7nCQ?hq| z>xMWXm{ZhDJ)2mD`sJ;f_?L!cDNAc}+nCs>GON!#n>!A`Jn{I@PC;KNiPOs3ig$V% zU#j-piukT{*htAiAy(pts=huv$r~n%lTsNrv!nCDuWib!`?m&{ozOmqH^1v7)2(Ct zx4wfrxRXfn&zSzcHt4j;PDj!|lx}&_Jkr&F49~rh+?{3Z%4UJ&2*(WT&n|9lA0G1l zAML$WR9sEeE!tQDX*6hXm&V;CxVt;S-Ggfq2<{r(t*;)F{O3H} z*E{ah-H+Y1Yt*W>cGcds=A6p~8mkDC3P9!gt=)@mscxJc)eQa$ztdmT_Lm=_8@9Ss zRV=2=Q}uY zsxbxF3bge3b3hy2GMpdKz2g$WLa$rXC9>D%cK<`X^zBy44lA2W%a*!c;^!Xw zVcV7`+v^hh7YeCrM=(x}d8N!rNZ73Fbkt+NOys}q!ZVBZanDO$h$3yo8kn6u1^tt1 zPoC%GV9z{{;?nRFA9x)RbxlgH5x{F%T^PN1Kv2H756Wc`4p-IGOC|pViwaU71(qO# zGcjWW8NW_AZq=(Bu07PZ{#((8othf1ByWZ*LQ^5rF6Iyc7R@Wecscy;*~{bOVq;23 z#e#19PRPJJK%42#fZM&{FRDW#eNf?VVC;C6)9}^o;(eH5U>{!9JCVt$Kj{{;(1`L~ zA|6?j0WPVjDXL43PxepwCncytI)DY7KU4XkNvp8j#%Tl&N(Ap+_3~pu!Ic1})zI~p zNAe*+_t1FhIfH4q8GQRTz5eU3tseOp8WTi^ZIa!SPfXE(VCKIj9(#tN-7mI^6hs7?^)h(574F zZ04x7FUADiJeoR%Tu^V9K5m8}bf?PN!XC&X(JjXw+k|hbtNvj>bf&P5Lui5Hp0B6B zzVWyMB^|kcQ1u{u7m{B0LFg_y8wbu3BDY`!1=M4-75Jla=Ah-o;8Ob;P7M2?OsMapx1n)O`tNS zbN92Ego;6nG1=*i+xe}hrrjC-)opERHd>%5)YNb7Old(y-0%CE>N};OaWC=KYl{bXE$eV!ARwh!qqyRH zxLUY&qSjW>H%eiIfOI_enP>voGZXd|29OZg0O% zbX2O)OwL^5CDEJn%lFSIdX>-GAVNgXt57GU8B>@3Gl>9|1Wrfri`plz;JK>j_f3qZw*JtVZ7KzZcT z)7~#>R`H;Ldv*$sz9c!`MyTVeNO9OEI3f9PVl}HhM+TT62OxxBhJIE3MUCTAdCVE0 z-}t9HX)U3)- z7hich{jiV$vsGQb88lz2m}m+YRjiAH|8qx(%gi2Pb?{b^&wFA;i5a7~p>4m1sr9px z9H5j)$)dn;uYADIFb8Jvsnhp<1QapRjcmVK(5+5E`0tW4#&b|Pc$inf<~JRKuzY)i z#kYT(-1BNqe!yjaUd&j>YB2@v;z4d|n^{)G9N)cisuQEVvxJKCrnFE3;EDVRb!JWSV7#a7SCbi=C6Rnn4aVQ=gi(Ca&6 z=c)`EHQA+~(vH3AFZqNT2A3zQr>bURLUGUo#xg?IV$j%bZ2Zj`?UMn6VQamC2GA+Q z$IiRY61K42Z~OJ4Of>Te6g?XQW~KsY}tr)B1;M z9`l169FIf)C9>G-#u2xYDkfe>Lzr*>-9{d|lT&{OUhdU%T^EOoe}iG5+tnTKja{qs zM;g!Y#D{%Sf`&Ox2CCt{6EkPM)qJJu_l|QnL$~<-f9nuUP4C5C&cEJ1+PJD3E#Rv; zO}WO9#u&4$3}1U&?}Xo`f&ZY?ktRCMtyAdfc zr`7SfH-0)aFI`-^IUu`~PuYH>J7k<2_QzQ2rxZjzz?RXA_i`ea_nPJi07yb%si|Sb zB0>}vSHAP!)w^e>a?-LG_SK16VmDxUU1u{`HGBR-WT0PpS!Hq7{LIZAN`kHK*hu^Z z;&xY3BD4M%F|S6BZ*oeFf#=NO-6OLw6~11NGKsWI3NJ&nqyy3PCK}jF=+V5IGQU_o zteD&L^GKDY>tIPVJ-)kxQ7)nLbmW*a5Kkb}ff0~rBHW$XTA)VxmMrPg-}DamV|Dpl z#~95UKgI&|EKzHhmWes*`&LBg1~6?-zmC&8xlIout&`&{%WnDIxI!`YuSGrVV8*G z(*qBORx7wSz4Nvia-Q0aDg>N;hi7ABvg|5$me(&` z7<3U%i=IX`U)x?JOFU5iPI@cLqIj2rv?HlG%OjcYczA}YXB>~x7&9uAH~1Q~vou_S z1`-qinV%EDPx5*{65I@F$FuHNYF8-sFh$D5a$aZS2p%N+m%Zd6m5VhgHD-IZ;4Ro~ z=t`!Q*;u#n^RCU^}`swAj zkw)cm#mrH!wn*goh(Y+jJAM`ZtnTbtKU{$hPgEVO@x=HTywok!nW4m_j-jHDGmcy~ zVi@@JxBO*C%5y%`y1Lut& ztG~KAy-BC9-n*shY`}I@s z2Yh|J&XPpPh*X!dHr$kZ3_L^TR*PaFK{lP8D$k1OLR(2+)Xm=!RcT_u5LLZ4T zURc);geQ+R_;36B;-AC%1{q)dWi&z;)SUJF2JTTA=MGX5y8??MK7$!6?NOU%q2Iq` zJL2ZQe{~+JIjvH{On=*Bn{7P$BVG0es9>rt;pc~v7y`IrXAh0+Zc|_nqhV_;V$!*a zfsFg)dXg>JWb4Cxb%29a0#-c8SzPhS?^ZXEAY9hBd@obnygUC>$9aW+HJ#jsX`NMdy)*d+G_UUz6{sP%i#+vT_=0hV2i&bCuD!i$(}DR z26o}N*SX^*dm_9A;P%Y%1`iGuRvL{8#8OVF#G)@uA-D!++TcG!A6yF+!9&*hw}55& zl`giFTspCW3)9#$Bh;LXC~&cHDk{IBN$&(5RfQ1CIEt zVn#f*Jeaw7!_f23-cE3}>Zn;wLmCp;3#Tn+a%?55dY zDO9ziNIDzv&>{BF0U#5C`YO&O+gHQIuE8fvC4L0W0RnzDRz9?~> zytrzJdn3)pgi1s%>tCK#!JB$|D=pAPh$-V<)ojqfRPiu#8e0E~`B^K(bK74t)KoGi z;<$wCK)i?-Olb@xhL;2?soSgQn<^W?s=ZoU*QcJa{QbK!Ygy@~cw?gLyRHwKBU+;r z24n_-bF3L7{-V(6H&?(VFlRov8?jzb>H8vG0s-W^*sG0$nr-G;2*(eb61!el5rZhT{>`aJ7^-@@uTx|L8q1**JVJXA!lvJ~X@Go@rL; zW{rS*y$n zXCnvBDUNg5vzdm2f#0q$#KoGim`^ZlxZj8`;I;D)y6W<7n#f5Z4LC-qLM zI!zxNesNM&AS*1LL#*%jyo|~#Q>AC1Z|3Z6n4qXlqkj3LKLRz{fcxd`^lTT~|JI8# z^VV#<+Es{QmImZP7l`YQqn1rRbV=iZcLD;}(D&i*ic`}&gCYX8#p|}$8s?sDo>p>a zW7;H8AWm-)CkZ8aJU!B+>}Y=1D`9;lvT9iY`zelH>G5DI&1;{LGsfyE8En4w9)2O5 zN%IQAV8ZDZ0Xa)orhCdDrXd;hRaN^I)?{7bbh}Pz6lyqx0$odo7(Zc*bc`hF$^jta91p$XhQF5GWJW z`_d^JMA7IuuwS`J5gagV;hds@WBy595trcL`U|RxtqrE}#qWT?<|YWERgAvOgD>GD z3oS_%Gsfqi)!^PuOUt1*??b3~lT)Sb1z@Qg+J6dNPNIWPVJAF`@CHGUm&enf*T?p? z*O>cze4f8g))(i_{3~L2GK=7@*JH2ED*E6!;fW_UIY8VLZ;3v2uziO2jgK6B^KJIn z(P_^W^Ev_9O-8SvGt)3Ok-iD8~Lo6Pe zzXkQ?wb$H@jBwwi?gAMqYiiCQlW;g5a7G-%7Ue8AXnDb-0Q6Fx;9NA^H1pU9BP08<6;$cJQVVenE;T~1L1Q-pT=6T^H?b02E$4~O1?=} zkQ0xZHuzUDzHbE;*sxOK=Z3gvju}5enu+H}EK5rRgz?)eVqI2aTW@m}l}%J22~3Qv zEE|a!AIt1fq35Ydee>nTFVgLa^ZfSZf!8T&m}2AZk+}YTt#vy`^)@7MdH^Pb6JYK1 z`fgogZQ4s)UeI&YQePRy$q9Gh%%+59yqn!8_EdCqkj3`(@)n!=W;}L}tzACHpMMZ! zU>P>>Tkz{v3U!;oBJ^f zHV+KQrnwtfU{VD09F4vfsaE#0zC6so36n%1oDUeb(%sN9?&kIz)A|N81rp&78FeVc zQ{Ccc{?_K1jCo-P7p3VXvDi4$Y%ZoX8T{S+zWlQ_&r8(W(9;WNLcdS)W=+uZ;XZT( zE)x{o)|gy*igdA0`HP6nl-##QAVg#x}{MMoy7`HANxvV(vj{$~a4y z{L`sDVye^A!IRjk8T8iEiX*{&Ym`#alsY;aISz1dy!$p|z$L|O0J zKP`K~>0X?05OK@sY*LsWTDJ8CBG#%z&=oSkYZjQ&gGK`{hSrD<2-)m|YxDI@{M3i+ zpLH3_`5ue$jaRHa4X~xC*0boj88%kQm)L8+luq#Z!BYOoL>0;yVQcKmU5`Y!_s(52 zjJ(_5Bbft0!9Q$$y}I6!6Rn%%v&svc8ysJf2Se!~`5kSuI=Hxm=>+G5?oB3`aX=;F zrBPQY^ zyvN(ujPOHx3kuQS>+S3fYjJ1q@Ms?v?BSmGy~ zA}*+DSc1jbYvWE4`YU;L4^Lx|^W+kmRQ%n(7wPLsFdWDYop(<7PW`TVWmGpGG$+U% z!X~#Q#h_V|E5Jus)6ri8>pH8z-&t>m0qbTCy}BM(h3u}9ENYBz$47(8`Ige)n?p<1 ziXW5!BwdfZyp@{)53x9KPl=rZcrbSNI|5P=4QOkH9UGCYI*47aJmV$Ck1FaQ^4SQm;A^uXQot35qh;qV@@7wDZRtNX80KHQbb9espaYga+>o! zS$-=8aLU<_NJx%EXsR;PKU(D<95@)J>3Rdf?0qBM7iwKNSO^XWd_k=g#1#V5R#3`~pA_H^aHmC_ zltzsAi8Ns&4_<5)M#xvnK1K_L(-%`SXrmOD2dfYgl^3Yld+Qn4hrnG5F|v4QRVAq& zD!i$}`N>^&B;F*h`khw$>L+i1CS`C}KJhEP2&Qx?zJ;bua?=-K6msrO)}Z;lo4e~Z zP0o+~*ZBa_!u{<}Y5YoSKH`R-oDRNcS-^(n)*}UDYi#2wy|VRtA6l)IOsHdazfk@F z9;5p2n{Y}2!f|Kkj_?&@kZ`=bcz(;3r|@5GB!#fP7)Rnr@!ni%dlS^M))#TfMS`~m zfgvHRRtmUcX=wG4U$H_xX}RXM%1=L{&$p^V zJ@dO|-{~hVh*k@oOASFm*T3uXfgq8@8@Z5@JSF6EZJ|Kb8&q zt)~DemY?dxC!_0JQ^5FcpKxt&8C^8ke29-4jd;WeXDFk_P=cISIYra`rVbz~jv;is}O^lCJ;IhU8(`o-y zi@fg^!XJM0gb4&uf!R1czKcLk{m1hTgwv%UBA6oXi@Y*4Cf8gov39|K>Y_M{dAg54 zW6s$(cx-9(i~037R6ccS^mh86Ki?>9;chIdy9dt($(H|d*-`U6rlXk$h3)oxdoeV2 zmQ)?dNnmSo*^`iBGA!M5jL%E?qO-*o@DLu6PYuEKlN?pZdG%7E2H*1`fiYa!Dc{Zf z?4XlV-^wwL-(bTg)e51enCr2ge=`Gu}P|=Lyv{ zQz=^TyQx!w`LYS02}Ox_xEUa=yYn8J1Hi8Nf^~5}^H9zIAY(94 zqVGrZ=X`1zp>BXKTw&BN0%R#9M3*3yfqTUSq=yaktIzm;L}2b8r{SidQ)$sq0Z?Ii zr+7ONUweI%5gzq#?Z9SUje9ORNGm>N68J7IV@*%kJ{wuhr%JiuM@wdt0M>B)cCOHh+}k{YRr7-yCWjhz zegz2wsJBK@D9Vp1;EljN;PCQTG!xcv|A;#!HsLU?R0(wd(KD$q9U4j<`K*9JuaXGM zWyae$*U9r1*|$IU)xwSqK2R$y?naiuvdV{UmmB=qi`G>VH;r#4!wZqY5zeML+BWL# zZWMxF8m+K1T>XU%+5;crO7ckuyH$f=E9 z7d4(-qzFWYloN_-1oDl9u^};?*pdbSvL($-Q8ElRK9;fr*+dl2 zF{`j}z&ru2JQQiaBE7M`Tstko{SP}fy&FPJV)I%B=*@$xWqPBm44jSznvcc?bHAbX zD;aqgjaYQ@E2kIsy7>`ra7jMY^OLFlEaCh@mUH)P-cvmn1`O>xb%d;IPvBvtAmbOo zOKJ+JLgekBSQaXkWdyC{?NyKP>ZS!vg(PCyLj@?whX*F})YP2zH;;$A3R56Jf#Uy zJbU(o z;_@}E9o)WJSvchY>9+vzfU54WQ7*FMQQhdFOtIq`68sH|BJI-P@8op$P(po|>h5`* zHn4RigNt6bWYTq`K_}Qd#f2&s9 zN*!}lp=3wPe@sRP&}y0s37$N;7$4EqN=*MsfeAFh~Ey6}L(5}2Jk!a)~qqrHP0i#%Q>`TaT{m= z25;{vmhX1%g-i!ft`_O`{W^L06tsEmRK{0C+G1@6KAAfI*o&%zU$j@jfCi}m|N6a} zeSI!Hs_1x70VU1tjnGerDbCisy~{5u=#ixpY6a+$SSBinpNjF+poHk-f3H61P_;7z z2m|#6SuOO-p*Y_P*alq!{%UnN;{MfcoNKBrxqpK1ofELgIo)HKRzje4tIj)r!7zTk zg2H7TMbO~}can$cd?R28D5z+d^WJ78+=yWfTTfhG(MWU3)?Wp+`r){SnZ&U(ysqb? zvK}rGW|;hRZN?HT1lbXJw)aUI!(kU+y;h9B0bHTI5Q&HXsCZYUAn8xnQH^~1U6p}x zZfwmYVb?ZWKU?9jjfgUOmRFc(X+*IRzri#8cI$0S2ETw1#f45X|34&MpUUjC=!B_I z4L~>Pej6O4wv<3|n-a&qLM4V|b=cqKzd~2Olt5|@>y}VWKjD+dr>epvmpLyVn2~zrS7CiS=cIM+m-lQLeD98FHTjqTM?OM*pF_&ceh@leMNE z9xO|?QRv^z)Tv}B5fRw@2s?1aCSq9CEd7u#0&m7vhA}F8uDX3z<}$w!^1<}rmtQZWF=)*R@iqS zZZQT%%TMNZP%1mw16`!))*O~BtA<>_L`C8CXE&;E;`KWJ%B-s`neZ@MU!jN!_}zrDW~~ zT7q&H<#6^R9d=UOI>q{}#TjtbfatasM9YLqUAc?I0rv@F<)nDam}!{&X*!cBKV}tw zIDo0l(?Z_S+UOT@#9Yj1S^28yFbL9GqLVBs58*7@6RSJZO!IV86!H}BuLKO5M3FS-(;L1lkG8oC$_fEXm88TJH!R*XuT94a%nic z8KPI>=Kg((nU!U?`Gc>Ilop7N^A@%x4Z>uL^un9gq(5;eQ;Y_5<*XGVdt;x ztb)|MaRG(CvVZdvF@;hAR~SDk{4x_G2$8l^Xd|x2T4k8Y!?TjmJz?VW`rwmzcj1nA zJXP1xkvImntnIa2<5CjH%(Q?LhHlu#oM}5$5P$n=c&u|oZ<^B^1vo? zclWx{(u!VNg1@|7)pn|Z@x1PQvb>0-&a<=5hkY2s(IokUX@`JO0Z;*&)a)E!=_iB6 zi1i{TX9(ECAwG~mN8<9hC5`^6{*4saqBi^ZLom}_ID*Ggd#mBPMY6c4R>Z6?1mXmR zCbZyMGHh0<9X7|nWXCr8e65pHTqt+D*mFE@v)n5y7XI!fMP=&4a-0OP9A|S0eI{sd zn8ElSUx0Nh!N>=ky-Ks?N9bBsS>pX>mrcJ3>S}nyUeMm6^>Ib$HZ=2qQv1{V2@Rx zTK(`IO2;HL+h>LJ1^xPl>wTBsLeI+Rw^(mfI0AAZ-lEzXV~-KAt?-~gpq$becMCNe zaSDhr^7Bb=t4u#We!~oD4~B;avFUDlGSrJ~N%r7MN&X$7)Aj>#fySon-k~B?dyuXm z#|4&cpZXEgPejDA`p`dGRPyJhXf{OyR3&g}fzX|;Pl6>_&&kBTAMP)c!w zQL&TUy{+LOA827MU#0T%J7iNNQ#ZW;&Pvp1zzwlH0n{4z!j02Jd#*NiFwjEEh?)0c zYswQV05|dtKB?W-MN}kI`vZ}y3~owa+r|_^_vf>-9pSu$9H(a^FYiE#reG6~ZTozcL`~jS?lGCD)#*%Fn@i6AU9nkWGcJ2u4uA3I|EMfD2<{(bd%qu~7A`=`q z18w(9H9SH~`0syhL>FGHQj9hKL+bmEIX5`NfJ~hk-mgtC`Z?eSR=0UHPscOcCQ730 zUD-B#vqUwsck422WWi&|jf`SK>?SOeZJh1v6rkwD16opE9TfMW#%T3N1Y#Nu1Db5Mc8lSVb zAaNI$RC(cq5>XrI8B}PDU?43^6NUiQ9cbN19&tlLH&X=r1X0>IZ<@dvUJWzW)b;`vF>jl503tB^ zob8aw`R&pE%~}`C1Kh9XENaa%$wRJ);E=EYPL05LZ-C(EcjSkI*-MT7i`6qAlQT4q zvCX+{Mq^q|NeEWH;Q3Si*y-T5v(jJ0vr$MXB?YWR^Y_Ku_TyMHCZZ@$0#aC1kw{R!DQpzrCT;&R3;^_WI+9K zg=@mq{|*c0_A!{&%>g!S!rmY$K$I!EN}P;}Z_Q%E04xS==F5gVGwIe|4na<#c>t02 z&%2PhO>P$9o0en2CNMGBXZ&bP&}3|QX}c_lVU7(mBD zshA+dKQi+fG(v^5&F42YO=18Wt$;nPR7bnt*9QwUiXGnM@O}&CVq-l8;eQUf`mmg9 zQ0Mp<*=T?$0+U%9W=h?Lhi|5}N0m|<)0a~+8sf+yY-6^+Wo+X{a`_CsY*Lh132;E*VFNtb6_Se{bYl@!12%73P((D**jf(zMFP915`en>hwBvq zt-Y;9y{Kl4VF{RH#c~_`=c_FlKc5(b&O!=GIxa4}mEf{^rMucs#%3RClbc->8fJ|K zW_PO2lQ*G`guBse9S3#cB#kONmFe+~8H~k3i2sb>cW=xO^I099 zq^Jlr#Gt5`%hW^1^)||0*vxLnTLNpGND4bI605AOYQ~p@r2@v&b-bMQ9+}*kW0LMc zvac5#+k#{oBnL!rLap$y&{Sn-X0#tR*VDrQ`kN*@^X`wDBD$bsb=%@xpY5#bwdvG@ zniB81ls0>hvh~`U6la<*?i$+~AgpU0vYT0YmGd0^5EjkVLIk^=AT$!#s zO;!0hf4G~GTyB+xLIDdPbLqpA55k^bFBWE}mdI$Mr}({&5O>yWuKA;6Wd?9q7PPXf zDtgp>ggXv(!kpr4Hejx!@pqW~2F=dNjef z#c0H8UDqRe(szI`R4UR8ZuciZli99vON`6ap1RO`!2i3~9@&d%CP%3X@-h{yAQAu| NC#5V|Ep8h6zW~fu`aJ*u diff --git a/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.png b/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.png index 99630d0335eca17b7dc57f13553cde0117354e27..624078c5450698fc5e23061b23085bb07d0a1a8a 100644 GIT binary patch delta 1451 zcmV;c1yuU$t^w<=0kF6M1UbH=9h1BPrvW9CWCFzmr?O!qvn>Nc0s*ZM&!kqU!=QF_2K884bIb5OPeZy^9<)aGx0``drj zBLLS-8D?M7Wu%98<4r+%#*#5p9wq=0-IdqRox6DP;w4KemM&egt7_>>yO-WjdjQ_* z-UC)Qg(>x)MwsjY_;XFWR{gwI)2@qrB1{o~7lQ<}{_&50+`3@`u+a9j>6F(`zg_!Q zWg=*UwQL#zh^Trkt$I1c(*Iq10A8VG+#dNvm?WA7i4uVGuf2A@6@b@98w6w)#P1rJ zde<~`0Qw&JS|*x@0G#-x<){#41Ry+V8ybHvzqI(bW;ZsoA^=OwZfq2P zYACRT06bR#SSZu)tfv4BctRX%P5{DN3vfwT0$x#GYXJ7qv_)wVfVbRooy@;(3kg6& z=gys5H_86l<_@sKl|Cm^$ftF;;RRG?29D; zJ02HnH3ATxoPYhU&>rx4)^#9}^KWr~hIUz`*Q||`<@lpt2Xc$C&PDU1-55HZ&V!Mu z_TTTzfBtH=^IHGruYXg|esh6*lKr=!Hbwyc@87D&{~db-+5@oD82L|30k}>a??3>; zYZGv(GyitY)oKmEzM3{SjRNrBt|I^g0cg2FwfX+r|Lng)0j!d0}@ zn%tf;0T}&CkRmJPeog?|15h)kHd?M6E%B4B2W++ABHj{z!7aBei2AKa>2)(0^W;9`pJtl&Un&oc zvjVM*YyDU2Ji!}(;uwI-4<5{kv|-O0@uWroB32hym_1x3wXwBcq^(}Ms+?2Iddcg^)bwMO!ui@gDu zT-SkUTGV^u*CyS1z?%Q!j`x3N{*ThQF8H_VU-LGA&2BJY+kn?-t^NJt1_{8wi?;%g z9~2@|3o!G9_>)EeB6h9SDBzMl{-@<;L#}S$3tXCP-wT{o_wNNRO0Sz?8J*qBvO5PB zbk6qQ0oBs%@;nJP$?OqYbGd!0>0K${=vyw5zB@~(BOS-Buxu*aC002ovPDHLk FV1m$A%PIf> delta 1451 zcmV;c1yuU$t^w<=0kF6M1UkN?9+SKQrvW6BWCFzmN`t|%vn>Nc0s*zNa0M6x0j0Bv z2(u%9=l9auUfJu4zJ0D}8@UG@)JwadA{7P!qx67fGF~)a=Adi`-a-JzsLkL0_P774 zM*yywGR(fD%SaFH#+!ojj3r~HJWK#0x+|}rJ9qKo#Y>h{EM2;ESJl#&b}zl5_5i%q zy$7sr3RCJojWF2*@aLL#t@?Sbrd=2LM3^FfE(Qr`{o^11xOKw>V4>}4(^>rT@G30K7uWxIOZTFiA8E5+wlVUwiF*D*&&JHVDWph~G6b z^{#2?0Q5cbwM;Y*0XXqX%TXc92tat!HZ=ZTerfS<&2DUz`yedRv_5yFL;#kU-PkC9 z)KFjv0eG$guu!JoSx*5N@Ps(joB)Kk7T}Vw1iYfW)&T6IX^YY#0B^bFI+=gn77~Dl z&Ye5AZj$}8%QO57nqB_0pIvT#jY3A}&Ns-^yFsqg*&l$NfA+JB>luJU#a9pX*cVFx zc04ZDY6KuWIsf`yp*`U9tm{A`=ilOg4DGT=uUQ)>%kf9Q4&)YNor~s2yD@Y+od+XR z?Z4lb|NPZ#=e7RLU;n0_{pJGsB>QhcZHxf?-@jFl|2y^wv00?=}UYV-ZK|Ji?q1Yl<)04*`3oN_HO>ZFpg8}%yYWDrLwWj?{ z{roQ@1+z8n@)uuJjl=g}eDTHqZfynN`)Y}QSkUH`;C!vGp#yNGsJWB?glAVcM*-(r zr}0G@1N=pVlb};`5@g|3k#81%lWt>xD)BDY+PrV3+Hd5KKIYWN4aUnMlOXS3t~F7; z;NOIm^VnAb-5WRnn;sOeX#^m=o4ecI1MXF809Le)a1wNi1>l1D^Zotcs|Y}U0RFdT zHvN99X{|eV?%b^N<<>LJbr!g@wMk6s6M%Ds7)Agh29Al~#Tm5*U~!~>lc1CFMCd31 zc$IYpNR$9fw-ceQG`qn1+2%LzTjP8Y15o>GBM0Co;vtFybR?oA| zZfu16LC=kN5_B>KV3u`%OBc5ZkPI#3s*;kcG9picq<0HYjRC%RP4>@X55V|Mg1jvb zH6;KMlV(@HOaosW@g(TLByh6b4JN|E}@Ub$%iCTjD2M57=tKMZ6{cf?IA`5cOM;((7h0=E;4=Kg~4lzf>L? zX9Zdr*ZQy4d4e~8#4!MuA3T^7X~Uj1;z^AFM652ZFnhq()98bM(HL#Vqzb@jeP9pY z36h2Z_&5K_%|HHY;OYD3>%R%iiNr4e*9lP&X~WH;rUwCt*cn#@@0#m>YK`PQ7kdLR zxvm4zw5a#QuT8r3fHnWc9q<3l{2!%pUGQ(!zvgWKo84ewwgIovTKoIO4HAHV7jFd~ zKPW_`7GUNH@h6P{MC@9tQNSgA{7=ixhFsmg7q~Rpz85&F?%xYslwLQ(GCI4LWp@rN z=$!4p1FEIj<$Y`~*HKsi+PxxQOZsVT@F)NP002ovPDHLk FV1gg1$nO9E diff --git a/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.png b/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.png index 8fc450fb2fbe56c512522497ee3560e4c4e59ffa..c997f493758eb1f08ebd79aa3f657d52526ca1ca 100644 GIT binary patch delta 21020 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 UJgD-&C)%sV*Du%pkH?+=1p(Z1&j0`b delta 21054 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 NH626k5>4Ci{{fHTPBj1k diff --git a/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png b/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png index 4e5409da7a20544f2298d9b556f69da9b4926016..30d818277c70f4aa95b401acd163834922d52157 100644 GIT binary patch delta 18589 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 z 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 diff --git a/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png b/en/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png index 9c4b43389dadc4c15ca1a089d2e8b8a73ef37b58..4c545f763466d8d3f558c647334f55e2412b6ce7 100644 GIT binary patch literal 26815 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 Pzga2DslBL>H4FYPvqMK6 literal 27100 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 ZgK4&Oor~#}{_pQ26l7GT%cV>L{}1qw2&(`9 delta 25599 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 diff --git a/en/chapter_backtracking/n_queens_problem.assets/n_queens_constraints.png b/en/chapter_backtracking/n_queens_problem.assets/n_queens_constraints.png index 52615c0474264007a2dddec5e982a45fc7d2315c..8072791ef585b971b771098e493666a9a7068ded 100644 GIT binary patch literal 28721 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 z%0A^)n!bt?%1zHM&%nw&7IBfuxNFv~JqU?ag=2-PeUVpX0%s~WZc)$Nihssnld+7s z6t%;!EV+%8AI#Yr&kUXHIV6`P&z1|MKJ>GGa8aHMR*j70 z?2fooZyYC8o{_<6?6Wk0cHx)OCMF$VzsmciTx}`GKS|dg7^eA*%(2##o;z-Vuaj|- zWwN9x^r^k4;=ne|&3UqUaCZCJla**1$ssLwGgoAuUF-w<3*vU2hw#lM_UpEWx2*~T zfPKzC>e;)a+A(rV5gMYQzmlnZ?l(`xH_u7D2v%S>%%XUyv%!vFEOE|aRJtG4?j|&N zpLn7=Cuij>F->KI4ARHXkAknj3o1_-7nZ{^73G`DItPg(T7O8+JqVO`@Pj%{Iwo;G~vxW z_PCz%#kZ{Kn)i$(5!WMse>b*SDRr^TBr3w&?El^o`>OFR?wJ`UUFrjZ=4pzk-M>^E zPQNrdmB9@KQ`p*s&eElF_0Hq8(mc6XAfPEGSiFurDRcT|89O>pSn<65nm#c*?XV0- z_7_e<_Rll##mh_RX2kd2sB=DIS30#%dCUJC%o}5L_Voqq&Ar}U{TjihEe~6BOGa0D z$1LTkx@tBpC#sF}n)L?4Cm;31DtwZZjMHU#k6V7Z{$8>4HW#eaF*%XTiNZV<$gEq` z8K{6y-bbZv5?VmCCs+-$3Tr3u}YZk2bB4cbAFW!^;L7O<@LJeB+u+{y@v5&$!aj!;6rN zfUzgUmGIgZ%<`#a#3r<{ptf9Ut57Pu5Am6FDAgea)o~K`NISrR4-K^BSvc z`)~y)<-ah3MS{60w_OS~?&Irh*rr3z#O_c-JK}_}bTBxA4^?HO9GaC$)Xj_hi5+;E z7A#-f-Y1fT+dM`5S0`)Xo|c_4g6`T1oHyPxEr43INNoC7RVRrdA^Rxe8FQ|s$~FA8TQ$<+ZCk2w0CfOj70h{XMm z_0abyZ?tI$d(sZB+T~SyXj4wG1e~+~FU9SqzTRQ2nYbFQnR~ura9PD)U-|iiNW_XZ zqAV1K`)9RYYRI}4#Q_$9#1Vzh#thj*EH}SWaB+PW%YEQtVaJJnPxza6=a@^5_&yQN zs>E$iI3BeV98!G5j#R#KdD<7k-OXDpexVxPtmLalJm#^wYUs&Vqe))`Sg$^xNvtik zu%cCvF0bHScavDw5F3#4*T{=P=yUf{b+HQzwcmU-%TWcm3fh@mG2zH{fxi3o+9EQ` zE-~izOAe~4t&eugV=e&D%S74Uwm2u`f{@Ni3;@S%6V z925WyQPV|g(Hytfd_t#F(g*vO42T`LHs5ia8&SVcr9ZO?Qv$!`;Re1~jjJEyj^i69 z)b_F`HCwMJXfl&Ley!>AJ1+lcc)45pJ(5Yh;<{N)-c}bml5q?e?xD~dlSbpLHlwRT zFE*+VXuQ7tJ9I8LF!;%j-l!=Zsqy6YS%%cY7K3{Txn-Dnsr#6?ti)gUc(>%ze=8=I`cmy>7>c;7 zmSmP>vMXxIT^D^NI|thE870@WS8?BfOr3!$_+(cXKU=rcCu%b%`?q?vMsPJs8?F!e zG0X)(bV;Dx>8hDo{B&2|-s?|fCa_1F0oO~P-FRU6*`z&sZ_Ha%-)AWhE^f&>Pg?Ce zSv+`CE0CXER?78E(aVF7j+IQ;Z{w*^4Rt+r^TmJS4Wb8y(`myABCF53BaufuUS%5K zpsUXo6UFA^U@J#Rhts5Gu)1zGC3LJ_9f9{to03=DbOrOeEQbmZpWBR*=`_dYOuAwk zA_Sjx1nD8}K1j-}8+r`x@vR!bw!&b?kw4P${4oqYoS%PZJ}nR5{(g!E3|E-f@QE$j z-MIKw@mKzXk4ErDW>M;ac08ZzYVR03|Muccu2u_TcOlXmcsOnp_2pS-P@;R7zvr@e z`UsbWioD*+fWc;*k2No(#s1tiO|Lx6PppWY+pjW^%X-X8T9Kq=)!CCjn#t$f&o?w& zl~M!ctD+9;1qWywzbzP^c^74f@BecNb1cZ7=N*q4rJHM(?NfUz{}#p_iYE0a7_lGH z3wh~Mu`-dxssE|76NoH*v}$i$NvT5pktn9*Gyti6CC6GcFD5YQ>Z+Xay=?cq#hxb4 zSJ4(##rluV6{?)CkpH>y#6!%v=~FfBXU($>`pWvz3zNy(0M8kVn1SnKL3-JZYV1F4 z(^t!f-i=QEM_fV{LtRZ|!y01t3lscr%u7oD^hL&TxY%DwdX{4=E9<%3RJ{4?gJrnr z4+XugfP0T^6Xv_fnHh8MOKw`x^@ta=`J`V2FqLQHzsPgQ#2W0HnW~tps3_$zODA~q zP2#x|Y5#h@Kch(2a&bOMv1-haK5Q>0rg7O`o_zj=>X6D+Fp@hkXM6O{SIKX@ojZ`e z<`dJD+Qi32wC{>G3opDYqY!>Bn~U9wDs`(U008#UKhrMrq1_pMoywj}0HCRr?XtP~ z>njY{p${-_Z!smD?*xFiAzfKsU(b6h3Y+f0{@;*_G_!$QoUhXPf`R?_rqsM3$$tjLT3`NxQ~r03$#7`ari%-Ui*#?p1u0rf^^A-(H0Xtx!;Pg% ze68C8^olKnr$;Y%K1aP*ZTs~{Jlkv|LY(-SlpW+~4 zED=kyS%@_e$-ynj9hSmZ&!t3I3tw)Z+LIQ(3Mx#xin;Y%Y9~bxx7?j~m+0tM1p&U% z=ZnB|Dd3OBcNl*5W@`lj0XuMzjCZ>`iAlawbUmYC*Wo?%e$tD)bS{@@CRmP z{XwA`w-`a^^4rJB@!5k!C-xXVRS;i$n6kT4lytAYyAs!SSLl0n<=I|J=XL1{>-j_k z8!IAK_i}&8r!~F7&2JK(FSOX#W-bG})Ul{G$v&FEce{4E_7m?A`h#1Htv`RMc%N4p z-~B!9E!!sP-OycvWSzyJMyX&ix>B?z(RTHf`H8A1Je>gR8xS>25y%QV7o< zo6;tLWqkm+d|R%;VoJ#i1)Ud$a_}UTT%{D0@M|l+(&mLp-ab#`Ns1*IZ8Y)$(%N^M zoO0mqA?(rF7o_ENg7IYLL*rM-4=*uqP!6AcjxWSF3Gzt^Spor_hhXNC=!~#t(wf(v z%EXB#4a|VKPX;ak0{7XmQs0-dH+gqDqMcc>;vWDX_wUDD=PX`B9&2AEc2gvfLfawu zp%cU?AuOvDASPwVGDPSPUN}$_K43+YnkxxowdX%y(ekhC{4lEnAV|8MZq)9!od>_j)cEKUy!KiQM*pR%WnLE5CkE&2Dth!)1{+@! z&#CSo2ndeeNC#xKZyAj&AFD1_#}eSRQ)p5o>2#IZJa1sU+@EA;?Xw_OxL`t~o5o+b z)3F7Ob(Aw$(qf@jt(gxYdZ9pO?Bkz`6%{~e*~~p5JeM063b7&t(>=vW4RXRK8OVA9 z0G->&5rn69tH)XhJ65OFFqTy0yEj$@YAh&%SSh7_+uwt<8X!7xu%=qK}^zen8FfOe{eh{b=#3qUU zX>R?!#_+d2g%wd1zBl#qqe>`wU%u zcC9i0Myd=U*?5=_EAl8GFv*Kp^MkfxQ;?tS-?FLaR0y9S-acAyNDe1kGl?U9oPs2( zz953V(*}QDTq61SuuGU7K9qi2)LJnVj|S#Mk;CeeyrfEkHbGEZ%yz5MV~6W%CpRLM6VF2QNY%? zYov3#&S|2v&om9_n}pHoWQ+@YENifLZzws}_CyGzNuCc*`ag&$r)3qz6jARdY2z$n zVTMZJ_kTmnBUYZlgg(`vXMl%b{GJabh8gv^?3#jjssZKG`G({vW2FQ*|8Plpw)vLq z0qmVFNJ_(r^*@BkAYob2!0o)h3IsQ2XP83qGPl;?7Au&9o2#peJlp2nFXS%q4t96`?}iqxWWH@;js~+|?QE>_zJ8)5=r(WQj1p|5 zg$w=j+Nc9H+4Q4`y&ifY`~xtVe&#~n7t3bARv}7>DsN+gRURH5if&$CUzajwNdc^d zg5((5ZDp6XaC1(UEZ-Y5UXn=n7=YX_Ku^`#-=>UL@ZTuK#ba=2_ckS{QZ*dj! zZQB`o=C&w&g9LF!uVtF(M8kM`ci9;Cex>35?lH`cBEZ`+UTk?k*h08S?mjldSgP|5 zosEG^ro|_khK7sM?DBW}Ke~rA&!#o?HT+j`yq+FM=i_{Z^LB^!i=$gb#>|O&3)>nA z$C=ZVnD4|pVOP>*wBGwF5fMIE6FxX}b#wc~?DC3oA^7piqi&sVk8_xiT7#t&efNkY zIzdSeY>l6X`&P_H8FV;lgd4#Pul<(4VIlCU!^672rnBrRlWYvl?BFsU+@-k!Ni=iM-`Aoq+u_!?PzVxsH>f z*M~8+Lg)c<#<$%K*7aih!1U}Iu#iYJy4SL-*I;~`2<{K0)1>zHYIIM5IYcPfC%AN} z!{v1$TFf8??i>GYN>&7863~9}HC3F2l8O~!nF5cJ6xnAGbYVwc>MW;RQ}MNqPtY|Y z|Cks6uwio$%FB4ZY~3&!NVlQYV^|$dc;k?^hHTODU~icghKKM$CDHq3xo@4gZ;weK zj{z9~3B07G{#8O~Du=b4OAR*6A-vd|L|KisE>g?+qg>hwT9wWG_y+^zUbWo=~;>XYM zSH-`F1yo=uQwv#d#v#>tfI_ntN&)^1?jlAxYX|%8md7hjV+83JIMFb&g2g8B3CA?9Ix0et`PVG)uUDe6tQ1^Hg(&QOUQ%CRG4ihXN}N2p-?4o z%+%e(UL{-iC0!~c|*7eY&A#|}7VK7aHv1Qv?;JufRykj6}g zuxu83Pm)W_g0v$cO!52I=mr7a_Qsts4nlEC))agQ*@t(~-tQ_qm<9~_AHxdA8El|t z{Y3g_roud$O3ff4Tzn^GEH|11QYm+*nNtE0ly(`l7s$tjjs4nWd%4ne{yfqB)+>i* zUigAc#SSB-7j(l_&)8yUTsn-pGY#Q`T4-(qj+zEj)cOG=4rTA}D3XY=LRt|o6imub z8QZ5dlkL}d57oy3pL~8j322MfO(5-C4&EB-m|#VtL>%EEjFU zV$zR3fjn)H-YfQUJp`{=nN|oqNHegXq|ftGHNswkOdEsh8}Ru#EXBp820}58GaEV_ zRa`UvYM?CI@XPhv@bXx^h5PH*(Vo!uly~{zUR%XNsGhxuKEc1KWsZcEeNnaY2MU&C zClcc)DgIfHS~_hS36k3HnZ$g>4-xv^>37!|A5*0+o`thc$5S3aEqdtXKe*BUAZ($O z=D-fzux>dVUCDgHgI+(hcgyBxqD;q9vf2kck%3jZRw}Y#N7qv1Kp`rO%Q2#)zz1V^ z!&g`NDPkpfeW>Fzq==pbY~H$Tx2e3ql402Z-~~H&m%fK7B3GPe%9ZKK{>|$M)@t}KjM0G|eF<~+*Jekj zG+>$jqgcNU*@joOW=7ZlGZ$9;{RcnRQtXx-yOxB%?hfJS@82GRj*cXM#=ZL_leA=Z zLBNZ5n*tN9zox4z$B(*wr2p<~YEJAg4oW{i&z?S;c32s@969CqBRY}1L;zRQgKZsb zJH4ZQYu0tB$%geemYOJ(Z2uZ&cch084@(*gPkL_ax>s>Tj)<-F0!f#orik?aX=Ndl zyr_|-$W$b*=WWf7uRX-)zh2hZY||)&nG}lU6$Jr*xv&l1tE_)6x3AiJ&eQr_?5aNO z?QUia)u_9XHV6ba`w=(yJtcw?Dl{dWv{kkXk#*1{--e>4=bH#=tH+wAv9D z-q~a)ZJ3>_JeuTim$UI)loMmIuj;K~V^$**|ti_pK3_bzqP;Tz?5Fz#wlR7PX~ z?k6sE-nqDBI{Mm}cX*AV^ZU#)KKy<5(I4UKxD3kFSol7p$Zs0_({PV?9Wdc;<=E=a zqpQi1gAeRrdyEmw@e&_6*)qzhXYTAvW~J1RpWf`PkU7R*kicEuu&@Tf+y!*Hh0!t) zBh>j?kq@oznm?*Db0#5t%mOjJ8SNh>9?YaCg^xeKsfgdvabl7O?N|^ccQ6q=msgh| z7Ll~i&gi8$d`Pc7Tm?J~)Z+C2;s#GFnUIz3!TZV5O&TI#Sxvmf1+eS%sV`Vkiym>H z6BtGA!N$!RlSEG`;A*n4so7)U5FP03%xJP=pHQY2z%~UqhGo6Re+L_+?Wp<u%Dz)@dkB+taSB(zbbht$A$G*awX_IipIJ_Ka z#g9$8^mug*X-7Qr0K7q!YJkT=p+d!_uM(JXFUABe-tD)&u_d)TGGTx0I&Ed}loWmt z3GkfZq)e_NFResINnly=0RJl*sAq?-7DgS%PylpG!P6O1bK4bguGAVX4+rr?uq=DT z56iFZ$~(Qr-Y@YS;rh?#)IFBvKt68lCyW4mXr$qj&yCc|%V;CeTogkFf3mW*wZ5)% zYpU(+9@o&HA;Gl*B~4aN%|qDb#Uie#VW)%t-1t(m*G32>a;P&yl6=zp5%t&*uPKZ! zV=QK;hYc|9^wiVXHyn;kczJ2JLIrCA*s8OPME$=_1OFm#(w&hc(k6VhA`Ta}b4D7t zpORqc4dt(2f$BL~o-@D;xdflQrkT51jEZ1ai`GB>Q^*wKEw&58@FczFaZcCU%F zXk%K~toGdaGxDU#n~!J2Zg;S*(FX){o`Q{*WQ;OWT=njt48+j8X@G=GMa-~AqAyJ~ z65ZfklLuD9i+^`Tt3A-DR%9mZYl*fos+ginOVv%{_x?2`@pDI2dH`f)Zn!vs@ zZLbT9!7ep?i657>@aKu3BFDYJKth|DkNCNDf{U{MKTNHU#Yhcz%Sd2)CDE z*sGMqVCKnGe=8()D7k&uWiaj=vAH^J76U{ktrGBe8YrnTI}HgEkGK80(|N${b6S@?O=`X|8n!|2?! z52O+&ydo*EP&L|fX>|IzF*AwCh;PJi8MJyU|9U8sW=T>b{VEqWH?2k{i+fx^#(?e8 zXje3pc$tqqsS{z2i;(4OTn48PeJJ_2J6@6)vP$&%nXi3{IfB!*==v?f+PebmwZ^~isk}$zygYOHamgw~ zH`Dv;mJ!!-G*4sBgE{_l7GGfS0VqLgr>f4q&~lfexI>RJ8gLcGJh%4Mba_plgDN&$ zZ|JFF;aApyQLA>En) z%e;XR67Zoz0z&n5mb(%ZA~#{LmsneQuvO)RUmhy{7Ad~P*XKr}_KCu8Qj>+edNnH{ zkTh3711A|LkbCW?#?Ks4oc01j{Bs|yNSp@mdnzmisW03VoLOXKwlhKj zhE8}!Z$3Nvmg3FVy_c3M^;Z94G!Fm%CGUZjum@j zKkjXRFM&7{z8Eq;fl{34S6CUYrFC6gTNEsNtwJn0Bg+(S)avoXfu*#6TwMZwP52NN z>0SRO4rp6J#IiLU`%Cwl*OoS_g-I(tzg3ZrO(?qR^C|GlaX(Y>|3}?X=@>bUc24e_G__%HMn9Q7!z3Cm0RLl98+1vvAu4X!O4-3M3^?7 zN5^iP4f}92i6CM-s8VgPteO`LhrGoV_zk4~3+5`|wq)^2%?BdSD2(>Wc-%XsXH^gO zbcch&4T(kMjYRj_rL81F?#1VmIEabnL$oT-!)tqgyC5-{OMb9KSFnC>^=X*EJEKH4 z&j2n0Lh|*LR!NG!R-YqyM$5}Nn$*gEe`Gk_W%rycvrP=Bo0ui>~EQPjvnnAHGgDCBAZevzucXn*gcY4^B~l8LytymsV2r6Ej^HN<1YQVXTTGpPL+`kVAV#!0~so=S3KV+Nq&SBxOKUI>C(HsOg6 zV{X{T-`OV69&j~cM_9(dCXQiB&aaQW!2WVV*j^#RYKC9FgCA==cJwb&^&RXshnM&G zR&zI^!7YZF+G7Qd$%k12GB*ZUKiFQexkVgkLCN_^XPy!9G3_?$v1!tYMg5lU?!$>6 z61&RR+GMpVihHU1%9=Bs0X`mz`<&v*)#XT7hqItmRF<%Cg-rvo3_5-?x4b zM75M&e_pG4ImIGtb>_U=R>yMaIXZF95Nw-~V(eXZu|RT5H~Sn?r~%~L>2@L#b|0hj zVH{6OgiZ2kZ+C`4>{~mZIE$)9ZY{9Gh+8%#wZIE)IAK%0XpV}w0~aW`qI;Jfc6On8 zZ;a@-q>KqY%wP$d2px{QGgLF}$x)^YgEPy<87cfSo2#p^3*W1MrM5%~q9vsjrUe+G*mjtwwo0a|R;8m2poZhl;Q$>r+@meHKPdWA(Klj$` z4GIpO9>zgf3qrrcL*7XU8or+I3Tec=hRPCr!&_=fMdTmf&?i%vP<5J~94=F5ZiO%J0X!~PW z=`2hOEK&ErVo26>pE%H-UHmxLQQd#Z4pIzijAm~6RDKf-HgL#trH5chKqn9|S*oYw zr_cTg==BBkun2`c1BDx?e{nJj!S+&^!+}%7_kbiqd7TAux)oz3jAr?BVlM!ZegRNN zu}aQ6Nl4`^RMgcmT#FYxWNzp#f>F_$k~IkM7>eYt{Kw8+HzH2se+t2O?I-O~JW!^# z{n2Xn)7`8_&c~ouBJ;F3;}mpI3}G>ApSH%BMBI-NqSUEoWGEOjn_iiw4`jtv4dELgfO4EN{*pwckP^!@$0i9le4$iG7^-9mW+3DFjjGt@v5Hh(KM6SzIk^6?WO zc#{JSewJp7HcwVVoXna#J)DUe!px81JoR!C!rc9?2$t65@>>os4`%rB<(k&`J<-CM z?#3QlzFeIRB#+pb}l)P$HPPRr?LC!&n889 z$kxyXg7Jkl<-d`g*Zt;ykXdq}H&3>mP<`s~M0U@tp%Ndz(XH|&;$S-2i0ysR=)Zr| z3;i18#&!q8qYZ-@#aZp|Bu_boRhGw2>Enpqn4C9C5^7$_4IWH*t*4#o?|>S_Q=_xv;E9 zioc`9EzS~^D(Y_qiBw(8sqhSn-vXgiVs}2LZp-^l1#iJ#-XtZ05+&g$e_{WK6xVfY zcl+AiP?~)_E7q40ak^1Y_Kqk$_laV5HW^P9>@=8LH<8EmGwXIu+bV9dRAcaM*wn&a z*6c#X6kXgw)}ud6x6x31Jx|d$>JT6j_*cuh?Ct1m)T-fu((1g99$0jOqk-ru>eRx^ zr;sBd+fRw2!XT$R%*0?LRS&=p-W~HrLgiNiF{h$GO|JT)w(44bt(G^gw}!LGUS#cV z5H2g&;D2uwU-}MBnWhu!{vNAv(L8K9xN|Cb2xFEudUNZ$5SoF+;SM5J30|ICG@wlt z4g8vyg{WjnevVjFaeZ0s&uxFnzlV!As9AqXab3lp_)pes>a5m3jCvM!F-3B#+3_zy zcBYKHBKXWyUq0gJJ{faFW%~S$a8-6`ju5JeYW#gS!`VSCS6GcOGFg^@&w-h^FYD4u z(S-{0RR2l<7g0#lK^XGJq5cBD7>w*`*lfnlkyWp{{!GwtdrTK@%y+wrKrRM<0+ zKjS5}({WcX;z5`HG_L%(Og-%)gZw!^HZ7jPhUkHL7YGc>fs=A%3x^o_oSeABji zOwflH0@$UQhE1QpiC?YKOoj%@VOgn=bQ9Ye{BFm@nWdp^y>{Ft7Jd}CNg#=1XRZHx-yQvPw={*&|QTx4C?r81>F z{oB8yMx^rM?~_>5w(Y^(0GBzkIK53>*p$sdxRI%+AT0#R3u2SCHQE%IMYO?^F1)h> zIQszO4|I}tu&mFUh9|+GQS=20R{Dq^GYW^l@)YPbsaMe*&wjOWoI6+C7W!{V>{v4Q z>+L-I3#YeVRZ1^J@%{v&__3Rf=2O9ymVdTRA@qtg;?AX*ICNw6iz+@Q_z;C@5NX5# zq?B`lLK@OBg?z<3C)rQH6cN~EI&Bd7v}d3Y?(ruUl)QvicAb=>r*yP}9~30kxp$7; zh)XFctmEMfR}?RP9=fw7rT$AL>t}8`&u5_`DZw94K}Cp^FoN~$oHINC`2^7OCq=%! z;4EA`7*9P-#7IQ|)kGfQ@0+`;V(7F$iDwRLMr6NuG$ryIZ<+6@zbtxw$GujX+f%1G zL7Lpsu*2nuUBdzK!&R0ioR(H#eDOV?qYIkv8b=5dlF_7ET_*f^Es`aQi3L`FDAB^p zMN;pQ6kRS5NipjOK5}`|V#~W)pA#y@tuJA80ZxlGt{Sbvf zgw#J6nu<#UeA)s8us_{;f&iVzU}lMaR?`!3X`V$Vk_%lS_gxpm*zRG`XRU&eyVS*G0MVyDlj+#-vFpebrc^tl$ zFAknRLR>ucPDVAmTQW`|oKpK9iNjM7eG_j!h@$&G99^nh7y=P zBWgris&ISg_j%SC!(IiA{iq{ zit7hQ>?pV{-O-3}xP&#sg$Cp7Fs(U%G<`io?j~Zz8>SoX4D^Evp!A_};s(Kj0J-xTv!1QR z4Hz>d_{;<#g@n)+@x#2A`6vJ4jRw5XzwldNlh0M@mLPc=Pz{k1k7|H6++n9v*hP#g zNJ!`(F`y307Mv3$ZO%)trrw9W7P}7fCk%@nP_}c-x(HQ4nR3hi@4k37l5w`go0t zUXH?HHIKjsr$`?PnW~WY!<|1W-*q>%RO_6te+~22Mn#mFJ6|`>-nMVBo5_3HQ88R$ zCf&9mRk7E@vT1jyVl|(SFeLhS3m<0@y^{uG1paUJi1)!c#ZPg*8i=@Hv=~0yiMdSY zIx_s)#)}qO>#TY)f6tD`g3BfYyH)dH`C{t9<9~{%Sk&BwHgW>6DHh6{wAfG5yESr`nuueV*iT3khOd}KR8Jq8{k{{ z&=a)!HKeqN*g`Mxwlg&=R*F8AqVF#}Wbjs`tUEHc83obLd8od#l}h-RCPS164xwL$ z%Z=wHe2_-X>Nt}YK#8d#DgM+F{t2)>gXKl>psO#VmB7qhjrS1fr44pBVw~X*ecznn zNLkT(qZeM>gZtWZP>;hgcfzgaaQbJg9A((^YtOvN=SRS%u_q|vQ{tpGayJF3q1;ASfR*+-e;ubE53u&AFRDO z{;{wB2&Vo0J5)e+40}Ylv4TRtAGJ;}?x^MzSylEK=-ffQdWl^)fUT_=uOcnKL)>Ko zeDVfap_(7SaE5zInHo&=;6t}La>{eFg~6Bwj=u~Y*=x+nU1BPs1o|OmuZU1zApr^@M-Hut(|8V=6t;^ z*WSj+@OYQWPg^s}P!wmf?^4aE)qn4%f-igzGh32HiG)I%`PxpPg);3ra>SAn?otGB zh#B36e|aUhNna1=hjFJ3D2dX=C=va~R_C^y1QUP9oH z0_-MJ(ZJ##%i4fwfS;K#^+swVPB;`{iJAL9ow7!5#jiTC6#+V`mi-5d$b1=4BH^c z7t8f&;lh55t3Z!xme^~eu4R?PDYu(G>NH=NyS^avE3il zeAme#tokNa8~SGgbg`(UN_akLAO*;2LaVR#9;!irs@eWioyNG*Cye}zTm`a zU04dhVXnY)3!X15{6Pa8ribT48d6K)umv2#gwQOh*2ou_mG(tUeGek^Z)V7W?UWFj8NgM2y~rvHcJp$dD2);m z3!~8`Z{@^SP+@YdSXkMy2Xv|0c$ZYf5B|V^;&4Kor2Rjt*wlPWm=OI;B3g$)H_ieg zJI(wJ`-xWQU^3UpWTaD%kztvT3yLNC2fK>j{4bOk6%()%4!0(cEk+gBvU0<|^JJ*_ z^50~|mTwU}uee$04(^7)+n%#QC8?#rM;O7Qu0P+-dU**dlL^yBF|XEOYwN~}Txc%B z4ak{87x0q#0v{R*R8hW<4!-zf1Uiw8wl70k zUV+TX^SKwn{~)aZa$nqv|BGX)hvJP$X%+af%_9T?RR<{r|7szu^BPA_Aad0fR{28_ z?Ekk@Q5QsNY_)8 zn=%2oNxN8+Z8$by8Pk|tCDXtasSUZ!jPNbLVI1Y;lzgd-POjlEyF6uPQ!J;VaOdp zF`+8hz1-u)rT%X0(tT$?{si%M=497Sg5s9aR7*QL%%!JnyS=t%0Q`%1$i-%0 zxv2YtE~oYf|7gUrp^QL&2$F^8S6?Ifzl!_Hs3@av{da~Lx=WfNBqRmt8cI?GQ9^16 z0Y#A#5JUzLq(MMIM5IMPK)Qrck(QKBQMy68{%8Dsx*z^`-4A!IJD-O2)?vT zo@b9$PUln3^(GHjn=~4Xg^dm8z|^P4#+}_Q61THVT$EV zMr!yssvM9cdIArTHK{uWI)D$Fi+gmM*=s%e%zYomvA9x?Zm8C}@@r=+4|huo9+a%j z_XJOpqk{1rkA1lD@#?x;g|YNR)Q}Z+?7?^HM(l)p z534&)o~%^`{7x;l+7g&pz?8130gfo(`#x7wxiVPs^r_U}(}DvbwWfh#pOXtszBm6) zrym?c!%;76erH*oD^bf@hAN|zHL%ihrN4NY*6CAro_eKsmfB6!q~G|rR(cB3%loWH3Hh_v@@oS-Iyt@n$BAScBx{=Qe$Y5W|)@* ztk;7hX46rYmr-%hio!}718PB7lURHZp|j05$gq$sF*@ ziPb7#T-D&rkU@-m8>DLE!g*MqZxNSr|GQKZk>U-%Pe~~DT+Q@e8Xe}{0DR((4T>7B zp9mICRz64ASaD#KF4pU;{3b<1HN8Pyf;AqIlp>8cQ~=KRj*!pc)?%g!`2pgsu<3Pb3k< zqP7&%hqGI~%rM=R=_EhEkEaIA;CTALQC8C3k}=UUXAfrLzbJ5V;ZqtL*E1&7%`gDLfN%-!Fi+)Vmse9CLu|rpjPpxU^dAEwC z+kNi8e$uR^k@Unx!O&+~*zJ9S+oXm|_+<3zE|so~I(CT%CscI&F!$iNP|iRk)W!3j zpe2zxsZY3YXb99t)W(B;bQVPizj->GXN(acc5L0Jj~JiJZXyW#1|k?|UK4ViCo z&gg^4XN|B1LHZX;TMe<;X7wuz3D-}60?uM_Z|1!Y$SIh92LxRs2RrjeexM$bhx<8{ z3nBz5ScGkiJ4oI7ibDYbpTzL5h5d763^I%``q9PkPcR^pGdjQHs0c5bp~gsY0|vxQ z0p>3O%9UmY-V}HNA!`V~61%Zl9r2hWBNNZXvpJ8{!seVseS|3R-jE&#(aDhNkIva3 zV3hID;}fTvTdO-z47oEeZky@U2}rnhIag#C9ssK027&&BKq);z7L^+o(YBzHy*67T z=7t3Gaop}~Sc*EM@2J`$CX}59FuFu9V1DeqN^K?;chANxU#bnqubHz*=RYb_tPgp; zFNWKmvF<3Tl5Ye~wF9YTMkjKFja>Tui2$Jf0q@>|7jX-D)Hr*2i@1fxKrzSXb{~nH z7gZ!-fCPv?8{mEAG)lMzBISg>X6wg=T3=)OjGhHcCEVtixGh{*Od#&Jjf^F>g&x(x-NFn-1YhSJ&H zSt8Z+>76Gx_|(LJ<0tZ=r@IA^`7#)|kXoza`FArc1%=UZ%}qf2gL{4Yr>D3PNN<)- zy|yogg%Wwuj^+7?d`Zm7E+nLnFmqjQ0$cm7n#{0Br_aoQ!I&sVsz36f5Wni)z$SEN zEfM@=6+bh=JaEXP$>*3*o|Pko5YUzIl7+Ngwz^Zzi3=i`zUhC1IG6_kWxWe1LK0+sA8n%NR#W z@go<2-7YzwtBeL*<%bUbRn;M0;RNZx~r$xv$9ePZeklFz7DuDU4J)B$D$t*KL2@@v=8#@AR zUvk4CD?yyu%DcQU$QL4#0PORIp-#RjukR5Xb*B z1qxIY0xe%{9ZrV>hLizTab@}d+4f6i+z8V};B|=7-bSP}1OAu*A^=NL1LRmchk^B7 zvD0F|e^sB!JpJ}v#r^)y@wCnHySL{JU75xfRcp63H{$$r7w#mJ;YG}a5^VYS+=E}qb_{r(QyYsDw z2JUMcfu8X$=gVy8ljpP2{6P>IX0n7HYL*4QfNW!b~ydWB)o#12Z4N(898JM9BNV!?Ly!>tBnN! zsCW8%@1W;&z=gU47gmt#fiXqH6-W>%;&{PV0~O%VMXF=7&Vrv6UU&egC}4$_AT64@ z>}v}6NM$clr? zE7bYu3?y^v$tmlip}ga7jgbc{;UZqU*YPCYrHg12{2Qo-0*wB`hMte|TVfgRwfOJ4 z@ZmDxbeIE1zyME){pZYY|D~eN{ZuvW%I83?qOQ?WcojPxs_$V3Sjzgpjb^OQCaE(D zdC=>J*g2a0b7HWMKa(gi6=li*v%WF~-vwd=FLtCOd;$sMQ^hh|-iNWUxFz;2sy82m zgaU%rzJeU|q}!JaPw5?~qKfw-5KRLRSrzM^^i4uy#$)_U#U7SUcHQk=qIH7P7Y)}S z{DbXbWufk1Z2m}R2b^HlXy^+0h zX41`JTjr94olERbb>k1L7Ul5wIyS=8ar5rsgU|1M#4m{%`r^^n7dz0La+7Cf$*!KN z1I)U?ZdL_A5Y~}f&-$sYVg;#&9PYfg}47Y5=>C1r>PaXR~0H^s0AM8L0>VZlIAJ`p< ztBpqb8n~bz-+V?+Ae0E_$-|-X?n&l$R-E!LFRm9W_2zY`4LEb*Mz76M^H30_( zB(C7Z4F0P@mucj;;9glQ(JfeG-xDWcTuCuPijZ9J^0aBed9(xuPbgoKCuP&Zhv3(9 zr8oas^))HTOL=_-a~L&Vu3(spg1-rXddFTi&H>fTx%(AEEdF5^Vj$3^!F=BRD)~F% zfCWa_bZh%p;WS~0?MvHu@b9EA5hPv85d}G)F#0>Tb8W}Q81^(kD&O6znIP-?0wC)5 z`op6$@$1f?$le5)%+^7V#y0&mS3arX@cDVFzRi1OWjT!uR*W`JPPO3Bcm>LPnFxPcv?)UMWueRRL!oEqB&H zUnwBAYO%tLF%~hLGYSC#t$|xnTAJr;?&G@gyFow!JxNvv5Bhd%k-$qA%MhD~+uxoP zY}d!ySa`!(41$Be?^ra9l~h5EGK&aQ+F({ zpl~c*^N9(*L`aUPV?+bJ6w2bP(;jUMvpx|W(-8+z7yWzz*0^J`VBtSuPT}}@u}P*D z|K@aR`NO*d9Zr1ck^$P8v4ibdEqZ=}YV!_7wUSy8mThw&cMzH?SV3#~j0?)F4)&yYGqAlL$m&uMqz+Y)QH1&u|Vp9HJ8n=cUI(!ss1 zb7s_?`P7#2H50*tlju-Zr28P_s;Kn@=~J!6Q6@U0vkLF1KXcu5pVofBwu1NTmJ69* zMg*@!a#3%vXGucCAZgkG#U>UQ%WzYf#0;94dJu!BXe3ag_ndz`p377~jBpUMSrsah z3s>OxDEO{n>yAv{)R4x5Cd+bNJ8UrrX^N1l(|hC?h6v;(~AT;Kx}M zj+aEd=cmcu`zZN8Sk70~f0@{&pKf+*=5@EOq9(F%v|K>N%a( z@II17j);rCfNPMF!}5j&O2=qqIpNXf*iX}R&AowdY8*A*#KOnl-Nx(F?C8y^uXg9- zt-EPQynA(P+M`&C>jlW9lwO1}g26Qll!j?O4G9G`++d{H!-@COp)R*9bD$7^^|U8_ z!2qC$e+t0*oO8cK)L@3YK{}X#bRIf)vZNB9z!K8Tc$#**yU*1E5faeMWH=G2iqptj z!&?JXzO`j}qz$b^3yL+yB$2YJ%2BN!h4_dbTTsGMJy&hUia*Kq^h;b(*uY+&^L zl2s5+FG~dX(!f4oI~#AlgEqo4h{UF)I^&*^iW8~nO3P7WCK%H;j9_Ih3t`WQOVfp( zTXxeC^b?nUeQoUG40ds%gh82B=VjnN{K0@Z2hjY`&pd=bIozOcT-lWAetY}d@HB5J zl{lH2?t9yrznsWdLOFh3D6ylB0EGqb-6yAkZ`c}mgP*+l(X1=$1qW_v%2oNfKigbC zU6jbc-I4M{5Jg~6!sa`!q98}w@T1+>V$Xu8Gt*>UU}s)4?G}VWKf`WqV+w3)?i9d0 z-PS<2jdSL>Fm~jJhd3go$22^kcf{5^Q1Ow%#LAR_b`&MDHL$aty}*_MG`0-pz6O!Q zeqY*4hhG1?ninUiMTuAp$Nzy%>9;xP=`?lsBR0G;1KL=i7>~aMrZ+|oXkg_MF=*_` z1=CM5$drr3;;8W5G1%1SXu#xt{Fh}fAC`$GDrOg-F?FXzFl}61H78ID>g5!*k0Uko zC-EP|8lwItGlDK0f96!N4apBd3yu*6a1v!#rE$E$Fy$tnLjUrB?+9r4Q9?#dh=6=e zvEnEQR}ZIuCW8M`2!95HK~tb-4l%S@4B4U~tPhfy01h<>p_!*7*WA(G?n_Cw<8DeMoQVCd z^8*xhN~jApHYn?l8RuMc>X%Q_F9JG6s{bem;J#Y83cBCGhOopT1lGO-or-r$bc6wD z#6$&0U{Hc8)BNRJ^U_`ltztOWPoHVJNyM|2P@V$wUWpZ#`&B_pBULO!j;d|d98KGp z+HtbOZU3dmTr`^gvX>ki*(8qwZ=#E(PiiCl(9!$N0fs6-u&JTJjrzxZ&|#a1B(!=m zK`%X~qo;=7T@-Y|IVL_kqH zk|~hq_kmB&?de~#KEhYNXJ1nk#%oXn-aQmnI%_k^zDoSf@t`Hav0N*LMM|4#qi$pVfTwkC4`}qrf}&ia4oE)h9Yf(RCrjb$cmLl+!gfJ|F(@=WIbM zwAdW9WqFt)6W7@Mvjd{Ku$JJ~cG-3LtuK>T)EZ2m@a1**ONX=WKAP69665mUdux*{ z@<)%^tNIdd$G>^uf^=`w{#VzbZ~1chbq_VlxqI~1Ueduh{L>q%`KNO(ay;QZ%RYS* zGn=hTOUsdSnJc0p76D(2;l1+Y?iI4u^<~;Xw#Mh{wXc{Yd%5I2KPRd67$SXBn%%Tm zmYmr15?8;yOwBe}%@F(egHnZ9^KKkl*^9JpE=D2~j;w%}_U?D!@xFvnezmySw^i%w z>oi|EYSlMg`Op!x_b!pp3NSYExQLCTv9u3(6%~sgbB6{lH~#u@mAJR=qGdHbS=XCdBKnAS zrRcGMZ>hOO3g~nW1;ek1wkg&JKWRBva%-+T5`MZyMDz0(`8*$A{-*>ePWw`}guFhy zT0Q%cLR+B~J6$DQQEiHhp6r`EeN=m}gKiGYAv;5bnC$PLy}!@X7;JSR^sKUSk{Wf57CA0R4vN~_i^1@0`VkjOY=*yOb-mTQ4;Ia%b0`}du_McYl^y?@9q)?@WP zV)O6ua_ZopxqehzXuYKFh(DpoRv(9SH;(q#s^}%Ltn?05`*u1`22AUst;;Az=fY&H z_mC6|c`#zgaiPli;S08Um#gcyW2)D)MEY#B!j`DA{0=h)LL{m~0X$4PnECHI?> zK-#5Hy;P4DJtN~hBjZM9hk2`nZNGwV8tGuKFb=~hN#_U~tn!bY7xt~O?9z29pM~o_=q1crZO5;MXFG)3CtYz=jCw4h zhJCKB#ToEWgzR!VMlYFfnYVQ{%P4al2+!%Md zka9gq2!S6iFZ4CTVm2;r*P-jqIkQb9(h1dlG6EtOdJ<(f;H;Xbnk8#HKl0p=5X-KS-c$gr~%nR}lll3*o#q4h_(YlszAl@`3uY5I3 zpC4wjV!$c`u`>?8ZSK;KjjeW=4&#D&VVb%t7tP|ro(8whPDZ%hw6*P&!={X{>(8P z1^htx?$3ZeTNU)0{4-z7?VaMMwX|L&nI!c$he*S_9C<$5E12RkUgnXL55id`56@y1J6I<55_-p~2< z>4B>zj3xGAlj!J! z1tpmRt)J_xL&CrNcK+VQhY@!PKP97|FDRwid$qonhrFyfUl(6lEd1F`!24R@ZEx!k zQjg4Yn4?bvJIlB-93{qPSANTbHDZIZc$j{iW%6kXN2uZuyGB@LwaKz@5|vztFpXR= z7d4d7I+H;A$gbVF@*q-*IkY<8pFx+w!69ra>+Z#-oZfpj*)AHuf_Aw8qJLy(NjMvAl^!W=}05 zJd!g{JU$c;hM%0!eC@Sxj1c*N5(|*wyGOSPe3(SLC%S6&GcUo zc$e-W+OY-DPuj0;`@c`?i`bS^RR;RIZ!j;eQ~U|z@(-KRyCi#Fo95aWHsrrPbaSqA z3SFqZktz1Fw{CY~_>K@fsj#3?y|93#QkU#{;=P`QjcZ+6Y?bLlSjRcT)~W&iE3^vq z#1%3LZ#Ju_>Yu+7d;6s-<4%Uq?l0DlG4d`y^}L)43UqH19nA=9YUk7l7H0az`MLQ` z$A4R^qc`)X{3_sA)ADWgV?;&6*{{k!WQyGHru4EY;)tN|;XseWqxCPV$`5Wx`CYU1 z|3G_6LOWdaqH`g+jp7eS{DuJcr3%BTLIn%Pnd}7UdT-s))sMx-8@e|V!sAkerptck zUpFpjbV;cy{p>{+r#|b%G|1o`NOcLlWWfGBNg=A#B1-$t_AQvMfX`nhe{D}s>UN7d zPo_tP{^~S$c4F^eLe~~I{@Q{dcQv)fb)_QssmLGYtCP(}{1Pbze-xfs#;;?%s;)35UrG6yzXaT(e_xK|)9?`yE>Q(ZBXW6!ug`Enb=9H00 z{+QXp?L%PQ>N;kkf2-2bkmT^u{lDSTgLhf4Cb1cZR9f~qE_4!2J`QrIX^tbhTFz=l zDFwC~3pKDrq|b{7?hWdUDETc}iE5G4UGo&MsCiEEtl_3ye#*%*i&F69RPsd1M?6aS z5zXKi*V*?izu*$lbw#y}#c}OZ&5bjYBAS2jBA1nP;N;b$_OmG|9mb4xwlJFUkL*{n z-YVBeRiOjfnXe+v*D##MER=nROe5%gZ}b zuqwD`rKH5ND|maYk1%%`^?w{0Dz9h%q>xc^Cunp=z27PlafjHah_}i+bvBmXfUclqS+o(sn8 z#R^Y@?!1qLWW?Vy+_*KVMmMsvAl6&&cw;@!C>!OlFh5VbWrgB-71#H3NDW(OvgiJM8>r2Z^fFA7kb+9YuoYQTUR$AtIw(z7k z7rPSV$#-`ksRePpx^g~$y{@P@M{TE@%-%9T+VJM%wW*stc-&`~Y7xguX1E4-*gs+T zy1pQ^?wNkln0&iW1Wxa$GwH)_k4*Ii{D;rkwJDb^hz&huyvSfv-@OOP4E-th7ZC#M zkIkk;R@1)|wh}&^*1!XfxDQb0(k4;JBy~zGcS+)#1Rk`b<}k4#)2+jV zD=G4k2&0va?bl@SzIlZqm%G%k&E8fn0c(9)*gDTm9l0`E7)Lwx9|dBqi3+7vUkH03 zU|#Nc?JUDXzJ^QNo|RP}DVzE%(t&a(!y^~=fy(V$5W(cAe~vOvDODNw=>CZ>gfufZ zU!uEe8aXB>uXZ~|q017xk{hotU^1`3N?ICq@oUTwJk7b6C|}{ZodkCp%@ol{@fv{x z{E93Ggi>C2Y+s%9BJFT5$W2fgpdsbC)hAN-uv2vDRV(^gX4Z)4#Or|Z$CrI`UQB<& zST`P3c^+&0s~R$1!=P;>R`H4l#;Ur5bC}Y$%v?e=ZYf8N8<<&!P4lRTquSUvjZ{ zcoFCQD0o`f6IOQj=}|=Qk!NpLx^<6ZZJWgk(%DTBLZ?mmTU*t;cRv1pD~^RMUOBfy z&?RK~ezEt(_CLn7c3t8d^LJu5UoP?4L@!V| zo2*gZ)*>{DeVB2z;f3fWIRh>2@Iwv3`Hf7MnEJc^S3h{#}SIsdq-V?pKp!B*$?OSLi0YD9x|BKxJgP9bq+XAQevqGdBYF&srXLuslCly_hp zH{Vky8zOi3B!MbN&c@7p%Q|}qrO@TzESe`j$IEzDvm=CR^hdw z0@uXdJ9_uXyr_y0ZJ#J0C?^s^+9s@4=&*SVxF){vA!sy$u&gN+ym2QT7B?8TFu_-` z1CC-=9_0tl+N1rscjUt0U34;n1CDjyI$nudNGR#mU+Y`VEp%~7zN6u)-|aA(a92Ia zyR4bcT;gtfzs`XS9O4as;}Rv|*wdY6sGu|pdID6IzZbK(q?~G1|7UOPA~PYp%kqYW zNy}71o8=AZ01_9?vAhiLrN3okORou8quvM$THLnCX^_gPs?t|n?Z5b+dj^l`3=a=k zt98zFJ*1$CD|4t4X9u8>H#*lYz0T`s^&%k^ zs88_aJ_A2Kl4hlMw9#BD@=*Sw7E@JDm3RB{#X13Z?>=5yjZ3U95*R_Yr0HM?29Y@J zC5+xFcM=nn^raTW-K|WF)Yv9Rn3=p$r@eR0(3CICoi}RmzM@41KeK(rL`vw(RBr(G z&|hCy-5;%3>NL47;fo?37OPd#5<+Vl|GE2O{R?kZOrFKVs{Ar?bF9~!w6U__2J+LE zel8C)r_3Wp1Tmy7o6{6`GCc!huFPmLM#ws}FPD)FB!}x1xT&wLk|av}B$6vkzLrvv z+L$ZgarCTgZ1C~2w7N+NW47KWksshzZ3o*qcRNXws{f6pwy{dO1bx!XJ@}k8#8Uyn)u~f_E)*Ck`Wp&A6HhdNSjc; z;HtjR2Rbk3DBdaLpD?`gxr%%m0pUF9g)b&LJM!Sbl#cIWjU+W>BKu#So~Wgh^O@Y= Uv59T7kMXzG(KOH~R>K7UKZc+AEC2ui literal 29037 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 W0}_-Ias$av(79}&QL2s&`M&_xE_K5I diff --git a/en/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png b/en/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png index 400434dcba8950e02d6c27038fa852621a40421e..d069d0c204bb6f8c4cda81b0f5a4fd335175a982 100644 GIT binary patch literal 29083 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 literal 28974 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 diff --git a/en/chapter_backtracking/permutations_problem.assets/permutations_ii.png b/en/chapter_backtracking/permutations_problem.assets/permutations_ii.png index 56b3f224d98cb7850b802c98840be025743b57e0..f0d686b02992a53a34014c5652afc2bf90e647f8 100644 GIT binary patch literal 21902 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 B-Bthq diff --git a/en/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning.png b/en/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning.png index cfd28f33fc34388ae7d595358cac8d436853cb7a..09cea37e05edcddad021317d2a6025852f6d8d6c 100644 GIT binary patch literal 26925 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 literal 26870 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 diff --git a/en/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png b/en/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png index 9dbb6c47f05313f1e559b3f46a44ff048c82946d..890fc21be57435929eaf9e1c2776fc409433da64 100644 GIT binary patch literal 42245 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 t<1BCt037F-AeNBq(XIdh literal 41829 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 M^@nQJ58x612U3aQeEc6L_C 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 literal 40414 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 diff --git a/en/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png b/en/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png index 034ff8b637c00a26998fce92a1670089b1161e28..33a75be5ac717c3e3f1226d290b98c9f9873d557 100644 GIT binary patch literal 11392 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 H{^oxHzXG)= literal 11955 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 I4d=iA1+6k5X8-^I literal 23844 zcmdqIby!s28wWTHAV`ORgoKDli%54%mvonOcMnRpAl;30cS<+X4bm`lH+zTgZ+HLQ zXZOE7&pga<xZlJ$J2xB>+AE| z$E(ZBi;Ii%^D|(ao}Qc>A0ETT;r_+#`sw}M!S)es92_0)A08eY93CA2V}Eade;*2k z?n8ICp@%2CTf4hEu(7?dy}h%wwRN(wyt%o#v9YnfzJ9qneK$L>w!Z%F-@mngORN8u zS65f&53a^`Z&y}UhS!gmmzRJsvOK-GxVW$|H$Oi=H#avwH@Pr7F*`duH$6TBjH$7y zsj0tHGxtLcTf-d_6BFa(4kloJ3Bka{xo!VH2wMWr=z1|x23SFy|J^k{-QGe zI_F2r(q7rzRej%ZdmC)Dw>8(b{b_A&ZE0y~YHDg|XsEBRudA!8uCA`EtgNW0C@(KB zEiEl7D*FBVcYc0;US3{qZf;&qX7cDkMAvd)38jP&$$*Q#E_ z$_@33L%AZTXg*Xh7b=hk7087uWX<#ELiux`e849g%9{h_$%b+PpR7HO%stkOz0c`; zHwkt(;Rc6M=4okZDJdyQNlA%`iShCAadC06v9U2RG11Y{QBhG55fS0x;h~|S!NI}T z0jk&Em2Q3IuYDD-eHE^KNz*AV$@h}_N(%^M%tYah95*k74zZ<#wUscYclDS7Q7 zap)y?C2no0F51gM)*;y}g~CosEr+ zwY9aCm6fHXrG`-#@XewmLH*x;-c9%0(2XWGT zKt_kdmcwm@Q1}YFzoHuuT{0ssPJfxgYy?m7PBcd^%5V4>k^M8$b$MGjf&65amY;xz z2o|`Z*`vi`*tn#@_{ICE!Lxhsk1WvBR*RB;_pK+L_Obn zP4h@9YRV8GOOm zdZD@8S4USCw@w*U!5mzdSKxOb z1e6X4=p`t#q=Ug9q=}VUZ|M8!BRB^E4FbXj9+-iH1y_r{gMf~V1vmZzEI@}07J&fl zz^DRf!6pX*{{zGU|05v(cMI`)ditm+KyrEPOWVakO_%0ZWvy?jZ)%R?yi7(IQ|FD$ zo|Ltk-sEG|S?!ikeRRDU6JTpgWJ*m&fvd%V6FVrzi*|T95Qryagy_yBBJvsa%wN2~ z#jb{94hONIEr{FywZ|Eazww(E#yrGRtEHj%5gCB=U{ECODfiup1O?;pr{tDh^ny@oT6zr#06Fh$v&W*s8%&KiQMVy2j0KEZ7*LY@qL39RXH=33Rd6OjDX! z7(*Qf2KzdEmr>+cap4|?J%7Itz#V3ghxCNL_Bms&Idzz}?Fa<%dTaXn>;j?yh(5#; zD*EWI9ONpjZgz^b9q9LSh<&ulHW*O>R_V@{J7eunCrxSG@d3%D*GKT&DZ8pkJe~^Wrz=CoO@q zzYdx`yxZ>uw!0^dUomq|FNg{Pf-XTmrc}sZl6^_Q*len!sFbZ{D>XdlS7s3#UEy3t z|G1H*D6m|-Y^tx>hMTojpB-VYDU*uj#L6vYQJ9O9H$B;hOuuh1%(h9j>!(Q6OeXN(Jb6~hSH zBdA;fMx(~rIJabC^<@k44CZZ2ovw(cLD{61(z}M1JjsXi-#mdX<|9MAnoQ<$vY%}@ z^K-l{Q{0KDt43IZ=5f~@3soN*P{!Ptod_BDmFObXNJAc^>U3WLI$ekW=@Mj3-t3A} zyz;fey-=MD_*wKx%vG#G$%wn(P7~3q#U59?Qk5vSa3Ppdsyg}b4aIVljzZBCwKo2m z*bl62$Dg?r6_kn^l8FaaRZ?m2va~jPu|87TXOjnHR9$rDO=UQfBA-oru`M3OJT2MM z@t)*U8U3SH6+T zAgQS}{0&8V=wD#U%EplY0QQvA`pTag<&?ZoGf2^OlRaOXFFZ9dCVQ7vF?;k@V5!^j zo6(^5@Wf;80wW6Ge^y^0ov{fU8{^0Xa3REHJu(mSK`yUCweYv|0!O&=21FXzSHjUe zPLeqG6cHktOOuYmQUDeRa~pzVs7^Ybk!oCC|K^CJ7jqmN~I0Payw{E zN~v~l${VKLK7{vF68I{^wKD7(d)A6hVlZQt;3!LM&5nw6eoY0H#q*^b@d&BH?O~XB zrWT|TFkj#*Lo&C!bKT(cXy3Xot*d)cn8%BCw^DRb7oK$yI3O_<;j{i@BtxUNp$B{5 zulg4Yj*`TbTri18JP1AbDny*DMGKygy>uH`Ml`KYs15t}(#}$GXJ1L^-A=3HMHaaL z@n|!S=Kz*ol?9?K7t?x*T$~>v!gch%tO~Wwnu};Ey@9A#eiwVDYL}Vj`KRSvjAPW3 zhB+SD9wNy;M=j67<+c7=^1pTtP+ZiqpG^tF6{@+7Xl}I3>BU|PjFCN2`QAQcV3HYf zBfHCLdCAC-khp{?QLui9+b4Lb>u(VHS_JvxI#uZiOWOsUo}=)BeHE4mK+^Bv`~@iS_)q%IEZl|`K$d1 zp~o(+hjP$|i($pNN6S8k9GqBhm-9_QYq!0tE2?(9EbD?BCp&e!NjE#0L+`!lD(}Ix z_DUZ+*7_Bb7q=a}#N;x8E?xA?-<-pGw?c&BYO-N5n8!KEu zAzrKwkmnLE!-R}A2V&2Zk&iFg)IK93AFCj|KABXiUDhk>i%twgF7MgpQa7vJa6_Nr z64;F6YmiQ1PG$-s;8$JXEDJuE$5)QHlo2*a7X2~pe?UdCriD;IG8;`v;NQH2{wz;{ z+||3Agcs_EXiba}bIzmo;UIMJ9TqS>tFxc1`<=*-g5gs~6@BV%f2x1Z#%_2SCmS|0 z5K1fYLm5b8sM+X_6UD%)x3tJz447y-C4(}(#*siwXR)$neteoeDBIYx`?E z+eX{#rexsHY0YPExez(zf|&Bfhxiygk>$V2u!vjQHK=vP zgmWi@s%o>Ra4=%5PkvSkF%&mc@vz@rG#*`Qn9)r(Y8Wlv3LXy)ux}ro**<3i9e*7CB?XFcNRil<(&VgDW(oxf3|Vq68OcpcQUkQD&ihIMcENz@#?JzrW|hD zqK+tIo&(-Ie1PM$+H0-6zs7lHBdJuzcRJ&}_5FC{d?l>VwWaybhwuZZWHI&_A` zi~c#fc-YuVSGN8|Thj4)O*_|8{b`u?;o-6c|1?}_fo1by=A)J-%fYX;;CVST!^4YU zf14*2w*1y&JmCvBF(3MHmy^+du&Ad?VFRsVvRF#&j6~%u{TJ3UDib?vd9=rXxjvph z0_S$wtQ8@jo-#@&B>XsM`rSzE}L)n34By$^ho9_Es`Jdm3=ZOd#$ILu9r6g$LA z75b-#>A}x>6$7TPEMjTP)B2C;Ub!)jIHAe-##+RjUX^t>$#3&yf=^S`D({+UFInv} zNnu428?#xIL!@25VY4jsQ^$TUHc<@AC;dWe$@rk%7|ND(<*r{ekHh7~{BBF4)i33l zRmc70$(o9o7ZP$lwAtHhNqdMHM)S%Nzwwp;02a2MCKL&IIPf5gVkrFpY*Bk0gO}y} z7N80l>k#d4%;;}k!^0>LKiee@>=4`^tBoxEt}%Bzba z#*`LA@!)Wal@^J)FB_zDJF+lgefS=QgNeH{ z-G>j1H23=H{$5kMS3CIWgxmc{+Okyy9iV zQ*t2F-0yFdULkEBeyte?6=#Usl|3V0a5E12#Q`}Ak%K)Ss{g1{6mCMd;iSw;vABid zTmF5UOM@f)3g=CeZk_pR9)MiehDpQ5Z11nF4%7=-;IUSvE_s%T_qIt#7p^`eZ_@{` z*^4EC+VIIJ04cL8BXNiYDYL86Yw!LO>#J z!xA3?qVAVJ%%xiR6(4`^SUhAnH!&FdjLc~ca1JTDFh7l=`z`@p`0DXm@o{^m9 zWsoxXXXYTXO#XWzfV~oy*uv93&DMchwv44%6rc13*1?WgtZq4v*^FfVs(9?^%*nb6 zU)N0>@m28)K)NcmX~kN;Z;Xw-L-+*e)3Zj6q~t>S;R$QH?6Ia_l*_+hR6kre*6V7}*9P&Bto$>ag=@Y{3xHgWqi z_ui*5g!&dSull;1i6lep8FN3L=zm*OtgPmp#?eDJYuFczZ5n6MjAXGc0|Ohl^U-({ z@2=_Euj1rXvN)fJJ%1@)I^PujN?EzEiR|d_--`*^f?^Ijiv@)07ro(O>YBoIDFE}R zXY-xgKbqaVYe-F+B=E6U2$D*k(hX-8-#lBFm7XZ=CDxq`RgEpUthb*l#9#QF|5O?F zY;xS-$+XvWlAHOd12U9kG>I8}eziJQ@BcDrLaq`8y94U_KLBs=p98UH)wZ}KJ zUnohcJNTcTW*H=@d*jRH)7>r-1%cLaae4;j_m(OvhkauubSIGV<_QUz0tQq(7Ghsz zTykvW4$#a<$VpD|D-~(4uAg2B@J%btJ?x2GxPQ@Mjcn5M;V9?fdx$sI`T?sLa5An9 z4p)t*vfgWX@vS%g)MwI(kqc2Sc5XSpdABYkj_n$XMb;f4%TK+R&&B>mgQ_rks3JW$ z;I~dlyUyvjTB(}-|BzEW+9JXZJ=mgXjWI|{{oh~B8j}N})4!H^ufH|8MZJ=lGq6!L z?mx2*t-WOgM{583*N_rwwW+~>_2o+%HL<2j<5yQA#(?RkGTE=Ap$WIavi~QhBE?&C zqRJdxTRb0A@AXroAuG^n`b>L?PQmxLw6{ODN<4}Gt0e)u>n@(MLjcoY`3qQ$_O6}f zl(UL^Lz}=|G^G|%cRhD1?srFwccwPvAFKIm(})&YR-=`#4J$@SiFW9W48LUI-20`3 zU%oVEZ#l59Vg4b8STE|K(ip~OLU{J~(Vn;U z=Zv9cDo394=2zDL%cdMk+RywFEYjX}p)3SaMTkcc;?E;;$OM^8)*J;xGb3aoL(a^z zduG;tm8s}mHIpz5E&S^01aOX1e})2_H*M>9K-lDf?EI}~3fR-eWNrkn6@f!fbFT6j zf?(?1SnSv=wQl!2x?2fuUmtf>{y%~V7dRi4RS`<@33A9Nkwp7Yv%1IWBH#Q~=GU^* zxuUwXC^Y}SynG9RLp#W=a@Ohc*B>)=eWSW0eL$LJDA>8B+O#6gh7)INNsFhGR5g2J zMWCg#N>;lxg0-e>Cd^Mw#$yE_rjR!pMB7Hkzejs%+AAwdPS%~kXyLY0nZ=faBD!ES zmjz?xxseqpk~f;&F2ck$sT`B`qpF+bKe1=gx)|gqKSLfx)@xQ>{DpH$=~{2E)~$ds zRNGjrzp}%-ZS?CzutrE8$c3Xf$kIt|xO|MUJvFQ6FY~S0U7o@S1C$sqgIRq+=B~o> zy4mjCAJ!i|2pnobbv46nIMh5ZZ6W6?A;@P4o128%WUny8t|;1Pcn?nstzR#2e@Y(% zUCI+T8|!fm=T2lF8ko}7=zeGc4KpeC)2Xp8SVlNMM)$=iIhQu6If*j0yBz3-PNw`D z{8S8UT7{$7hANVH=@>Q(LjwGr;jHn|H3(Yb{er4&h@7=as;m;H3P9ogT!npcBn=;o z6h;#Sv$0oME3~CDBrU9f5>A~ap|!MG`fuX5og-~^+5@~@VTfGAL1jzvzP3rIoF9pe z!RvmgM`Ss&Ra6F=bbS5At+N)I2ZGujqd*ns?g1`(mP*4a>xeFn!>ojzzC?Yo&}T8o zPmE#0R{G9osR4Ol67#Gabqppn0>3Yn-GNghGNb0oyW!yocB4{;1J!D73uFWa-=$t8 z;Yx}QgP6cP*_RLUIVyA(_`Jx+;gywEnU$&8#Y1;tp9cpdsgYEWIJR0UH)RbmqJ|sF z?$S^?%6rdhI};0<`AlAAJQ|p$)TU<3K4YADM!q;zU8S|I?QhBHxIzrOHZH&6rS1Q3 z<6}d7t!vXnqm!^#{cLu2?A1h9J9PHBUK5z2Ekru#-mF7T^v7E1Zf3JRS4=U(Z+p-_ zQx}g%2bZWIUgzQyn-vXMaxE3Mx?`;>*6ee;YO2q9=pf?h)-te_tLU8-88^C7{86Dz zY<@%d{^f;5q?x_xGWl5sKa^X@!X&5d^`**c07AUVYAoBRa%H!atQkdGUP~_b=zErzy;4839>9ckUiSxI+_|Fm=llo{Z zCX_fBhZpFO5TzCOyyY$=@zT$Nc8wg%leux;x;4Ksk>#N2Qi}(e7{Xl}+{LbvL;W9i zxhtHd%i>ZGZUoV<&stv(lde)!Sm+&*KT0;#?X@YZ&`-t24bwsWt{;=I zreciQQN<5pZ|EpWefBAtG%>loqJ5GT zP2@!x)6aK#+oBVjso?AEN2<3oarIpmB6UCCnWC3$muYFzEXDr1v%7rsyB@LRdNKTB zmShgeRQ-iWCf-+MV-lwXIhnddt)JWcpB9`@KTgxMzc?|eny!$;XQEtg z$yr2RDOQwbVnTy5r$hpY+gP?kO+>k%sV%~+vI+eEw%0T!!3v{ajy&C{^^a9x+WF*5#p$z5cD@#Q9X5 z)lPc>K|1)#C_el%*POs<;X>Z~TK0>2tE~=h*5RPNI!q5m_!*-Tpghr=rjKsL9?Gg+ zMkV8X_tCDy4WI3AH;~&-L!=^5FMbL-jw5VG+w}+N8)Hx8iQMp1^_^5?ZhaG1+rRG6 z!5FkLx6!8Htt4;2_ZTRP`Vq{^)CtmlnxL>Cg@&L9Tx&( zCWp`sSKxjIBS?0PsXUmt8$Zsz2f-N#K=8*vi;6__SmY>vaU_qd6QpCvSocbLE_>jA z?>Ak1&fYxvg5c&+aNpaa14Q_-Np=mshEYfU0s%-EnFoZ&yFvI4#c!INp-j8eHS5{{ zC18XO2t(HEMLRWvZ*~$ljNzxzYeQiPkFZnKmm%$s%!J)d7-W2E4KwD3S7{GO7;pIG zqZ2ubiD6vU{h1h^g3c+oHfdN}OJm2A()no``K_Gkg*;6C|WKEalO{N%;sP zUGQy^x~QIXzc=CH0q@u7*$dJ#&4<;rQs!kQqShHbhv;1dce7U9` z1w4jo>%=ZnLyJ!Gaj}>O7bXsX;NX%RMD^DAcB=+LOt^3B9<-M}4PX}5_{Jt`11d!@ zZNT$=2*sphGFEIr zEs*5Z2zGzRp(uQAM~5X1gHM=!AC8Y197BM`MyrO`o+fu9E_6R%a7Woy-C@$HB>Q0^ zlJdjAtgQ(hIIw?&2}#O2mw~-vqkO9IPCx<%nL!Nw5N7l1c(+goZ8NJrBRSA7-@0A!u>cZT8d|Fc6c*BWE37+KF28-7) z;^ByoFL^&QoNi@j)|hxWqS83Q(EhuX2UlMlRE(3K&S93QobrogaDbu&8s5lI zEJ@N9dkkvdySPLKI-H`g?pld)$JaG1n9WEh-*=r=InpPCke3(y&kBLc5O^vB@?+g(7-R|V? z#+j{sX=4J#I5TxOzg?%$Ii01Z1G79EwF+R=bacf?pS&|PPdi0LD<_lFn+nQmR|%fd zPM;nrs7DpcRn%L(l}2_hNym5T>EM+-+y`@w%BI}QuXUciMov_(H`;4@z@RhBl5ihy zGpy30v~%d!%Hw6-)#dBhRLyEZT3fF}p)0@nTw1X7?ixe7b+@EoQ{{hF<4f=(xj?SE zIE@7ZG_qXZqgd|#Q`U;b$Z|%o^-XG(yLM}LbQ_J!D*UZbFPLT z!3dCruhR(2&YIciGSO z9p8T;@rWf$qSf0xeSCHVOz;nz_900q-#YSYN)3K!(UaD0g=tL~n0vhr7Te9O%&4!Mp#VGUxPN-mR9fKgOF7MwFP36^FaA>Yxcp&+h_2}WD z#|6`hRgKE~=lH~e=PM{#VA0PA)iHEh%#w){G6Y>0RsZ@mN#-V%wUP`qPTys}bJOye z$==;1<$8fZcSQ*QRseLYjQu(#FDeYa)FGpGl%c$s?b6Ck2<5m}XTr42^nok1Vxc+) z+rF^f*S81Y3FJxi@pbpAeqhP8SC3AA_G53-J;^$9WZ<~s#5d>TpJ6x%14->9n7k&W zQZf<}XP=cbh~P=XV0nbx_WMbDy+_EE+Es&y{@hL6+nM*Pe33mj-q(MZLN~_#UAP^3 znYrCNEY;*uQ0wMI4>#xo2GD^6qC}w9DX-Vng4}(wUML_?@cp)+TGE-)l!wq zbNH)kd;2kaym7|Kdwl=x;H?5&Zsoq5OuG%R>EyEtwkzF>{o27skNCl6dYA1j&C_{U z?i?Ec92Qdz)3}}<+B9E+&avT(#0|^7WAx~*RWX!ZB$bCWE?!ADJKtGLl_8P&xkLNk zVP;2Hh}>M{8aeeq6B~*`pB#qC<8CV`DLHTWocOas+Vx|nLvZT0aW`LWY!f%Jh!5zK z%RMIn>4rqUzf^a;!~OBeZHzPZIVO@CNuz;j?+4h+9Ud6H3+HEU&dhkn=s^5DBP z%6SQkqTjTzU#ltgX?LqY`K~~=z&gCG0z|!TQ+5!DbcwG&W*FEG2|`=fnilby=3kkz zo5DQmkOxjC!dA848%lv`I9AE7p>hS=I+L-9==(_g@g&1ZE-!GC6UyNBO!r<$yTK@~ zLe1!K-9{sZ9~4%}!C3vp3ZXh=h2)XC-Q3tTA|L-uWbp}sokJ}^J|Bftz8IU}@$^zH zqp>A?$pgs2T*C(Ta1GGoXa5gy88x#LA>J0#^|Cux1tiF)SYQz#(*i}4Yx<6~jnd!9 z0o|&OTrx*3cS*@x_-8^QLfWnGit#qD+%;IZRx1AjXZvEzb|dAHVABS}!F1-~O}e=Q zmioCM5XILb{e0VMNP8N*$Nb7Azg|t8>#~i$ukpkm0Ty8x$LgvG5nrU_hznbx$2N%` zC3vIm%fnu50?&l%G0%=sbBXGU1$kZ#R@)aj`S?5^Z-66n-;dYmXP3cV9dbThvibDr z1ND_=;x;a;vLy0<7LT5uyW}34)4PQ-MMXuQT*hRD$MoqR=AhZbOy7e=M77D$`Va3c zk;BPhVm~n|T;p|mB_4_4xDy~&~VmT4xgt9?*IdmAQzAzG`vRwwgBetP2)9-0mFI5#4 zd0u7cf<0kdkRWlQUz*4Y%CrL-Wetz_DegMQ7KXo0UJ4k3Kl3KWMe~85FZ#0-IdZMc z9cjT8r>a&1lCM~g68A1{-Mtyqy||=p$AA~VPD4k9UAon^ZboAk`P4p<^x6YAC_>g@ zT#?|uk5OPoEUE|QvKcpHEWA`y#v@*7D#jWmv88A2XxdR(*W;RiL;+$QXclXa{?@JR z_=i?j0b2x@J5PYCdpNv)edz+@b?J4~eHO`mP27@2A`vY_^P;h^WZS&h_@bb9(Vmo$OOUJJ4qQ z57N}4`0|^yA);XjKyf%6a>*;kFrcno{ky!qvS%%v)nW$Edj3~>a+T@Vm5-6EkgH#+ zYFCaCiX@^+y9{LcLj+1b*2;T;yktr%Wdg;0-Mq1z_fAWA%A zZmy}Sry$wLDJgNKUo$S3Y15{l5vylyy-Xw}=y!EN#bDN`c}k1`Ce&FA1X*jwd&j!3wBJz;Wx?)0|^7b386kU zY(%|E=kH3=9~rl~?7QWI8NSH8yaMfRJQcXHYNKh7Wj9x8joERoF?)I#yaTR}P)!hra?n^I%tzy*$rRmbTjc*>R zs~<$8Irrq(djFHl()r+APLO2qhOBjW;p3SrO6~GkKT5~cmC|B_~CPm z+qHPI4>4L0Kl}r97C#zxd>8lhv+AUEc^X|K3mX_=m?eKxukaFnsp;#Lc1ut6LhG5K z+|E5aH7{=sHH>$ep&cH=N2?)gAKbf$s2GihzPsBn6et`gT4`@V%Aas^g5B?nqNSbw zcU$VO;E0kGNq=G@20s_fX6n@n=ucuRlOrq}lpo2?TU(7Hvk4q^HD4#R(J(D=-04O( zdrGBc+b&wHM#|)I(6sx)^z@mA^V9vpuch^^OVWCBDyO`w;G%#xwJP}Bd^M_n1k{NW z+N{Gfi-wmPZsMjc;a$mDSr6j#7#+sPmHuP-?nhS2KoHqJkD$8?Z5Kk_m>^gBOuSn)JnTvL#3n;Zg&QczAQb9sr~qh+47 zQkKq>Y2Jv&(eDSp7taXh(=+O~IMMZ`dWyTBX~9;C{Qy4ygsZZ$-z-#f1{A>rcULx%s#!`oKnuXg71g%l%w; zd_GrNYpX#FwWjdLMpaatXuP9^BRkas*G_mVlro^)KhZ<&!=Z;BpLneho^3%8v)jjF zI-)i9-M4|@46@_aR>OW$3pdqtiE7;h)dF6-D)Q0#t#}&AH7}Uanu4D;0jnoqY|Q;k zDkmqAx^B3(^@!J0(tY(gZXiqRV%OmYF`#so-&F{E_4^lCF#Rq!;vQ=J@JCZByA#*! zH~&QipIuqar|c7>c_s}8O+RhYFhc75xuY;x-Wcm=tVCEo+>-z2%`4ohtoFjS?Y@diKsNCqP6?U5Sn*)rU2_=)a3;V1>`>``6kDHggFM zF1Xv#uCwmsunraEn`k6YXfAnOe-+KL%|mhtf#aOT*^g1R9De|uzc=~OUD>$8@E+%M zg2KzwdaT5=t|lj21|nhsD=VT}{u<1kAD85ve$g<$6>en<`dzLvOD*(VW~qNPA0`?M z(6j;ltWx3KwfGU{H7$Ip50nCc=_7e3G%YJec?{y}ImyLfR-D&}O88$0JXan`s&E`W zPFSRmcU|AB5rsXAkIK@~p274t0e;SXXMHT3y^m`z(?{tCIC6L~FrK*(^2h~gC7gBU zjqaqawM>URccDI4fo&rfq7>@vi)uFhLzd`3sit1#{r8}c=37}6E*eZ=!;lp8xQhmt zm57v2mt5Q(Fq^U6R#!8sC`PqK{_>O{(qCR0kSpxX`ln7jTn_%f>U@IFB|MirigE1C zoyji}4$qxc-yeaP2Mpe|$%gh5fSrwdIfM6o`WkhwK4U%S&yS&O8mDLXHgLNM3YAao zIz{0j13x@MaBDcqQ%PP#FE8}AHYVylN5QjmwW?{w4HwieyXbw`v}0oSH7@+eCLF?~nE<`H4h-QJXn&^DYM$lfZ=~ z(H-;Qx15(oiN~j-=K`kz0pd?e%6FK1t?AirzT{N!ZcE2di$KX!jakpw&A{;GyTdBd zNo7DKfC$BRf%d_x+Zn_>&EU1RmT5G(Z*+4uHHUn^=Ki{%B;FMV20r5ro@@O}u0f3_ zaQma8ePGC)N9mHs<*E)9@~>_^GVBdf3(FHqJq~>t&Sf@=jt9Yf& zBO&sg0fr{sf6WI*RtWJ!G2Fg}qJ9nOx$@u)>w46bMg?8Z9X=saaV+z*^el0rkcb%ba+r^vPeGPpuYZE(#b67EAFr@Xv)CVm7CNt$b$H1vdul^Rc&qqo1IbZODehHQQw@n9idDV5vs z%6r_D)W6B-jf+|X+~?uB!9ohBm)RY?aQ*G-*M8k0!_k&W)&riV#vt!G{=SCUlBR(W ztQJ*|($>2nZdDf9fc`n2WoJkt9ORhl+0 zX`*r;(RFlkG5Es@4Z4t}B9OMnf2!O&z;__AfzOD!Lzaa zM*aYC77v&n^6f7|rCoU7`>4K2M2AU<12TDpgvY4gh7D7ZF)=YZx{!Cqv@eCzjv{a92SB0fSB|d}i;>=| zR5fY8?YTVf<|C+Lr%?=*%5fw}-KYIvv9;<0oF+Z-;+F3&BP$zA7h#?9Vddkf?r6f< zHRhCi$0Q;P*=dRflX2VUZQOqw8&`M%=IuidJq^IUK)LsWN^dYg3zKSY^4GcUZnd)h zQZnIqW@uqo6m^*M=i|Qb=ha9lWQG_=wWI@MB`eAb6@$-Dbs*0lTmKN17CGvglPYVd z0)-QoU=!iHU?_=+N4OKY9QPUG&|7k9pF1#~)rUSxKU)#J7m#b4FG*GWI4(@~)C@d> zdJWBJen;LUcJKmL%S#nO+i8O7wj&J#8||rjKcSr;?|44_IS6iLzAKr=S#sdx3QInj z_0rJRKZ@$H-)SrQ<32`u{y^?f=5+Mjg-Q~AIcq?pRd9C?!C4%(Jvb;vutN%Cs5|(4 z#QQ6nEnCS@9gSPB=CBIydsCd6OA}@!toT~R81t^_j$Tn!JqDl$m9eiBs?CtTg{Ye< zriY7cyi99221Y-?kKux@><6WB>}RF7cP58*t_qRLDI=JA7P|FDqcF+Ax!L+!VzBu^ z;M1>-k!FUu;*P3R@Qcz&YFDh@BRmID`Iq%$#;+HD(CqF;-j>2Sj+=ec2(g0#@pi(b zkjMWkQMcmksF`IqhRQIsAv@DGg?6w*39k=US07 z%7U2(qrNIo=JsgW%F2=Sp78f&PgEMb&z@cAkfeoZa0=Pr#Kfm(>pD26t1fnlfIsA+ zypV7~{I*|nIBc1dFU8I2^e5%c(`x*}=b(ag;CL3D2qsc)1u$c!rQ?X-g{y|-JX-t< ztO?#tyu+%xdI}e>%G6OA1KN^l?aj1C!RLkxwPZV#9{PrAHEs7(81%4G0su9SYht*2 z$JZ%@S2xQdvi@b|y-sZZHB%7m-y&?E0SH>!iENsJTTr#<`lrgaSlw%9HIy+W;^#Mk z>Qetg>2EkktUbN9az=M|%^9dH=^AE^UUBoDy5`Kp5+c2VBbEJ64qxFK9l!6|wk>qM zAiQgK{(jkoyKA;j=wLO%_=NOHXTAe2CiI*8vcdzRT9|+%=BR0MAgGT zJHPGrZbgq`)Rl00@;lO6mB!D$JnKKYpS1P6pAMWJe0-iBu6P-Md+m;5BU|6 zPN_ZSfd97Q;DQklkV`OxncB+{cTpG9{C}yN@wQXa!@&tzSi<+uT!Ht`Oj9f6UX0IP7-LZ_!^s&!X2z9cVHJu#mrC_~RFsL+8B-jxKpLV)09>Q6s!G`Hix=E;e> z+5s#}0k{33Z5NWttU?*~KYziRI?A>A_r7gKy4)ftake#pbH(J0goV^$*6fV;($Oun5rlN@YJ| z5FHWE;^!Ef@?l<1djZ>qDS*0tI2HH3xyj2i%C21_5tsx{h%QI>r}2+6JMybIwUVY= zN&x}L7}0_Nn>yRKJGB*`__|*G=M?;hSvv5@w@cC{vh&%pa_fAH>xy?RJXSWDuksTK zj;`(zbf4+s;ytC0<5}Q{!T?;90PS<>QR9k+g7<%-tw1-b>1M_{6ujYxqSlgZ4=lN3 zk$D!VkXT90#`dgxhhM)Pc_h({$>VS%{|h)U*l)V;4|wo}IOVY+>bQ~zp;SASiiMjG z0x~j|2IU;$?VLOr$@o&e#sR_v_VeXmWPNk{#F-MhB!S+{ev{wjA53B<=kJ#&naNzw<5R zJ$MF0f5cl>QQZ|=lf%?-;&t%KQd8{As4o9pG`5E zv}i`{bRYcrg5=ZKD!)=cA2jnn1C%^>=%}A~imJ)#@`EX|$mnaU1LJEK98AqCWAf)G z5^C$I$Dau^(fLHFn=KIl?gS?UHB#`+9fRWj^t=Kr1+XwFM%A$9eU6csN-SFMq}F8_O`=!Bt6t2JBuGUeL2oJa_# z@u;pF<-j!+y}13uxIhY~P75bSyIco|u} zMuY>{qB?5gGLVdB}+Moo_DaCXO%Ny-->v98?BF zru)uWgcPr8Z+|Pr%UWw{Vd)}K)5!(1bJ|I*XvZ$H?DQv5BeJ&y6*C+)fBaBy_IT|= z_f);+!jE#>5Xh*GLp*dIH@l0qxQ>?07JNtS$#M{Yr5Zt6g1;72Jz;l}xbU93>*wmm zCe6wFJf+`-SB2LZdGprO)HUfZSUNC@N(VcOmvBT7{pjyjhz7rVDez+(C}YJy8TJ>+ zhQ7LZQg=}=uC694t=(F7doD#HpEU0ktRL3hMUij9rWE5WDO=&Sm(jvBuw``}MBMy_ zUIq5>_^9FmC_OVRcOPNuDZ^X zn*G**yUBXVA*Hpj{OXHIaP4-&$1*p^2#(I97r~e;gb&eKw`~DL)}1>Qi$eC%?3yiw6~n&fp&fv)D6pF}K- zr!aKQ>St3F56fyGbTcR^!;5?^WGLbF6fHUTwZ+ zYY;wSujVoV-oJznB873k?SkrrwqI1D-%fIxwIj?p{fyYlOtuK(q;~F$&u4sjA}!CP zX^UuT5{$L}Jr!sr`w%s6G^z$iN_XJt{l0cLogR$&p{}#^meDD#dTsOC8D^AGspE_$ zDv1~1{rlm$;rGg3+m2wK^?Td{o%|^#y4w`;C#B&UWH(}p*-F3No^qRRD6>k8n5qx4m=d}^s4J!U8q#1ApUCaJk#P- zZim#Vu-##f^x3}Np{;4L^jYG)QiINX|Hf89$y%i>q>MvV8pj~Vv*l^$@9(_qH7Tde zn}B8}Ed*EP2V0^0&Ulb9x3tS9`7-)tg9KcFSE*klgAgR7pz1s61I;58ulW`AbSQx| z@H|z?m#d4)n^0Z+p?BTgaGR>sKN`={3Kiuo7>AyVJH;Vi*us5)WpVk9hxnvk+o z9vpM?t3S#oR%6m$Izg#RQ{aJb);7mKu6>YC0wxqXW63re_Z;F|UY38=a%^tX4VtNT zdBW0N{0?GrtAFw+wT*Ig02deHngk?kdF4Yiot0G=i*( z(F}O4Qmu~1X=*T#+KGkVhtDiKmW{_ME_gAF3?BZ~Y<_vns<2(G+iHF!;UIfii&_Y> zslnceUR0j5}`1r>fcpY=W zPg{x``Fd5@ZfP3shH^?dDLdL<9-grboWkVC#q;hRC+DK01_M4#_ZG3i@BVXDg$Wu{ z@V>)hhs+X5em8oJIj?Nc?yx50N1>>bd?2{4>8SN?1KLIdMpHTaqp*GSlY{uYt((rk zqddB>@`0x1od}b){jvJtSdtERs*;D{8`bsp?V6qio%}AmQE*u4%%fU-U%-l@CUw*B z9u$QlkB00|A@9p$GB}ju>7!ZPJ*Xu`R&ot!c)QERPEbZ6!tahfW}1Ra?eEdcRL~EV z+LVW>mo>Rr`B-${W4H3xswM6apW-}7JY%^FMGv^KC4(HL3x4#}1{eJh+SnPgiFT** z$wePMCl{EIRjA8S+HTkujqQKsuCDdvqmzaXb%cMx8{^1cmqbs+dQ^F-duJ5e*m~wK zxc~l-YR)UFsc&23NeD{sO;7=qDkSt?r72AiDWL_WsdVWzQA9ulRGRdF(n~NvD1yO1 zy-4phfJiR^DGI{fc+R;`_wA1RaPzpw*n91@_9`=Te&4T^*ek{406tI>D(8b94(A=6 z4o?j)-&NnBn5iq!ZXBPk)T^NLDRmPYyvOTAPV%>5d!TSX@T8O6lYvzIu+HTv>>buY zmQaK<-(`@Wi;RW#L1+{OT6`U`dQUA{n3lfzcM%ev=%`QRiYUr{rtVKZa$~W>>MeZd zF^OVIDyMP(2Uy|)OUnW!DcZm;URDh%IlEZr#@7+cv)q!D7pmWx(o%<^y}12UJw)-_ z@bY!utRHL_=Va%mklpI_rrjgiKJqOFG_w1`Wz4xw&dHW6DrK*VzOKBCAJMiFu*{aZ*sjnX{WDE&T#qY9lr+_mD5?7*u&B!WO@gw!%hBUDh!ky= zFWHG#KYWcgxV?bL;9sh4OdM0stQ0>jvE(gAQqOO_lrcP{Gd^ zuEJ%R56)HPHAd@h%53fAxjBAQ_nv#@%7{b$(+#cBu2tcZg!M3$=|7M3g5(d+uPJdBkbLj_! zof^z_Ao|+p7{Rk$;&Tg2w}4c*4f-zO%U)*Q;&2U|N_@ceDuC+ngipCMoBL)vr5Mr@ zwb>S8wecLELxNXdMXyc8$H5c>CtVFy{7y@jz!d#MIb88|#tX^rGo&sbg3JgkW$xm0 zpmd!MO6a4yvw3j4{YvAlC=mkGLe%iL_r*w^7suC|`bDL8Z?E}vmBA^DQL{?N^>S8x zFWAA_wUNjyI%OX4%SJDQ#;ZD!(;q=@0_%&MK=l3NTGKL?+SvE!INwsT|MUQ2UzX{F zi8!`!9koS-x3Zs7c*Zb{=){dtebQnjzWwU7cjuFCeM=?CnNqyF?EU6^KN%Bo>X!A% z%IzdSd3S9zK4IUB78pWFM&g^8h2Py>E?gUO9$q^Nr zN7m?i8g0%s`AqhvR9{UwAWiuPq9o8ewbdA}>GonX4q$>Xd&m$>yq&ftf{cTo<_31l z^RC6m4mn61yM`D3(RJ%rMtEy7nw?WalAf<4zG+{N@4n?by2@!)%kE_`x-l|LWBwmU z+t7xjO*F10BFXSUnI$V9a+ykej=!-WVv_uKg9&;d&pfHISE=CgoqsV#k|MhM1SgP_ zA_*gOp@02vtu=-~XFPibV!9?WjFg?TP?mSLCVO)Ze%8#^mIBpi25ex*eeK36n9#Ck zP`L?u%B6T%I(zi8cUGw%&#OC22wSDxwY?|b^y;ZG-9fX5?92>6ZikI%#OpUXYiL#d zhi#_Q$U<4`$6YYDbz7c+(j+4R2USz5k&7JqyBk%wF47lWA& zAvIFt9w>q3&xo)KwhPcOh5M;ETWd__-RjwYQ#A3`s(C7IdX|}eWYaJTo+02uO?QqJ zd5PPxZs3F#N3CK>{J_@|g=C1dtZyY*(t&L|IDhttFYzlMKK(upA9ga(;x|vB z=SCDuGmS$9-5WS%_ceHDjmhqKIcyN~%r8TR*`Kxko2Q}MFJGm5pD)#3m6^6JOUk5X zteD>dsh>8-YlQ+61m3CJqEM9hX@5b|>K_0X zpq=dHUs!bWg5@<6kAB%3I@#v`Napy4*OmM7*WngB_?&O<81jA;!k63`ht~duW#qtz zC_PhivW5cDjLv;-Nz{E*dD992S|HLk$>nG1pa7;%szEyhmeOjQv^-o0VzuG#zMHp} zvj#_xm7b>onTXZ~8n(~?EgL`W4AXR(@>f@S*+v|Eb<#oD$=@v@d3XmAGu4q`CXA)1 z++9(dtE|h-RgH$1biY$!yT{i^_&&X-D?r&?zLFz9TThMW|yTUF>4SUaUGDP z@T;}j!)5uK;I6Xgmheii_Kx&C5; z8>~%vaUa%Rg(z-a2ctx|96T;Zds2zr#}8P`BbN$5%!$x7n3>H$?^d30Acbk=e&B0@ zAS~|i-KwGSVpL|f`+aoym6XGqUjJyJuU2XU0s~|8kM20(+Pv&gnQ0VQn_6DG*#@oa zB|gawerdzro;BuqMVxJdC*eT1Ve%Ny}2vti+56XO#*XPRTeH01YrW)xTZr&>d%tzKT0<(G-o0als$7FXFnR=O7tN zwigS3^XWwuoCrg*S<5Rk%H@3Tm9f$^K7h;COFE{B*y&sb>|GjYwD4ZnjWi_tk4~=JeN4B&^)L zN3?V=0W?5>#S1uy+)Ps$ikI=l*x%Gd-t!kpCog;uZi!je`sP4@3YNoS@&2yf z?3fJ!YX!L{osNwl|0owy4h-@d%QzCF(VWnya1HZmtR;{yH{H*0y<&rrZ@*@-hf*Md zqvUqsIetQ#n{@$eFW_EoZaP~C5}@?@>zDHIt_su-Kl;mxC}Xa6Q+plY_(r?1K!45@ z7cCL5D(c>YUzYg~E8;$Q($LI`HCXGuK>EefV)pDhYhX(uac{l`f|MF0+6y_=W;_f( z#4>6Q$Nav)3*!r5!zeImUQx$s%}p5%8~7AKtPlb%hhr}avr5-JMPQ*fL!js%l(=~! z&TTmIukXq=t2`F|*yztt!1WGeo%L>!>g=rA;>)*vt11!GUtRB}Y71R0HK)TpDDoEB z5jqw^%_||M{@adK_p<4CY0VR5R$vQpW5dXYd~P6MxwCJmHt@6r9G^|KIQoY7Ig;gD zGEMV(jCkOBZ`K@lk}TQ3#(&SD&kK~0c+>*J1==GoNT?3=e^mcsro-QwD!|e9@O?X9JZTuC82Eg> z+@wHe5-tam?+vSZJ5(L`xa|f#Epg|1zW#v07bbBV*?}0<)Gm5^n{sm>fZyODz$NbX zDrL7!a(#tj4UiGO0fpb09uUWWLYnk6g#d;XU9^DaewWaY|7Z-#4hB@!+o11_@=P(A z@$J??9yk_&AN}bi>80Ftk5N0n@Qo74i-OJ*uK$X3fkZ3lJXQKXUeZJZggro*4@IC= zJ5Lv_JWl5yoNep)MykSSh;(5`^d1+IBf=kCLjA(_IFn7UE?;UsnUniDv2Zxo7b3%Q z?gs*^oQx7~ob?&-?>-CJxU|{m+tq ztk2dC#_DB1ad+DBOa4)*O>p_{v|JZLlhOtPu5fumK))F+WMN>EdoiX^nB?(h??v^ zKHUVQR#ZC`xKB*KTaU8IffrSVoD{JAc069MbhWzUmovvVIS=qh?}eat2=B{Ez=^^p z3zf~MR7RA`5JqCT{Ti9&@s*v0-yMn-@JRxwOyf z)9fnx)m8?v+b~u;u(1pybaV(N%b#!pUDE zq(1YMIO$POvg!Ge-61HZh~Yw-eGA2wj{^9Z)6+=cfuaku(tQY~y^B4bLzxq(8 zm`1Ys@P9oby8HCf+Gph6`@^neo%$o}TO&h4jPhy|`BABv*q>h)Roea$y?Hb9vc(ll zSjxrC<_$U^_K*>5k{!WqH-8DLZm`6+ING%naHwk}l?nrb9^S0O?DJ%Rk88-STUE=? z>L(dy^tlaKNRCqv$y~{0Hg=!=7^hLVMRq>$-dra`W7eX8-xiDQ^48BH+CRcRV6X1R zBu6a2TpYyV*h8wGhY(%zpO4|&FHF+5Rm4n^?S#{x_FCAX@q%jY)}pq-)ifNdMRTw3 zf;s&WNANl3-T-!teK{Lev`XUxWQ)RWd`bOyW!_1N0SGsxQbBHe$G;Rm&)q#?#JD6D z`I3bU>B%--aeOI(&&np8`CI9E+DS*AZto1ynBuq{P5_r1u*ADajr6jl7agj=G0yfD zK(r1uZv9$(k34IL{<9l{lnrD9MstE{r&q$3(XQ$e13;W(Ap-BOdR-ovF8t&cmSzf< zJAoZkMyP4NJAYp8?<4{$ftaFN?q^k=Tg&krATZvveou$Sv(o1uo^wp*t?rM^s1}ec z?S&j#C|Xwy1Eo>B#6fZH#GH9c0pCity z^9WZc`aToY4jZTcKgfh&dc z7rofJN}k*&Oi@wO-W38gDJxezycR) zzn7}lyZsi)x|02db*{I$t&6{szo(bVzjQ4zN&11;=*Nl95FJpz=Fd*fX~ml*hdZSd zHL}XSkPME8oGBwyENMx060xQuE5c2MrEmF78hX<#S!x4{-P6UN`r?>C^&Zm?NG6&3 zyp5TwK3$y7X-N)gV)5G)ptLAD#9}TEm%Fg+`!tw2m)Y(k|EGC`M$p0QF3v4=^dc@O zl|?;HiuQfMQ$i;TlgbUV7^3S`i*u?${_5V8ysV!c9#w%|OJsG?&3gDs2My|XP)ZVW zA2nIbzY!R)2y3E52-_=Dc-}J;NGLKN4KTrygl+UQogGCDv#{($bZOCp@JjwQ89y<( zo4UdFNI=Pn=}gU#5`C~c{2fZ~F-N=w04XFJSdO1}ny z{dBWbc_qS<@78fVOBd6>4Ft{Uw>9Hdwkg*%`$;*QvVCyV!8=bY7f^-QBW^_3`nyT2ac%H9jDa zr4r>{?iM{aJpCCMG|3U_)NLqbLa_tF&<<{$R;bw2()@21YEAkXnRW>%eFmXofBvjH MT85hCx9pz(7f(MsUH||9 diff --git a/en/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png b/en/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png index a29b4a6034f7e5f06ca88967e851dd06fef52235..3c83f92dd8638d830a372a9031def4b7add4ef43 100644 GIT binary patch delta 20172 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 b+;0Cr@zj1s#8KF}00000NkvXXu0mjf*bb1L delta 20112 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 KMNUMnLSTYSCj$8Z diff --git a/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step1.png b/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step1.png index ffcc5ba1ef7924f920896886e2ee63845f0bb470..42739737ff6b8ad9175fb29fe96e239723d0c56c 100644 GIT binary patch literal 12746 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 T^{R0B_mc9`DpCb^;ZOe;^t`M$ diff --git a/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png b/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png index 2f5c161a491bb26ddff0776c517886eeb9057d90..4c756fb44bbfde6ff84695de25a3f37351fed456 100644 GIT binary patch delta 10344 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 G@P7a}b$YJ= diff --git a/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png b/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png index dbd4c1ec98786d04ec005dd9c50f79901dd0a79e..f2b27b9a4b458de7a3b06dae895f40e36a328930 100644 GIT binary patch literal 25756 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 diff --git a/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_definition.png b/en/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_definition.png index 544458bc19e37e000e59faa46a959bc4e76d2028..bbd30a047643a6438ae7d825b2c1da5575bc603d 100644 GIT binary patch literal 27213 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%0DHNlFqZ^o!KR>4Qn}*PUykA}H*RsIhTDM0m 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 C8{f_V diff --git a/en/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png b/en/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png index 20ed2d76e95de05b384f52a12793297e90880c6e..e4f7146f565d92d2b1d8961b529f04812468654d 100644 GIT binary patch delta 12873 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 literal 13786 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

FOWTb;F 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%0DL#c;J*F5?`~8t9$<+t7NQZsJ9sO-C`JtZK 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 diff --git a/en/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dp.png b/en/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dp.png index 76f33789a4af7fc4a8c03e4b711e070902640c5f..d519f468bdd61b4f4be6e717728d9b2952b7df53 100644 GIT binary patch delta 19224 zcmYhibwE_@);_$4ZV;qfN(l)`$p-`kB&0(^P#Q)+nqdP{O36?n9nvWL({BCum@~C$wR)C#+#9gZ1f3y8!U4K<&vt`aZLJ3&a6;(Ji;P zY90)81b=?B2EK4su2&-n4UeM!(n`hF7W{@(qTC)Vl$CWcAjmPTb2oWXhH#X{r6%ar zY|f5+QDzYPA*3pj)~{ro2KrQaKfdXk0vvUFnUT7XF*Eou?G?|=z|Of(+oG)(^74H6 z6h9+1W5!$)yQUhO6_U_~jSo^P*zU}KUx9R}#Il%Kxb^6xqMHh|GxX(b*Q(mFFWz!`~)jAsMa_%`8-BDLmE%?0Kyx74lTkEsF zgS_y&-a6Nd@P;ZW>mu(Z=FhB?v&sb+6F(l!)lbehp1L$fHk)Y?CYdd=rsslmrM4Z0K` zk6PC_4}ZrSN{yFzGkTSj_T6H(dox*1#P>;7$caE+>+2r~Jyg3*!4NomqPmvUrH7AD zTZHF3D>KNs>LNI|XuzOouQV_0f`_o76MU;Zs-uFKeaq>_MeT`#xvB?8$!3d6J|`8y z7v{cF1XYZfLFD1jEm*g4)SiHsEde4decK6sF@mYBHR)TxzyG% zibvEr9NhE3hppG{4;=<02U)!74Se&yYTrxbT;K&MJHDyaV>|+g%yzuZa$+i8Y<}zP z`pCy!fUz0OzcE8gVrCjU!{^yf?!&{rq}9e;#M6 zQOg_L0<#xCjWzhH!zZcTSR@?G;rc`hD*k6HtYUJ%Pv4|G*=|lJbVAz-?2aFEsU3Zg zj7bv}RNKa3%ae7kr5%*e0vNL1WIgKVhv`CRo39E4)MkzH_rIxK!t>St>ZIb|qYf*M zQl~r`9IfyJT>`%;jU|PC7^jy=tS)+2mbdnXtq&ggZ2xeTsikV zyGgm!OtEP-_O_lz;eNfh9?Xb+EEs64|7p6#xK>|YMYQaJx}x%SG^0BF-tS%^=Hps( z)5J6LDKpU9%0!iSbeuYevp6J{#3(m5tW`u*?Z&Uz=1E$?E4_H`asnbI}H5rNb- zHj?kpus|rN*J5ebfKG!(~m(Y&OUr z@!^~4e-W@8o*Q!hdHFSZ>npc*{g->Lh8R&qk40XnHrOmk6kpc9$lyrSP@XUSSIzt} zs)w3~7R(R*JjJD(k0QS8z1z!-IXa@IE8r=xKcAEA=4!1Da*_zI#NQG+)dNc?mFu_D*o6SqmJ<-^*KRF zoUeITQ~+BUUX4-qmnT6HltEh!uH-S-=E2iba4$X>QrSTV{;CeK@#Gy?Rb5_U1pAJ&AA=)ur!407e#{75aXL^l@`tg z436F2{{Hl1<9Zu;v9By#^aZq?rz&&f57lP%IeBjE6rD_qP2f0Z?rnZ=U%_n_T;afA zYHrHf14H&SLMVjtelU*AoIf8k>>f zNu0`tHCByKR=p+VY(Hd>6OPdxNfzOl}#wgSkmpJv*C^>I!hZ>t% z1R92i!sk!18AcDnbto^mQ`L1@D>jzO(x?i!PJet1m-w%s&>5g?gnQYO{2Ms?QT~ON z62t8OBs~CZmT;~b1_Td1PYJg;XfpfNg>l!hL*7PB%_=0 zt>9ZY`LW}7FgAMn<7Fj0ZhrbLvv1Uk`J_{BcO}X~=sgLH(0Zhs2hhU>pjv+6Mfl$u z47-Jmtr-<>`u#|XZQcr>+xhviX+rP1H!1e5bFcOUQ@yB*64NEO_5TFC_h0IC0Y=mt zAxtU2RcgWYaPiC%tDV~BTm^B!#d(375%^84_u=S`fS;0UBf@T^6e&bwRMF5dbGdQhM6x>klj8JJh5LKVYDHsH z>g7heQzhZI#dW0ACJ?w>*i!M$alU1fsjcP(Yg;SJRLv&3z6T04F$BqzUB5q%0|&~$ z$-tkT@A!Xwy!2zJIlZ!3u11Nv0D%L|C-^n&OD#Qn;ZNvZEq&dy?me$`-AAUPhuWxQ z=vvraPh+m${m>XuV{vtg~@{^*|LoQnGcaz3fa z1dt-R7T-P3QEjvwN48;1n{kO#WwShVu_-|UuX zAjghqf03S(OBG%*o+t^_e(eDlVn;tNH^OeiHnVOYnaG^uNHj?F-aCyE04k^E$rLoy z?p1KsxQ^HI&%JmEl6*D3P!W5w@|>UFW*ON@?)Rj!467Z2DsE5YgVyu zn^kmgL1$iFu?u4z*wJq&eGQZssl3UW>-c=VwA6GlCDFtb)Y>!{u(qTa%t$w$6MNN8 z?#BT2%|OjIGMBUe+ClIu9T0P`$oJ+R$JDW(rf+%yrW%x>8&@h<{o99)Tdl6mJzYR_ zIdlzgx$734=O!VyYz=fzOMIBu{5Ic$eD44(<+rlGu`DPsALEDFIQ0s2ckL102|CRz ze0_D$h{E4F-E*o;sm!xmc*jCHk`d=pDN0O8yolfdxvrkjBR(>%o@lJf%&Q zoOez%CBSGs>F?y%-J96 zpo4oq8O?XnrtuE0my-Fm#ZpX8j6NfvA*2m6_TTs1<~@zA?lrNpI0DsN0MNLZNgkS9|dOn?>0BVys57piGaA&={&95~z2fi(Q`G>}Aspy^X z(pi0}U{zVw(6~hKs@LtW#c%K3fZIZ;%cKfit7vRvmoSUB)o7tNm<)Q|{gck@dVjJu zOUxHov^VTDY%Q&g+7@4naNOLGo5BKx9RE5(yP`!s_5?b=iqY~fhTgr3BWUZT<$5FR zlr=3Enp@6UzXWYw3Vf&Wjvs-19)Co&3M;sEUPKCO&tIHe@5f*~QuSDS`@2O-qwihG zZb-nG1eW$2OGTVzE;4izk4^!`0*vX~-e0`_$p|m<{*3gf^v6HT1;sh9uJ_WSt2c)K z?%Wz%Z@!Ru0J_~Icn6Z!L&`<4CVk>bjtL^Y{Z!$7L% zX&JsCVTRmfEzHJ5%@rxCq}Su}@M-jz)x)WW<$A4Y*x>gx5dbPo>sY#U8Z&9acz8R` zeJuMh^A|-OJJ{}dnaNk#e8^(+pn~+PJ&ek^cTbZd2myccLXBnDw~JbW4%KFk8vW~i zmXE7Dw|!C2(7?uO-wTzkFAntHO>{xkq|1C_d)B^gVFlMaWgEX4&EWIk=>o0UVyELG zaMh|(V(v02cob+;xQ*Z@Z}X3-*F;?>o5)l1dE0@XUK5Eu$>ks4C(jg`)MXiNgdY~Fr#1HwtI{d zx;F1!EI&Wy+dp5Z z1KWAUwj6|HU+2zyjlB-e`@MO66>Nqy+Z3EBzfjYr<&*b7UGMdh5@xJbE?VEl`l(8s zoyzW$zMqu%b-7Z(f>ZrBN^{AyUc-#8!x~4*^#rW98Lvl1aZA`~7nbH>9x-Sch{Odq z0#dg4>AL&$q0o(^gwm2ReC>vKHzE&AyL|F{xq&$O=>8*D=Ww7IJx8|rJaFWfjQW^l z{p6lKX?4IX+nbv$&;1N%#xKy%;y^jq`)2sOfA#r~5lp&PqhlUF(uJ;&4lPKWW>uz2 z2UnmmCO9KHijM-PFm+0e@)~=Te(J_M7iXEZG8y)^o!WHr+V6TCIqvP64r0o{p>|Be z%RMdC;YNd-KfT|s?$zz_@0?b;M{GCqp~x|HE{Er=+G)otG2D1^FRium-oYrNEvBSn z3Ta0nY2dghjOsO4!)e53U*E%)zB-Hr_R{1nE^jeko4#P4(kcU4*eQQ4aMk8XTe5d# zaVo04WNZk(6hZoeCY5QcXDo&s*gA#>C;lNk27w-vC|6SEm!$G-n~tg_v-5u7!P6Bq z`66uYov>(U(ny1iIJCTIsZ3R1Nzxn!P>t)~Uhl~ERG}w5GsNG7V z!#_Z|w%8eZpkwx;&^L5Tkon&L$@%jGGyf2jBe=s`NLUHpByUVg#NzDG>M8BZ-kQ0> zW-4uz0(lt^%jZ7lu>XQlRkK%|YBCvO*xbTJ_Yh>)6%ao+T2U>@@=zL2(ZFe4&Lw=T zE1z?dY-|72XX%M^9OADgT@K?f(<(Sv z!H-c*by5tJixTmSD_%>TFEP|^v>ZCm)aFLg<`2C=m#KWv({OD#M;17$!9_V=UT~9< z=0Ja^NhWg!Lg?`OrYIQ{)qbbFdPoTAWy^#9X2kj!`|9J*zijWRsz~o|#*1*EY}Gb} z5#}){a2_)ta863|3Ag`qfcQwFH}AcNl|G+^@!#R zljd+9Yl`CPu4NVO68_#>>IuG@^Zv>j&9 z4;N&)eYe%xfIiH3e){@#?C~n&e(Yrl?9@fpW4n??Al0BXS>LcxAAWnzYNP=NsEbdx z8T{4Yp7Wd!Y!CZoDXAiCl+ls_-nBme1)cco{&xNfAWjGIbvC zh>!tG$YgRaq`%KWcy{5w+FT(FY4jNL>x_0E{0-i-?;l{_sDg^cWlGeZ@lUBZG0>&ZpI*7|p{EMHwx2D`&3qT>pHqp781)vrF*PU|(f7iRUqO zNbKx_vx!wXPW^O!HzL9No)6xl;Bu$_$Nl$dT>pTMRudIYxg)2JbNS^@d#JzO^H{x7 zje)Z%S36FTPSmMgdHvKmrycUPYnI7V0dgCkRf5cW@B9Iw?%h%^^J~ilVxL;2(YyH>H+eeRZ^!SeQ6=LP2OBh1%-iXA zY7MG?2zeFbYmV@Or8Y%8{`W3KhZf>-*X-$wtWLqF-9qTJ17w5C3vekI1EJbc`gg$% z|5-9x>)->)I7p6a;CA5tYbuq#L@@EF5$q@lH9@FZi`M#ARpwflF|+fD z0BhnW*8G0DvwX+J9dFTJ#k+|(#kp_K4t^~d*X1QX8I!3&=Qhi5{fWJ^9zC%{I{n*a zA<>DD>z|To{;8y}vf1Yvxej|MKP3U*qg;6CpVhEauhpWptbj?+aWJwiLzDhdC!xE z;vKc!dp<|luK_)`r^tIyvUTU_SEl?l_H4l?7u zuTRc@uJ+LaQ={VYhpHN!-i;w^t*lv77P;-^*M3cG=!(mW7bxXcaBb;Q=9^>YDID8E zyYUk_^oD|;UYJshxUA7EsEn9U`<##xha=Pv>NuIzL&kM}82zmOdhFz4T*s(GDO-cT zgkI~`F&78r>#Yu#bG>3@UuBHh>^3L0^DKO;%{4Q0FXJki-}>%%SC0U z?_Lbpbz8I5=Cxzr9+`UcKV+6YXLk}oh_{$uJdlT=x87M}a_q zZOcge2HMF;25EoO+(15pbh@a0;Qg${V}s*}hTrt!>_dvgRPoveRTXci_+2Np{$!jj z7ECGhaGu*hvlt5d$9uTs&NSO@4gR^7w*B(M6du9_!C16X+a-qf!aUxp9ryjj zWUDqgUqKBpbV;bjeg*aw$S{2Xcc4!s%_WPq!Y)BP6 zGU@hlf}W7H?VHJca_lQVXKnec3Sd3m0|xh3-)EYYYdn_3vjPpDqtY9X?s^VXc-Yy# zgdPnK{=6=d3&J62YY1#@y0b%_x=-U2y}i?$Ix%{KnV0NFtrx$}6)k^RUd!&FIx$-Z-SNAty}0_y%K-hOg6 zVJw~TZ8b!HbiJx~7M!-p+glj>O_X|>wtmHe19_Xd;`r6ItQgef4GT5YPF}7|oTP3! zgC6zioJY(1rwAFrADVT1Olx^o%;S%2_7S9mZkTzifPgIv)rwVtxaOiUl(;S35tbRT zE<5n*FQslWcD`qs{ zYF3KEHp3D!+kec8MmRp#)rHfh7n)C1nAbcqZRUiM5-mz;Tg-C_t|OMTh{)OEv2>U} zPlJM;w0E#{c8*8)^DfACmv)=lP}@C{a>lcU3j|CDL+Kao?T;?TzqCtFXdU0Q_@DMC z$}0YXa6SiOWvG1c1^I!wK&yFk16RVfdMqk4tT#pna?dp|3$y`*WWi!%nz^AK4it?A!S6SU3TuI!k6B2X+H)JfLn(#=l70q_jmO3>l^%U9uM`(^8nVIL+f z%UJdT{68KCJcN>xEfyEZ$b1PCFWVMO{VeV{*S(*}st|&gJ!@TB&hQ$?incBRZ1S$W zxYfIK5Go8kfG)jJSX?C?t}(DkpZC?(loj_WJn{Ct>~uR{ax6!?!SpBrN)bTycMl&g zKaV0KvbGgp@_MID^@-xq@y%mN&({Z97pg?Q!|di!GK#I40g>$|Xj`~= zFHpz3m|R51CzyOI%Ts@Bm_=i?u(2%5 zClI)}c$n;d06sP0lS@#~U`@+sF;g&ua5g+#w_!qoW>2ZoH&Y8)%vAqgTVHt_sxxC? zvDoh3gF9tG^UYMpBCx7GXN7*l)lBfRuMz|Y(6r)><+zKRh9mpmiLmnR0Hj?5TCimw z_N&W@-}|cOCFGOIO-c>xx0y-k_4bG$ui%yc>MZyf-RV%b<>O^QQ%dl05#rM&AXud1 z@D}ibRj7x5D21HO(P|35m@Pt7(5$p=2tX-Z%^T%#8N^Y=EbfN#va}9tEPqeX8%b`vZPOch9aLdG+qqwCFKmA85B; zeR-B#%19ryH?Rhh61N%8@k(4<=%kFKrI5PpT#Vr#56CG#v(tp=j!?eT%^5YJYbwn3 z3S0o1x7{_H#1X)*gjCU&BWuRHLBjRu51>VhUw;&|`zx-`KEiR9g#Dtr1b9%mTq|k% zvt%jRsz_gOXiMm{R&oZR1@KOFA&8rmaXe!zfytWk&jko0s6&8R-R^?5CEgCvM|X=m z)>X~D(<}r@)Z2@xiu_K`fC@PZeTr6~%+9PX6Ab**C2u);hHxwmJ@{Gz6x$VoXZo!# zFzcl!%FB5FxY}SH%rj61p`CY5$JM0e-z%A+D6RRNh(3nIMxx1ba$RV%xGaFl%JP(H z?GOhaGu4bcP432eLE{O}Ig+Kr`f1#XgdviCZaQh-aILOq{i^$0m%zL~E_`Yi=snR+@?c}t5ZtHiiR8!Nq#}b3P*%apCl&&vx@eX zGxwi_`~W66XXaKy?lNQrqgFS1A;+JDaz#jGf^_z94y567|E zbs6$gKpbh)UPr-yenKEFo(0Gz*5N#Tj$7E3!co)YLXc^8I-xHBdVDARW6)$v+_rEz zC4ne!4G>;4im`V(@nUawAt~ci*!F!!@Z9C{ZP(9)!`8MG9tkDjqRWzTZZd7@Z(V`6?Zud>gCZ)sI;PYcB1sT5T;5FCD(tQY#P5#e%iXEatTb<_&#_{-nDzff)#s}}dzb~ce}2mWMtm?dHhTVsAK z8jrxjB)L4OaJU`NGv?H6{`qY@eOer-&(tV&c+{cY)Y4mEj2FZ?wwk3_-&)@|F}u2@ zV@KH|J#wxi`r17>P00gAkz0^pX0r3g$F#AT1n6@Zo%;UPy1Dth^-w*-fe9tEsq{0k zcgBKjNI>v<&)hHA@j2fM3%sDUTD^^q;=Q@+!<9FnN&;@S_-&rik)nt9(qX%Py@eGU zu6ZPXBCBX*?qMA_0k8+sOE#;=99P) zFRt^?N6iJ|u%nQvM^PN8!1{+ zLmJ$-VR5eku}hw z7dQHm24!~?7#swSejV@fA5AhG?X}6x*3@;^ZNE&GHro}dlryxufORJgVL;*@9@Yl# zybUfOJxJ4oj@QZ^S{vB!yBvZu;SqzUFd_`sM_#{#ML09fTq`lS$ybh^xeZ(?1z2bj;b80F!8j~cvqvA*_m!D;Yy?U`}d zk(=0*vn&wyBMvLWHSaZ(kVH5nKgugBl~IEOowm{BuCdm|B%t9UP)EKvqiwNEpO}~H zpl5Z`*5tzrw9X$GH@K*XtruqQo*%Br3KW`NSIY83`6aM~K+*a;TGFo-hsS4OoKXI% z5vPmN=0C5}7Qc3h;R=k$o^T34jTV5x#A+WQy)q?KO~i-;51d|G_@N|BiLv5F2s8{f!4cEqv1>K7&{Q> zO`7#QY?@9J97tw#&2pM?k2oo+H;976;W9mdK2@_IG&)&g5rKiD8+m$0AcwUY zj@e2&L%jY+*-nBxuny?YTj$#+<>FHo41hphs0V(Loa={3Vc?q| zKK^B*K83S2^R3<}i&QmLCagD=G;(=Fps;7#t5y~b)OLi-U*0yxgk7b7Q~z|aH@=3I zAkApXWUr)uomD?Al4=bk=D^9G-1@ShiWa{TkOArk7HrWkMz${7L;(4C3EO_g^n2L( zrP1+oVbzRuk@@u@s&tBwZ+t#kMKN?ilk|J+lPB1#Hzn?yfIg!ad9j&$+%Z_B2WXK9 zSeAWq)!Mro#4&=yT}l!Zv#>Fa12@~H`+$P6>AWg4lbIR&P5#ZIC0iF0mX6E4Op)Z$JE({!@Pj5uat5jN=Fq5Nl$FMV9%eTk^&!jjgDc*A4b|jPy z&=`ss#=$xF^Z)ww-j#>y6*ji+Bv>wxEzb2D;3U3;7NqDTCaf}T@x1oj0L{a(S%Gz+k_F{FrbY1JtQfjtVt{L+u`2!s`z~#}bBL8M0 z#mye$_+fJ}Kr-kOI`-4qj2BKbnTuTdS=o2MY3$wy|uxCx=z;yKa=C*xB82rbsmxshg}LYxiZm7vO62$gXhR}H@m2UGKEK?_zG8^4_H@y zZs!y~FUyR`pr;#s1iwc3O=gh#eixibm(nzW(57K$Z}HO>a**7budg%Tb1qFvVRe22 zs2Jyyv?;H@vk6RQeZkmlYKZ)L=l$46qG|J!1k2l-@*dA~tb=;N&lcYj0UQDa zZ|sAww9(D)#Q;9my-i!-1g?301O?GNzJJWHD4wz~e|S{h(fXJA{{nw@(PkBz2N+ap ztYY2_pD5c>qkG?wC=@E=y|}Ty#;Q`0*;m0WV+?8$-D?s_&f)=rU;SF(3B6rNLI1K` zJ{_56f3mmuz%%0Z+&%R6xZbhw=zM^IK4?T}08d`=$ae9PNwHxeG#A7 z;Zi1qRKg#@C1L!(WCwh8vUXJ{=LJyy9!6r_a>!DK$oU7{?UV}HI-o$BNavp9@d*|iuHIbp{m|+yyb{wfQhDu zC=`F03z1+&pupDtdOUJns{@RZ9RCC`wMZ5XNzu>~v}q~IxK{w+)#)a-Yq=5NNUs~? zqiEh)gVjoo*u>x7=;FN%yd}j14~=TqfL6z?Y;~zHgbvLX35yQ~b_JhwHDFa$NHXC# zyuwv{sDFOib7bvI7PL{X7qBLD^@!}fOAKLK*DXQ6bk99(h@@)d;t*v}Oqs%u`YfZS zjZG&UwvVC~G>RZhk$?3XWB2_17A2g~?_sCFUex?OveLZP)Z4o~W}+H^_*X2533<^N zw%`RV*E;|QuGsGIXT5jVl`+Jw9VTWlkp4z7U}Crqs1?-R7q}JE-Z?-}@YUH8{`K*4 zN={AwJ3Gwj4TTW@e>)ha&VM@?TG=KFjP1aZdg9X3HPB!B8)Fa^Z{xS;!9i&lqY)0t zarWH)ZDdGpjlBBWLCm~j_(1-4B&TMHfi?(%aUK37j4SlEG8n~L6-YDf5Kl^~kituG zz=tuJdIla&V1uGO&fnJNw{QxQjIZ{oCk1CAs%>{!34N|O{)SXDT}8hw2HXJb$=VYX z_&YGg5f^t@k5Eh z?08p|irK*u}wi2JV^H+RU^6b8s#}5oAS9 zw=6_3N|F_f4aEwn2OwA!IBaccLCbWQE-=J~4FpvGQ2?-T*a#GY02~MbMGzaXk+|25^YvjAc8qd< zp*{tfLsd)bLhUTojMC9fh&K1}s*FLmIs!Q}vAi45xgoAzzPz<(0OmIB^@ z)f9`ylQ&-!^}*?nZ4d58askYrUoKKNWZc32@y9c5&;FZML}<~hTuuDQ%5-$EOVn)G z9oPe}uuSnu7H%N^7;=UrX>FO4qgpX;Xhz4M2_5Edyj%SINXf?JQl9z-Njj@dohuU# zytNPaHCpph!4%smW_#5RO`4UMc@-3hkQU=mpUd@n`9!))I;SwEE`m^j(;pb7v2OZM zd`M;8+I(glaMyRX?OjV#ckKx)%^ahsBX>7Vkk*jU{)hSDNXYNwMjr9UKnlV0$=?)i z&MJur<-PBbhwA0pj5g#{K~GPBdA29s*Zm^wc+)D{?FZHaZ@<7Y!VUYDf9xBAsL`sJ z462o+-b8URsNMID7iENZ6a$1yi3mfQ-}tDxW|)Lf znJIFwcBmE>;vZKF44s~1_s~}@?_xpC8jfNZa9dlaj!fxK~H_N`=C$M7on4FY zYM*bG-{?lxFviT#8WFl}XQ<0bTCvuW4?RyM6M%Vz;S*Jwg(;$ zVP@Oqe@M;`5}UnWS|L4e9N9~*)AWG~W0>T((B`_H^%d_#95YwZRZ!}7kzM+=-f2>r zH+5*;*w|(ZhvImE$X6{uYe9hL>LO-8^9O(Od!@aiCi?}C8}r5Mx|LlX+t4s>5n{xk zWnLy4y4~*Cvqn54J45C7ALT_kk`ZAR>Q=%p%^ix93x9hy82{;d>j_H%oqjtE^_xiZ zm$jDHPzF6+1i(bb2bK5|q>ktgc172R&ITP%Z~XO?;Y?nNOr&yWRTN)%Gh^w!%TDRW z?$_nyA$wx{xqYHF=z}`e?BzMKUW1^ND|%BO!J=0~=$0b2MA<9|^n-Gj$Uf|Gsr#(nBM zBFu81niMR#qgp_ncs=1Y8`VI}&vWJMpbXVs;&mHOv#d2Ns>fUZP0NT+EB`R!laGy0 zPlQwSyN@rM+LF0?MSbf$7CS5>7L70xC2Pu{GiHiqWb?0~n-MF!>EBoELeHXP0guwo z>IcjNi&WOW_B3;y!5AgqvH@{}yCTcxIr4>`V6Ig=R#RJPs85rm_i^BJJ(|Bhbao*Y z<(NdI3UXC_I;bEqa0({r3Jg2adQa65-2X}2Nq>0q<;h~z5GI!2$6>|E=8F^Dh&&p3 z?3X#)S{c{u^Ca^8q9_##6QT&Ryvu-MPu@18&zqp9W0k^N&QyGa+g&;^HO`ihcMAhO zmB_kAFiP<-V+qxU&L>#cH)=n$xAFl>%0E_2@X|72Raq_F)NOamx&2@Xk_|oRi`p+d zRuHzW)^ekOeWH+nmb+0@(|GslC%Z1BI$oWko%HM`8N}tT^^;~@t9MDNG=ug zDNVo`u8Y!LUr)U2JBMHB1r5{S-W(P)l zeV|B?&0N@+9AM}HM9DS++2q7jPED%SV*=}bt*1WdWb$m#jr>la8jR*5p|XzmwNWt! zGDWmk&&GX;e;j{i5u7w%?#NY_oo~?iCu7Rx*?%!JXq=QJY&cWlg2c9X%lFy$e?Xyk z3q9V&sqh8YxxB>Z9-cv10hxzScGX)M^$^@-yJ7Y=B>~qAmfzz2Xp?niKtrS&F~%%h$d?zy=U)ojrFGY0eeXtlZ*)u zAbUhsR48q~a9F4Lue}h!AhmT2EcXDI=f7&F%H!#}8#IZ)?Z4wR_Z{m;H6Pm1w-Krr z;XcxAvP>6r@;?M>j6t|mJf90AWeZSqpYl{=Us&F@(ZyhfGLf2_^H^7p-wO9R`SxB(g69Y}Q_W$5soNxDdY4@F3|WNo99C65McfPz5qTSR zF2cr&xC-hFv3E$DiT*T4LlYEh?tqiMdy{GwM*!2FdP)3a^5sj2eFnx^qj**hZ^m9m zBE#|H!uN?{e$rvRNjW=9hkOHjBq^7-0uA{qyaBlvr;n(sahKn+7x>DML5yW|!S6(? zY!$*$uoWE!$-s1usY@GMd-LbD^mKL#elkC5~?@O1QF48NB=|s$ArSqWalED zWBsrro2=UwF$I!$=5kNCNQ#8Dk3X4v?E|$4J!Ggl`hCp83ZFmlPz-xLdz$KhmPr%# zHoR@D*vl>GlzZ+2oXFb97{48rRNF|0*gO4eA6w)_n>ACDZsp`l4u;JgW~hF5fN5SV z`2XVNl4Y5Q9eF_G^H}gP7jnA-@f^wWu@qGLuEF(XWRjrHiIHh!;~g19GTT%?W`y}F zHj*-^i>E7vN`^VB=ngm%!w{rAVXYVFI!%cnsIKcB^G`ZR$#?{m?=f+AA{~^+yb0Mq zI76lj4R=%1Ex+|jDouat0_EJYnJ1N@k_WNtGHvfTWN|C$(mqbU|Bn6RsHDs$$8Oox zt>9k4zeetEnA@mE>skrNnim`GXtEogph@CKj46wv&udkfU6^fAq&sEFn7=4IZG6Wz zFiiBkRE|Z*qp;aCqFL8`n;tfKWfgH@8^7!$&ia->;W~lsLM9%>{-Niq5=nKqv>CSP zgT1TAt_3AFQ~b#?lg_a{|H}gknVoHr_4$-Nf5WoO>v>~SM`1}5W?QYvWFO)A6BJvL zAr3fO4-NRKIzjv1gr|fmC`{ymV{AX+hMzT&g8$s0ZF-Fhix8-HVgf1l}U%l^s3ut;wez1GVacsWAe0V_-XV)KyrVdV!H?mu( znDA~?Bp;p}X)HHr(!Y>$y|~#HkwTW%Uv{Scpkk#JEG70(bXb#L|0H)wi#~a7QSPI@ zAZ8IsbmXsxDZkfz>^BU^&=8}zzPmF=iD-Xkyl{rXtXj|(^Te`C(R9zbk=XprgN3?- zGF^N!pZE3GyI;vEwrP?-$aZq&g|#fiPlY#2$v5{!kQ$RB&#SDoKbWo#U>{mam5^;4 z`tir92w)1Q?W5rt@woDokeD~y>Z^BKb6t2J$H`=%2o1Y^Olx8%$%uDI2ma$CB%tqK zNOb|?w(8_Bh01liPKWM$@{q{vdP zD9pg+PhuY*yUna$@Cdh;5uLmk7Dg7mf-Vb67)>i-_Kq zwdtf_L-bIL;l+Js+hIomLP#WLHqvdDb9(}+W+jkb5w*Rlewr>&?olSuVxpl4+>^zw zQjDxGNRex{9M^ib^%JQnv%wBb|{P3(?mv^cr3r_4u(zY=dQ!p1l?_>Elo1JD# zRkg^(sNCooTt>>1XW>Bp(@^}|bYR+z|1}uFYs78A-dZuI-{`>ckA=sJGxE$LtMh`7 z-V?R=DvjbVYpm?}#6{s{DAHc(hT%-C&-5Iv9*AxRrYe@P0l^z&ZC4>z+=L1qQk&1h zLqhPxxDTCU1%+1Dq9)=v?gZhmjdB9=x|UVrI1u}Xn=krwTyN2}#>%NfTevEj^JX5l z_aRR)T@u!h8$A%dkDJ|)?!nd38IEg}IFoK+mDuO+ji$gzfj?@S)tr%z|a%q7TY?7k}N^-&DOI=)Q3Y0*9J zh~n47x2s67*Af&u4o&Vm!Xp{>@bmo2kkNs9G-s981zMc2w+KM!wq9>n1_L-Nv_ZtJ zl6;-jb`tk5`YLVy1}{|r=^ve{n9Izg@1AW%<3&HF|{6)gQ8OoXT=v(ijp+Ta zCX*~Fe$;#{ z6oXNaCdh0;h_+kMri@CA2Mq;1rM@6EC-IOWvUh_#9M{i`R-5$xDgR?!eS>{xo8Hlg zfl)}T8@nB4->N~7r0f(8YpUMXX@AU)BoZh*{`AN5LJoFf)4jWc4WWAxd!BK*p){F# z{7H;u?p_L8&03jrXR+?}dE)C#h`|N5? zhj@(ukYSO1O*qu&q5WZD|*J06) zs~mIf7$Swa!IK%L|6q(DJhzUX9IV1!revS&)2zRGXztz-yYqO^I{Dh>$Sy4T#ziAB zMe31`Jr+fzC7=ZZN2(v$IYWwW9ar3{i?x6X9cWw&DA&&LYyeB%R$Mz0k^=v17(UP$rAhTl#X=m8AmGqyy;ZTn8%EQbTMuL#?CjwSf8 zG4F6@Sc1p|f82y_tPzJzmu6bm-)v-Z0sgF%D`%HU=G&Rml;Tlec6mA*AL~uQQnk0` z37!EU7Ul^2{OQ_9dEehw8NeW|wada0uvyF+N{!E_cwS|478Ai;nof+j?Dw21eJjYA z=hW*mhPsg0=tB$3r906(dGFGVNMT^_(G2$g7_JL# z0L|RBi!wCIErB2H=Ordvy*0xZ60mVGY3Ik!9xF@Y{mV2d-RXWs;!*9XN*BwWc((u5L?x)GV{{d zBvLztW%@B#aUwrF0N)ZdqtuPA%krE9&{&TBA=^yB6M7~aucT6cUUb8k;-h9m{!ueQL#?$@ztgjB{Kzh_46a zs*^axrb5ra-QrAtg>ll`>LO3sAyG3Vw2;3EaY$|N92G_m*_PAaFAh)3&7ZJOjc=y_ zG?!z0$TpMtk+EvADL+>oY~44lX!cs?+8I+v=?fW7yG^{ZPR-lInD2YTw{?~qsJ zc3%D~N7aGTN^`Vt_?sNG$Dg$>qo00&SiPNA+r#63sk59hpUXLpexN={TdQ^n^^*%j z`=#b`!XC2BWSah!zJb|glYGGc<{bSTV{<0Cr~ZkIj>B_m^#HWZY|a+>1=^l4IC;UV zGUjXcJQbXCwsB5$(KeNFN1hISk|o#%>nzr?dpuM3$p}2K(o?qr)|U49L|(6&eJH`d z8I}NlL=pv{99I*%M|x;bS)H#0Ef^j8u9JQf`k3)DA@B_b?d?e>j65WM0LE2;wbkA4oue`~wLHkbfWnfd=3+a3BJ~<{v-=B8{|b z$L1drT6Ru5J{bpB!jJR=ld%I6e;|(9kIE0bXV9==!*Xm_qKIW007y(7y`94|ZRl8U zd)t+00T{zH0FW#JsA=5-nbs|aaI;R6(V8EE2aphYOlYMp+Ds^|bEUu%fPF?(lo!cs z*@G)44$W~4z}6!sl@DoYdFmEJC*Dy$Fv~hk{>VvFyxz$fbtjfB8Gpyvf0FFr^JK|} zly@6DsVjX1z$HcA{EV`)%mVL#I#)Vc0?<3M|Kv&X+A#0fQQip|4gr`s);oBJ@sKHV zd}+V&-Y%AD+E1(KKg2sA(_vycN%^1(Z+`HhY_E6FH1DvA@$?Y@mvr!UZR_>6?cpt` zbETCf082Bpe%`iPu6Ky0f0gLb7#@Iy-rkxvz>=EAR^YTU%QSt|!xQ8NVBLwcrcKP& zGTMfoC)?XkD<7i`nnE7|a7mW8U!m7qIABV4ohuoZ0PJjpSPyTvR;>!XJsbkCpSO)B z1G2Z)af+^;re)-JE3TMenWn$jqiLh3W`-sX@&s-K9?JF>YvV^~e**|W0Ir!hv|ste zej~;>T&Wv?gS@&DhX5Sr&DOLw-ho=1fx4Dji*oO@@l&k<*wI^-*VS8UnK-Dcx6rr} zc!&T5;JV>sM-ClcHes;CmAV1g$J;$$YU2=qrQRI1Lv7ip8|3Yit&On;pf+5l=Y%#+ z6L<7>Gp+<4A^-unf39TmaL;wPCU0biWReP_uwZj!n%b%tWX2<|6PyyIh(^`+3=AAZ3Pq{%;z0=xS zu5_H_oi?Ve<(XR!pXQy|cUm{gGZHI{-ch!RgNw)rJYNpK844if z44qQgE`Ojp3=9BirhSDviDm>FcmUE+X1lx&Ehz(&u>&s|KvVnw0mYJ9k=MqQAOHXW M07*qoM6N<$g7fvnp#T5? delta 19003 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 literal 17162 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 diff --git a/en/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png b/en/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png index 87b85b8cda8d3e84dece554562a0e630567f7909..4e2bdd2c31a06a71e3c6f5c5ea1a20a4653ba406 100644 GIT binary patch literal 38862 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 z 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 literal 38488 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 J);T3K0RRd?u1){| literal 18545 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

D67kl(}{U&E{u#MZ?9SGzXgJ!`sUoOkM{(J%M4 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 diff --git a/en/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png b/en/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png index 4650b97e2c152b81bb4e3d037ac6d9c035ae55ba..6dd2d12eba7717d91b7c60e77d29116821bce7ec 100644 GIT binary patch delta 22609 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 delta 22545 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 diff --git a/en/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png b/en/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png index 3cee7587e1c7bf8ee001849481cbb534a7a28697..a739d2e4b4417e41147f1fe10ea4a7a37c7f85ad 100644 GIT binary patch delta 23432 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 diff --git a/en/chapter_graph/graph_operations.assets/adjacency_list_step4_add_vertex.png b/en/chapter_graph/graph_operations.assets/adjacency_list_step4_add_vertex.png index 1eb24d22f5d61395c8a512ac14eeccf76d87bb27..8e6f63a2fc8ae9417762614833b0ead6255c1606 100644 GIT binary patch delta 24203 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 p;ml@DfrK~6p|e(l78Q8O7;_~PYM{|A63spS9w delta 24069 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 v*tdR`t)Zz^b15!lQA$qVE%!a5?mv delta 21755 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 diff --git a/en/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png b/en/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png index d2efe15b327d0fdd509d52637161a9c7403b06ae..6496a4531b827a64d9aef79ba3b32b893fd2538f 100644 GIT binary patch literal 20746 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 diff --git a/en/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png b/en/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png index 42cce3205c53bbd595e046b9622d12839d0235a5..b52f84e894632d2a6731ec98502a9965d09ac9fe 100644 GIT binary patch literal 21584 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 F{{vD0=;HtY literal 21737 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 AKmY&$ literal 21546 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 literal 28629 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 diff --git a/en/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_strategy.png b/en/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_strategy.png index 78a5ef555c524380f8aae55b74c59fc708004911..0412e0ce3056de0265af614fc99570d65cc052ad 100644 GIT binary patch literal 34652 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 rB78M3*w!~B3e{QGcb>N}gj#PnVbVFUNsdv@ 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 diff --git a/en/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png b/en/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png index bc03e9fff0caa7abbd5b9ebff5f7a3d1120f227a..b53735aa61b103e5dc24aac9407a33afa4e529e1 100644 GIT binary patch literal 21344 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 NuC9p=;kNUO{{k5ZGrRx* diff --git a/en/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png b/en/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png index 8b26aad2d15bfb71dd001d4df8517350f2916aa2..6b493620525ae94f08a3211053e0e6d3eeffce8a 100644 GIT binary patch literal 17782 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 literal 17780 zcmdVBcUV+SvoE@aoCE|3k_7}634(}Zl$=2%3xkp*=ghz$3L=t3K{85~oFxx}ucj{`!maHV=K#J3+tU5t3%7n9qTJI^T_%6`MJ5d+1c3{uuM-+%_7IAkz>>I)8PHo z^yK8^#Kgq-`1sh^*ueBm_heVw%=Ga1=IH3?$jHbrScbqdGB`NcH@w+2Iyx{g(BI$R z*Vot9yVBFs)7{6J+q_fdu!^qp^AE zH8nLQB_%mIIVmYAAt50?KK}dn?=dkk-@bkO8XX-K6%`p786F<~`Sa&bpFV|zgna(^ z(Wk7*t2j9zI|mjy>HqOpP*9NlhgshbnSp^H0|ElfvKzF2RKH0z*GLT3j(aKjEmJ)- zS2*h9-H>jofKIr-KMV%*_3`oc^6~_WhliV+o4b<})N{ne#YM}0$l2N1(b3V~-rmm6 z&eqn}#>U3V%F5Ex(!#>R%*@Qx)b!1pH?Lp6HZd`QLZQaS#%flBisl2)jQd3NdyR~Y z3=Itp3=H)2^aNk_@M&~&t99$>=xA$ezkK;pOG`^rQ&UY%O;uG@MMXtfSy@q0Q9(gL zUS3{KPEJ-l9ZH`kdP1;7Z(!~6BQLLzoSP10MB_9WuCqC zoYNJ&nJ#79}InfE3CiJdvW81>|1+ot~}Y{f(-m-)(7|AWxSXrmm!MUXT|xl>vM^z zJE^@J%}2SyED*P2seQ~YP-@xRGc${w4jX0gS8#v?4K0wEy%(gnA~Y(IBv{xJyC3`9 z$abQ(9*Yry<(Gubw^)R9_xM2OR@bd11V?=ZXp5gMjowk87g*RPqLc#8O38dR(${68 z+kAfT2-)F~!}b4eHuQ}?E8KjS!psT>J`?K(*DSf-lmfg$0W20cAO%3+02Tnj0k8-F z9CCnw1t6CK{vSQ4e;THwalw zMxt4@ugMTB1t9JKfUv{6yx;(Z6aZ2|2!M+YlE8(B;2^9O07wxX_$V(3BCmws;RQ*_H!S7|FBZHe9btxN^k;c(5u&egw0ZWGrp_@YQ( z=hy(XmiMo>cPOA5_j{Itt3TcU=+*~uS=nSq&Ew#i1>=L*(T6#^R0&t>=o7xemk`=H8VSWA=yt&Gmf(hzZQ^WFc=p{cY#;-pV`r_ zQy1?sWn4!ub6)Ai9pR-rREST0!Xo~E{^pGPFWW>rZ0Uv5QI{(*utW;9st1ix$IQLivZp_`iP^dh4 zhx(NUA$dw{G!p#GN7PJHGvLSG>V6-gNeEGD$R5pmBtZRv$l2u*2X#nh<)vT-hou=O zug~!m^{yh_o(9^I27d6C&*OV*jS?0kxiwaUz=a4bMlkxe{XJXM!rYWf&oD3xXTpm& zlg00S_kEFUJ@nCYKVE}<+)pooP%H@n(}*4~Xh9G2h;91am%KY`^Dm-ujO-?A`*ZvC z5)FG3;4nrLL}wy?0fH#1nsp~{a6hY{vdBf)elld?`CArZtisU8Nt9=Ad`AXc6dbG6Fa{mgT1S|wBQou71iwYpN{=pXr>PTU- z|7|$_x9T`oOaPD_1mr*f9|onw1Oy#$1vcQS>wiP?y&uHw9LD|+q)VT@qQ8~`wq9G# zYm#rdu63yGKLXe$kkVdQy^&rF${8XLPhSb_&4tM;N6)OM%seW9k?EOcRF(qT#$=6~ z=Q~uZCOx)rtm{-7k-&@^?QveBk!Vdx){ni|&&DOb$EZ87 zP#4$BNU3zI_)oL5;ko{obQ@#!-+Nb1E=na1@rh_gMtB~QoQ8d#-66}aYlF{@9nv$L zqjCRQFN6|zeV%1ro9{VeNZ{@N5lcmHWe>5JeB8RYj?Qe`AU*2Mm8KxT34|ExfPfTy z_<-;6rHO(d`>n1^SC1CHmp?h`+0EXfaAiY>5_dGoyQw|u zvZ7zQUq5>YmurEVq{!bRpiS_LmKK8J%C#_)P;uh(wStN&&Red>&68$qr|p=pp4ip` z)yO&=`P1ZZ7*)?ehc{(32anqmot*j5C^gbzs4GG{a zZ^I?id0Pl_W>+~*vD^V{2?tVVPKmc~N6cV7G%?1;uc>DtT#pAzO=p#SPRkP2HunNF z6hnr?HSXC&uY?(gSy(t7;~|aaq|^!?T5!&65}UjA;7=Hty-~u-i&!%&Y@-oBV)a%z z&N|rDpzCxRp?G`j{Hke`f}Yew&4?h$81oXM&)nZm9g3t~<(}Z!*NDAPRRe0|0coA; z=XsH9W`?p$uBC00R(Z-vsDwnoJpwRTH|3;Fdbr!RdTy}hX7$iJ34Qe-6bRxcU=eLx z^R3J6tXXn!#v0?s(t8f{GrFGt^X0AiyI~R|Z9-7(oFY0 zG+Vx6gF`ONgxIM+98m7PDTOumjWh{JqCyxFf>k`L^j(^td;nNmvEQPRRkLU=kkxH& zp$O*kn^H@zz=hx7NH9Qw=)yW(&jR@{BUX(|(BU9O<%EHW9eyRR;D)pG7Vwt`#|)9F z$J03D0D0h$Uq1kMrK@+j9y3UI2i64%&#p-9@HHL?$~#43b^wAL%;LRnbVen0^89W7 z)eFVpXkf$tGTtb~*R@wMnX3jzE^~#=sc{=NXMb>`V+={d&Yv5iyF3Mde11;4^F1Z!Ne_@Q^_` z1gZ1F>OlX854}oZt3+5&-|DRwJwwZ#*gSejN_J)aLi>w;y%|`GUzSGciX;y;{X+CD z3#N6RoBPxz2_W@_Yuu0F$w4hpe((1E@q^&Q?vB$JJj`ek9-+Y4(UBgDZaD+vZ_x1D#!1sMqC3TB;ftUuam(DYZs>>rv$8<>(s^q~=5&v??b&uS4Q>4CJ66F}n&Y;fu}*=gFfT2>!ir-xX58lGBa!>` zV!BL-qL{}dct;bIB*u+=dUJSup5}{IHgAQ}*}op`xp(l1?14(+;XQ+Ntn3xvCoQqg zXK!u3e;DPumk2c!<&^@Qyxg3BwyhqB-=TrkhvO7=t4jG(;}9opkvH57c=yJK?ZI5{ zv*HjT{-d6X$~xTdABxS(aKDFzj6yztul59{+wUnBWlKYB15Y~6P0lnuxZs8wY3aj+^me7As*;A+!4UgK=7z6-P<=SQjV!cdeB!gVaH6<~Z?3AE%jW`P&m+N+L=c2xiwt$l13{2{O0pV`zQgtR-h>mbtyll0>w6en2D0Gyi zgTt50>aN?ZI3Gwtb0>?_w#zY!K$LWzO3almn0#gbN7Pu${XHRzvnbq-w;jZ1Mcq{1 zP-wSOD8O2YJ$C#>1t2t;?Cf@|8zbR_w;cf$Ro5JQoDaHe3dK!9LG}juTo1ys>TIX5 z?syjDCJDFWzUEds_0?`tM-GU(fY{n7a)2^Yw`?)a4{|@j9vivl?$g2M>zktJpW4>fLpZ!@a+o;bppk;_#X(u?|?GeCSy1CD08zU3br;))M;f@h!qbDvc&}6@`l#iSxl&6X!;ITCRbLvQP9iXk;orjr6%2E zqqdqDZobD`;O30P6}1f5*+%S4V5o@a$OezbXt&j1WEVaWS}S51m*g4ka!F&zfMI$- zfcLKPAx2k21AO87!Wn;z3*!XNAub61+IPUEyk>;PvwL5cF+{{Z582^ur|fN^xABWW ze+9usXyWubJ5|aK&*G$k93oSFdC7d)SQzY0zuN$!X)FhV)Fj`<#~Q!nZR6n^IK;>l zV%R{O9$?e%U)1Wa9=K58tPi9FTokmrc*yg-2Qj=$g#C8mxpV=x%(aeg8)guie0V0!}gj>}*gYwziZU7la0<0L{Wy4w2ML74{e^&JV z^|JlXAOqI`%kw{;oqAFIONw|VqK5cb@a2ULGkP5Ex&)j*3*an zS?57~4R^0hWZC1o>erPDuz$p0zf-45FCVW{W&~7U;L1VO+BtkqEyq=_C&sv#=aruI z>=;k*KS);(HgBcE*=-#)f=v%^_>Y?VoYqam`wKiW_R!PPvazU6n)gsutrXAGrgX4J z&F1DCSzFhm7WP^z#p=yF7cu?0V}?t6x4b?LVM?AHQd3Hq-D53TQ^Gps)x~t)7!9l6 z4zeY)9PN3+Z|w2g*L|yjmchT%ES@XY4f=|Ry()8a@i-BiCH}3XNTz1 zS7Oyq#h&I$gDQ({KH9m@0~dmd$_dNPC>NaV9KZT3pRJjgIvsANpL%L+kj637ck2J6 z0&^%g=YQ+?kcQ?$33d4fdK`3_{DGK|g?`_$yXi5U^18e&}nH*5d8B zG?uLZJ@^Gemi>;DyB1vky7jqUW4I|?MeNExq*MnH(bh}}dj9--S1|Zb@|BqdK79sQ z5&Um_faqX>gSw9b3?k4y2b&VG+yD(G(2fhba=x$>q(KDWK+^AAqjrEC#LBq%Um(q48n)qX`$Lht&=U`b%@Xveok!m+s{Hsb*SYcPZ91!P;_0jin z|Gp;&r4&apzzV%7#c`=jlqz(gTpA1fjK)4)q%WwSuim^|uBI;$NBM2-@5Ip-ioU9^ z9qDovZHix>Z2*_u#$xn)Jg>K&mcZnYuYS4paEx|@1V*8GW$O}$5X)!yjCLP0_3(C&qx;H;3~tpDEWq6j?q zGOaAD&;g99L!F$S1f!qhkR!25iKmu50(@@aklb4yLl4yjBGNOH_bB`FGa6*$v$P z4uOAE*sbnY7hTd|7z`Y0o1|%YXvK{B^+Jnj4d1ied{WC*67ml?ED{p)c0Ft9GjhKC zL&!M%B9Zc(d)jQjC~0?9M1wgRI2sp z!Tl#`+42FiofBc5ba(i>>-P$V%oz|SnpQjYQo-*#y^rq^&{3rNE6A^vq2$QqKjpO@ zRvG(e|Bl6VRVe)OCv|pJ@Pixux*pel(Wt<#`U~ccr|^2IXW8Uyks8ks@|nALxxCev zLMd6pLizm*MmG=60>bx-g{=MteXG1s4U?#SJAIyk9oB=+30=8OcTgl-5S5vU##GxkK44=@F22X{ zhlnU`+pqn2N>@eDdW9>jke=@3dfN((D)!M8S}PWkSQHRCkr!;ol}?*sDY#+LGHclx zl_oFA&%Yr}G1yE;6m1V{KT3@1Cwt}bocnJOmY%yoyzz9AVS0URNWbI*=LI2pNlLG- zv8fYga#P5Z{S!E`goyXhOTdG{ImEZ?0a4)Pw(M~I#m+D$evFtYXQV;71?#sqk4|nQ zf7B6Pi?Orj%=-Ku&PfNZ>BU$?NENXCZGzPh(L9DRTHOicw)xDHG~%V-A_6kfKj~dO zixFt6ezZS6;pd}*yZhC)B-lS@8m~pd$gG5^hx)el+ifz?;cUS=jYD-zIUhtY|H^N` z$2c@8uSPqUz};@)!A7SKefqm39MzM^wIF5SPQ0;=WaQV(qT(Vta;$Ar5fGTYs6hG; z=mGR*IaSLR-zF{--gwVH1Vj2IpZ=u#Xaf!Fd%oJZyRuq^uWgC>Hj0pZPmeie9&~^9 zihE3IX!8L6m(?YcJCs%=IR6PCG+SYD@QaYczaXOR!wVhF@2(9*bGp+4ja77rk8P}` zY-AF?{V$E1EHhe6AHt=lv{-6<62`D~=;88*nuxT7?kzn0aAj_rd!O-l6HXewc0x!} zz6J*Iyu2^sTdRLJy{&5u`c3+o3nVdf;iPhLBc&mzL~=hNqUF2jjS?9%f~$raQ0#*@ zJ$OaC@K?0Q>zcG)6qG~=Gs9T`qcfrju&vhF=k?}qy&A{T7X)Q*$&cwC#q4}6(C zEJqBFVQV;!Se^}-s#iBmOtL-}s}p<5hsV_%eL)I2-Bu}#KF0NK!JC0bKmK?m(HXA>^}VlLX4&K=+O?-XOgZn3uwr7dwM{`3WXG7vaJSKj3Y5H@%3s85QFF zRL#u(xOJP`H7~m5&vVM1d8)IYS#&tz?S9y%{)=nZ!Rg%-)I(7;5|fqVy?Z{rK{Qg1C+F?%f{%7k7!aW)#(w-Q(ThcfPllIfmHg}AMhYJ_z(yw{Is&J=Hj7V(OdoIYH8T6EUoV-tyk0@yG`LyRE z_$$SI*GqC|EJ1mB)LEj2%Qrrnec!Cp;hQ~Wl$?!Jx9KwXw&GrXc7(Z45U(^4H3(rS z)QP4lE*$w)7*u|;>+L0!v|J|kDmf6Ma?tH&0Zc0r1q+bQDMe+9Pad%hoF^-wEJ5>m z2QtNcv9Y_1^;^9nqcpMpu8%Vx+^W8+ha^=%Q9#zhf)3%4{tUy;)=kq|J{9FwzkKZf-hYpf(#*`CpoqijX6`$F0bMNorioA|3d*dw0$z`gfgZuuE!(X`v$@Gs{&(2#C&-JA}}-&m;%GT+>k zr4t&rIf$I5ks+18oZ5X~Q=8(Tp>F?{HV<2`u26G{(())NQ{MZH`6h6Qg1K#`byw@< zhBFBBzaG8XN58*`bv%&YNY>tA7XHaR=3iR9I4DG&ogk?haS`G@p}Gf16x55AWHb!F z`5aSj5=+;fRg=jso{ymxED&N+Co#zt5}NaEN;?l{ym4H=HxcAwEq7zu=|#HN&dW|e zB&AQhtfa+X!YCI*p$ek8THT>E_2ID)1;3RNJLt!uLU*Q$1(P&Cz2D0&hwS3hee456 zMe9jHl#Y7Xk#+=kjz$7y6Il0!KmZC%fPS_`e53Ep$zn>}S>pZI3|j!Ba_WJ3 z-;{HcfN)7R=e;imEAj>-FQW9_antLEre!pU%f_B$^U5U^IXnp!TgKb{;$r!YDAo7% ztXP&1q$QhEki*si+{NcKTjd{U<__(CL=WE_uCQ@u4D%M7&(&7jE2Ce8xcWMphCVW| znc|g5`m$Sgxzn1wcd*2WXcjt2u45iQsZH#se_wNSJ7oQVTG&Q+GQFv!juzw>Qc&blIG<>M`GIX&BK2mNQW2j<0-y>Y}}I zuf^H<_i5arKy<6ebEbS7#`0?2xGYWtaoGy>0VW83G=k@@&yv)lM*) zlrJmA$BN-ei^`UaUb`TB#LOo$VQip*?hru9MZ&$)TIGa7-H#aTzAqJN3=5+oI<5T^+V zuX{h{_pJ1|M&;<7MmKF9nUb|Xx+rGeY~3JTTl?BD%nGMZw|YOLE|$Nd*=bq7!8EN^ zt`9ry)99QT@q2nEtOzMP?r7&nH&s0r^Oh-Y7an}n$)mMTVt*TPO2&F0o?)4EL;Q%z z!3oL}7`r}-v@I*3jLU>Bz0O^}7d;a{u`(EZC#9b<@-Vwu^x7X%=IR-*5hzrEow2zC z&{z+oD8A4}_Vm2PuEujVWLTi6?22Bf%*r^Ky&4t5W&1CKwQu1k7h9_o1_h!yL3!ke zJ~47-{S|i+(xLwKbh=H3`s*>skcW77{kfF?!Kyo+VN&;WUQp%Th+>Rg<+Qu%y5RZS z*{@@R_AXd9J6x4SCaCUjNiQ6JAst?1`Qr~Mz)-j;-%9sd4e+OLkLvh-Z`(PY??<#NnIAkGdswbl~3%s|f|AYR-J< zeb{Iv{`QoYJW}?HeB9~Cki$gQu!Qs(9Fox;9QtHd*XyEa*^RfKcPooCqW^qC-5qAKBU=MO13Nplvd}cvGL~5-zHl}4DgEv6r~Q~CZ8;SF&YaBDS2d9 zIUk=sG74E*WykHC_~EX`{4Mj@o;Y&l6xW;E!Z98)Me9FuzSfz6;ZJze&_&@lp_r!P zYqOz?aEFzgyfON{Ow2j;4D|USWgg9>otrU~Qk%YqbR|v4a=lNZCN~qse~yId-JTZv ztparNwDo)lSLooD%JRyu0EAkxvdPx#iaYy_0UGuQP2EGZAn_BAx5SPbrCs72q51Ml zi<23ec0az>adA?A+k_Ie8^Y>*Enzb-30S2*hu5w`NjDt1rzes2`gyjn((Izf|E zD(`Mcm|%f^V{ZK@aF7I4IHA*)vJnuAUH;AVoIGtHS}yKzMR9kP_Mci{;N!QXu%luu^N0Uz=6GNL;-2u#T6 znW0PGVcJ*e8S~jDvAKB5nhoxjscl-Le}Ta4MQzA8G{4ZMVvv7<8E)|TY&&VXyN4ng|J zK_?8TZ+(X}wp!>q~u_qyw3H(0zOtfz8aVEJ2J4fIT0P z7_NCB3_sSN!_T*QG6@+knoUrB?-ae5+(!7xQfT_tZ)H=hB;1(?G>7sc9b}!8`N>u( z)N!_CWSy@&Z=V!?Nm*1IP`N03Z;mlZ|G|1$^@W2o#$(J}DY-HBM(Tk8-7xalwteZ8 z^Vxu3oMC)YU<%ph?7My%MLP2V!(0#R(;|t8#D6JLarn6iP7PEI$n8-=ljNS5cJF7x zbP9gyPh|+ovTevDGwKzes=NV&I?gmRxJPQDZoH5zEc0#QERHa&f(*SDJ^xXExD#k& zfa9o*G3|Ia5Jl)mbKbVaz&j`;G(El59sJhFtk~ z)D@+X53)#%Gu7gCV}oN8BNqu%P-+a|d}xJsRKM0as$p%4X8z`S4Qt0lg~2{OAb*)g zwkI1y`a1zq^H%~AS#pzYb2|5w66>iUZ1^#US6!*jlMr7g<8;3_q3Z8!?e`QTJ%MOR z!Z*-zOaBSe=N-U=L~YJrT26+L>BV60;6 zLL?=;50V#dUwB{r6-9qa;~10uk&57;T2%^8+z2f?{ckdLuTyAxg(R=7heYxnWePuU zHg%a*bTqf+t~vJF<>v>II=sFENs()o0fT;VcT#d-*yX8-^=xcEj9$()SZy>Dy5W3lbGS5Z??q~Ow*I-%^!@WXfs+d>1O zjaXwP0+Ta)pFpd+x=Naw0>=pmx;<-DzWn^*uDaWJxNTLt644y}v1LHSTJK>s8M0K) zVG&leEVuf2TYbSn+P_L_=WN?qf+3Ml&gRq11q}1-0%3x(LRYSZno+a6KORodGL-b$ z62&a}y>~!x9C6TXBy#yow{ARG>#f@IR1sqFc1pC{<~*nTuxTK!Wwxkxw7gDtq3N*! zFeJMm>g7cCK)X!;pn-f56E#1@WY2rR&5fb7qi&Y`8* z2cc|IA^%#D`DK33xKAR(8!kRAdV4gAOjj~8RS@d2ue;3sFGS!Lsm|v_KNx`7Hmo=0 z^?z|3n<|m(qK&ssr<{D+Hf`Bqcb_+4OLE?ZlH;qrdv12aql}~m6aT@l68Bp@O*=S^ z1eP;B|#Wkvjn z^gvu=PP3m}Q)b1frsW}jrHbk!Q3|;@)JRY_txo)gW;^KD`L;t;CW{!Qrz5&mJ1*NQ z8T8#2RdWwlN6rm}f1d2=94VY-9VM?Je(!wrL$>6pdEdTdVyS)xoOFbIi_WyO9^vFJ z-D(^QsOGL3khF1bvixR&_0)OXvZQe6lzuHe_6~fF8p7Z)CS2n0`|`LI2KowZE4j{~ zdLA=;$Od7^ve^GnyyBmnbO43|rrF>+%jeTsJ+&9EP|C&2iC^5z3|^)Oz4_ZKry=tE zFs1UxJH}>y9U|-IU?Pno(69Ia-#rWLgatfp!1=F2igSV@iK8-<-rMPI7a=ynfJ+uAl%#pK2wM*_{@8<$Z~XJhl=bywNK>uG|GTwQH0{=6d%;ao0j(`4;IxN>)Cl3`{2>6fj){&okALUzK| zlg`l>VIsm)LeuS@hR4l*s<71$lK1X2>m0%BH_3RXh67?1sEyCP7i;>(*Bd56+lvVx zGD2WahODbI<9<@>RQmYKyU!5p6Outlg3bF|3n$dNsmymnE! zHz(o1;I>uWa@GTHXb*av_2$Fl&!6oVr!9qe%mHQSY2c>l?FN|vPYVa}v`?#ej#FMv zk3Vz5*CZgXIQPRP-ZNL-3obMX+_dxJ3hne7r}dHl-HFpj2kl=mBJ1=zxz&aifk|G( z_0087cn$>lDUf9pU_usP4Aee=KO{+=bIO(=<3okHV9K8hgn}b#BNI5 z(fW`6Y(sN+r+8L}N1Zu3mkw1B2HJsh5kn*M-6>4s)#GTLW!y7u1Ilt4GuOvz)&3{t zPJPd^3OjC-wC~>iLi$wc1rQO!@KUlSkhS%Cps|XFBr6J0mJc`Mf=rKf3x$v`Rc)VM z?kb)c+GckYU6xG{PUMq)%(r>^@+#aC9j9~Z8#p6mP0K*PRjaG^De>2Oz606x4|}1V zq+bpxHhL9X#8KzN+iKH|a_Az*&ehth{QT`8j z3)f9|pqFdr7rENdQD}}~!zi=?71}jY{3$5Na<~9G?GT@FcE8SLHZ{p*C*N*N!YjhN zw3SBQU-DyDsJ%Csp8^|G#oeuXB3D1xh)=UNA8gJ1^t?_|j-FETW9+WO6jzC)6ZURF z#SDVDCv#SO4>os;H%blYwM)2gdI+bHsrc2XbL7GSUwZ<{qYBw(%zq`W3+;CrxO`J6 zk$F-^6q~&(8+>kWrDG%_s5U$9J2E5lRF|rL$@XEh&iME*n+^Z{%xZBX^L$NlbmB~Y zxqP}^Nn*L8tH`E-#Hwkzc6p> z=IF23H57AlgWQ94STeT7aKz72WXh+qBj>pF5TvM{LcM6)X*|LRHQ&a*+v|l_l zMw1gVP7LV{Y$N>({GW|qD(=k893ZeyxK)a8>TMt|Vm1_JCP$QibF{8X=Qc5;V}6~u z@lhkxhYG9ta}Rl0gRfT~bI;Q7)j$jbg1DC_k%`_QSN6#vm(N-)s=xkVA+3oc_hY_8 z74a*W9H}~2Qk9ljhWS=hO9qv;`p4Qg_!=86M@GI%@vRe_!tUX`Np4bRwxO%OwmUi^ z*YSveL@*xF8Pd=(^QV+8`^f?I8n2&&uA|ap_;C{NiIvTX+ITW6+->Vv+w@c{d3O`INubs#61t6p_NKhx>WnkCyK~gvm z+lujvDd^j~MQrC}=S%p$%|3sVBYxZrdR-c-9g5{-sIRZA-R^eq9#+hb<}G%W#w#nlJqRUeVfqR9H9aXeJ@4)H!27Dp5I&!bwwW6E4p|yYI(jSUbBNQhb+eCjKr0?~&y%1}eNm*2o@6 zFb6?7;2HgT_FQc6H93gbm@$wf4eg)zJb}+Av4*~xo#NanBbl4rZt3huax2~uw{ftR z6Iz^6eR_|oLg>Ml%Frf!&cJ%M=DXP#quT zhg&YKztZ$92&!7N%NZE9$UV3@skLwWC%VB6gYGr5pxn*uPVj*Jat~O8VO6No5+yN=%1WHT?D~a>+I^^o7($Iki35jGfz(w zsUffOo&+Da+2?L?BgRPg4jR6fu!M1gzoo!wXNMEkAfP*wm15rFbJ|I$18PSv)WZv-ZEe0LN}+uNV>}n#g$({1IhB(Gl7uB1$nl@Na$l=JbL=kML+Nng z(>iO!dRT4Hj2+(Yov2gh`)@hn!Bcsk<0L!dcZ@k>84$32PMF`AMDzv@-<~j-Snj7( zA*A$4Ql4BK?=)>S1ydK@BoX5V10%2LB6v^N^1pKy@WJ<@S#)I!F*clVX5Yj9l^6&~ z^U=r-tD=2g&T!gI(@wln5nNr^SnWWZdOI*h@u$kzjvlF><0`-7{~mEyix-C zjj-OBXzbSx)B%RB z+ym;x{#F|^Q=@VkP2q&GjcdJ#9H!~Po)3LB;Y{NEe@imix3SbI<5CV&9~mBZsYoSd^fUk4NMu&}Yv)kF{_8>78)lK349yvOyD-fN;~%{Y{#VYg zvD1UCO<+{lAUZ)vnOW5SSpO=ifF|2T|jN-}*l?x&S4OHbR;eMNCN|++uSv+_e z=U1(qf+Jl0;Jl7%;AK?L`{7n~%4zeIRR!4X&)QTq2lXn@pGnayDcLEF?Um|8G|$rv zar+FsG?%_yinTzIZcFO@WY5!yOqN?WiaC?WoZ0amE6y#nY|Z@_zI?p=-gaD6KO|zE z$tYzdvFt}-W{`&7Qa-l1E8a?&dKBLFVXG%g3W+WpiTx_0ezCEj>M86_v2>QM{_bH> z0XzI+v9-Mg3>>VT%Fh>g^PG>G{G^9(QbgPyYoDP2kA;iL-m&{N=NnB@GOb=d`Yu@; zY27R6zAD5I3vtKNLw^vZ?AaSN=}W?TtLn3wXi%V@=Pscm_zKe)aX^pBRu{>u^e|kM z?j&;1II_OQLWmK5xaBP-MB6ei( z5#HZK>|?=!kX|PY0^wUeu;s|hs)CNSF7S}twsBZg?avB;Uglq_FN%bj;`a;DnTggDk+&cA7usK_;5`DJY$di$ zFxY>0c#xvtU3Q{GbzMU$zpeE~UCvE`APzS(Z`(z7F{>Ac0=ehx3ZSDomKM}Q`}JHn z+;5O0C@Gh!vO-u~NTo``y$17@usEV_eDZ^k%DRJhlCNG*D~90xFlNMmE83Iq&~{Tl z?rGHV_WJmtySj43T_dN1u$`CX=rIRhOHV6&;{|?7zBemvyk|Q>rAkdwfT;Q>vct^z z@Kbw>bN)J@I?bCoI?Rr0(eYQP$CnQg?S+HB8C1>%zu2_CH!8cj!VYcO~>Mtk(2*YGBPh_Wja)3_XTeQYTrS0 z-N;S_7Uv{#>FTY+aj+m$w;sDTprn@(6{6vxx50()ex~?pYCfX1hcT+ZsnEz4b+@{N zJohpG%_1Q5$}j!r3>}LAJWfx$F zr=hRq;pyI@w4%^NRF5fmcHdWzh%LK33_r9PFLN4X6OXnpqd`1o!X_ec?Pi=CfgE}k zggx1sc)SpEO6x#YV2<>CMM6-4c|j|dra|_};b@#xL!#TCWmY^5CG}L>w@S0f$eLRgbt(A|Ce}Sj*p0`> z@s^&lIG>-U#Gz+96skP-&7e>De+`Gt5JEnyFbc1dy4m=eoe#Bo$=LYuc)8OK)|Od+|+zbIZ5+YgD)O z7(#B5g}*nPzNbPkM_XtqlRl5va1GR7*WzyTyu!NfjFVqqqR8*oSe(4KPFbVL#@e&(cIbR?PFa8OY*&&koC041v z|CtrePQKLpU4K!oD^c*xK-n!J1AIr<<|ksZK&$-FOKMsBy<5|7xOQaS}Z$TI+3D+4n-iKB9NBw~GmNkR9D!;sY?kOG3%|zKG(f5PDyaE=3dgBCKn~_!8 z_w7B!{#L4UDUg_q&0M(ESl*q^9!PN1jylaT?Hy7GXcaZJ_+v`661G0xlz=ihx%)gS zr>FF%2l%V-7Ht{Uc}SGP&Ml!s{m?cF#1|uxr6t(Ls8W%Uc=1C>b`azs6is@=x%Lj+; zBvgnZQj_A=LDP-ew%UI8Wx3w4E-tm-{TJbFwN`%#O?kdQ<>j{-tF@tI($W#P+IUr0 zO7CBELBWLiEy@x%5!>ar77hRNKCH&FhH1 h-}pbx-AUTQ;7fjbso~Ay;d9kiQC3Z+;JL}W{|kB;X?Xwu diff --git a/en/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png b/en/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png index 56d4f203807ecb679f9ea0b177dab3159be563a5..ed2688703c39d4a8d2f669e5153bba65db63d3ee 100644 GIT binary patch literal 17507 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 G@BRmDq`H;> literal 17468 zcmbum1z1$y*Dro%Xe0zwNpsJER+Fq()HzDG})ulF$Q1bLgRl zntQbI)_;Ip>*KYwvaT{(RP2d!0Q2uN7p7326uc03eoqA*loaIN&X` z4<8G>9H+7w0{|BA`jv_l27|e{xHvxt&+{|zJi9nMJ3Bo+MW39XoSdN1=;Pz#12p>R z=;-k9@ZjJ8b#S)7zrTw*MWIl8dwaXPyE{8O+qqg(&_aCm*)8D$&g z6*cAMuvLlk3fByWLoSdAL zl$4m5n2?YV7Z(>B8yg)R9TgQ785tQ75%D8DJnTox_wV1oeft(192^)J7!VK;BGs=H}+&;^OG&=<@FJu(!9j zv$M0cwY9Oav9hwVu&^*QGc&gTX>4q)Vmrj;+Dk>@>A|fm-EF>gEH&lHc0K|`EC7-Fd zO>9nIb5e0mTs_TFUP*h9dCl1YdfGzk=qE>d--*HKDqzdw{`G%`-`*m{c@`FR9lw41;wUvS zQ~b>kL-^29@h4r`tV4u#5&Y~ZHKp^Cp#OsdcIywaliQZ5cg2VnVjg3wB}R*b-N)qT zBdt_p%>uB6gxxE<0gG&jvIbCNYQU2cpWE12ZL`1=Z0x?GMKW<9rlW$`nhn6d4&XBa z*Tn%w7$6QnU;tFyk+(@ zQJ6g1z754{s{k$*>WHgd?Z%Em!QWeOI18+jidexRG1dWsmrQ{u$D35*xVQyPL*V*uklQwL{;0Z*R5aD-fLfX_xvEpF7$gdoIYl)xIxr3E#9LKgk* zfW!PBY&YN9`@XGDuYC<1slL_`XkUsOI6hxs`=sJ6bL98{$w#}M&PZq<6kP!&VsyN= zTD=xiFU-&=_8%dVQpx<-$HSd^5+c65_DqH9#Dq6OPoCLhXaux9USeV$ zHjZd}{uCG1wO8hu^!ou~+k}l4OWbsvU0-{!xadPLgt0j1$9vSCOu3-@{Zi`Vb9VTN zZs)#?SjYJr+pW-&?j#Gj1ZX>fPMA?+O=H&5^JibVSLe3K+St0~F+&TRY^AfH=oYAHc(Z zCrM*aanWs1i_2B*9xQ$kH@Q(OZ01BKcf{ZE;VTdVJzVysZNbHSl38&hWSkJ}Wc{u6 z?e5cLb>7mWOFFnp7)U0s<=y~sPzdtvKM(-q+3$oH8+&wVQ){OK8$1)I4`lTe4uV@L zV%-W$WJ&~D`MYv0(dE%$Z=&)WEiSXeGw%f6F8H`&x|;kjKW6W~a{AMm%>}ch7Mq8Z zYjNx1-Qmb~RgC+9NVg?2KO?!Lx%5G~grz5LF*ap=br>82Ai?(G5p|Tgs zGO_D8@7!At+w3H!gRY>9YW*jL1wdCWFg~#?TAXDm?Kr)zsYy@hzbJD5$y^UK+U6yS zhrIr2u2UD>UC~i18z}4P=l0<}(o|J#P!s5OI=wDF72>Oua8gRB7sK;Vbzr_+ne3)AO|-4ORFI|-5Q8fh_@3 z6?vKhUYgx5)y3*}EvgrFTn4qXS0@c>JSF(11efm=q!BM1YCyUS89ztnSLmrdZPtya z{b^U{+y$&pa3NV5q&XEP2xRXJO}F~$n%{y);k#Oz#Lz@(y#C1LQkK0nMx`*c7IV=8JBkq#Y8i%3J4 zcO+y(qmfo=ldW=)Flzvr%RRkiwHK#?wOR^a8xZae!S0*rt&NQw6i#;mP(xq(xqJ>n zL#f5#`7ySx9O~WQ;y*L#=HShA#NHtNAVPnd(U|zlCN^S|lmWWpHYkQ!7CBhf@T<3M zG>`Fdu|i(wudcK{ik~XO!TB5sJxESwobiubK^11-4I^V3?8-d)@>p*7k^cjFJARmV zerxb?ZYngx>Jrz>Hk@@irbW|}i>=)AZ^ZA-3o-k}2i`G}x9Xlkw0XhwLdCdwx3+6Waq1K2`*=2dw;lMN@jr%+J;sW5!tmou->o9rd)lrW50KY8 z;eNZr7(0BaHOsa{CJw?fIupWUi#5ad-$3>Xp&(lfiiu`F_KJFZ06v24ydpBVP)}Fz zk_IV2U?7dV!wtm;CAkl-A2U3)^^Cs~3L;{pe0HfSja#sw9vO^%9VCRQ9-yenk9Q^Q zi2dRp{k|qugDZ*B zi{DGd=(Jw)PFoxhEB3zihvg!P@kNK$yPW$l>;f=(>(Kvm*8uAO#RX*O*hi>aKH;o- z65BB?)c@D*?~mZka-i+ks2~^e+X(d83(tEgI zA~t5KYCV?7cYNoY{h8tY?XNM-3IvSb2S+Qhi{KJpx$*bykMI{Gm(x5ZGRMUJ74J`- zM>u^Pt9~iEjoDckFFlBEO)`Ox%ax{Nj@vJwe8snk+45Mf7&}b7LOc zAt|%7^sJY3+h!gsJOeCVJ{r8D^SNgQQ3`2Qfj}3#LB73^ZA4(tz>6-CZlKx z4H7v(SECO1%(_#zQPO*q_sYxNa;cj*)#O6pqVf?e*Rd$>;_zV!Hk4~nny_svM7l(f zSw@*Sc{=-b`2epxRegzqV-6BuKu-jj@4k-BDbsm2Toy`fK#?doeXZ#g0i*38P38B! zJNA)m-Gdntv$yj>mx7b=<+!-GXg>!&k~u1XeYhUuQ|5&qziD$aDKXqbeGrx^lwq0&~ znqB+vw9>b>c8j9o`P#kEE(rs>;+odi+a1*+qNk$urUfQX-e^N}4=F2PQxuKtffoP#j5Kdwvo{N+uBM?b86K!FGhv!0m^)EgiEp2ys{8V?3`%8U7$XTlwt;;r| zV4L9*HinXh;a8F4)g9Oe-P0es5U9Ut5XjgesQF_)tcv*T`b(BzVQIX@E%Pz+NMm zK!K#V2fOkiRYw7MkTD*$zwZF}6jlpF$1#x}r1kz1YiWs*4ZcBSq4Hf%yLmu3#ho zF2euIK@?0M{kg_*Cia)6$(V&=<#YuRSx^)riK}J*^|AqfA`#%?pS#lC8=wu?*JIW` zEC1C=!{m{`^lN>AivxWm+Ihw+cST*Li_fRDZd;VNv!ZwM#1)=Bz-_k)pF*7asH-|- zylmwsMa@RGz4=(v-EHIG&INXNE3sySL#Lks7~6)KO6Ri^^vBj^c=0S9Dhji5%{$NV zLhJ}$HLJ>o8o?k}5Usarv<{-voYg12N3yTcqt0u_Z73b5`2?pnrYi0a*X3_j`vO(l z9(yaATHfcKMkv;c1v-@aDQ4RTL&^sCK3dP7Sk65k&CXY|h{wP$wuVisbT3>V!oU%sxkrDM-^F=Ds_F*w@WjIg@LUtkrL@bi~Auf6g!0NbhP4oxFzaNaU;3vNQ1 za`9kfEWr?PAtF*!C;V3>7i90;XCad0&fI`jB$)D>bCy$9ZsVC#GBVJwxhmk-Mx zTzw61jXe~4b`=o*LDsM7-YcL1S95gr<$ukxz<&NWK=>aD|I^X`CKz2sIIwr@%f7!| z;`b8fVEp?p5$PKMWp^F#w2D$}XSx(+TG$tRoMzN`WqKQ@P0!a2-QsM8IvX&+fG{*g z=e9ZV#yl?ie%Yjdm%|Iu(li+p=D#@n?Wq~VJI&$uSGi011EmS=-(NDepH*`4mqsZh z2=dPE;psr&te3$h3VqWNO!=b4($9TsCy%@fytYdeS))`eVzzZ-)Yviy_%Q(ysua9= z82BN5w#`*0AHmEKpc4}}&o3V=@l_;2u+n33`OrT7omTv0+02;$*j`>n^mLu;_Mw>9 zPD4_fSCz4BL?jv!VX-vyC>WKbrJ3n?o}H#nf>zCdUTFj%-A-Db1+Xv_E;!nKLy8(Tzm=# zJ<~?XLJVkUZZFoT{j~pm^Xj=>TWK;;X->b@yqH&(qw(@AqQbAn@ssqHgdgR&`twEU z4#>WT$ksl}?fj~xRVST8?ZH~5&6m8e+*-l9{wcjJtV@!|l6ozbi>kZ)Zd)J1%2=We zru_*H^C#0f%P?BA`~c4_Fi`-fukl!2_g0u(M6S+NbH<7F{^ILlf2UT0gXwC4afO5b z=mGy@F7tnY&;Og+{}lmJ?(YR@9vMgZ1GPz9k^?eV|8$oTH=Mw8(&fjk2K6;RgEm&6~eBeNF}sf0K$vU#tyf zs%kAGUuCCRYS~$7X=)uP2cz(fcHS-7fdunD$*P~Uon4(mJcDTMXQ_|A*G+`G?i8*qyTw+M(E zlWfz6B_m0&s4NX8(#CTqu8XTB0?*5dnL2e{uh&n-KPIjb2m&p@R#9}8YVsd}du3^9WJErJ==XQ@`Zu|H)9RFcJlgUBOeGP-21 z4Zj};3|xo$2km|SWWx;O`2;Yfs!)j2JO>~>5by_ZHF7U~T+} z7!RZ*{?)yBwaWSW-&;u!OILYn#lPY-HWfMxf4^68r4i@&3ptv4Z-fHGHFRo~2TFCjEKHV$4o{Z# zc}tZhU6^4N*^rIcX_nr>_VCH}K^8u*!JIPPl}op2=G`2BSj%8NQw{phK~Y^L&EF<< zhfZ&YzZY&Ebi*BFBl0#=(kQYYF_(eR&AP8TQ6>aw(j_*~%igfgzn`nDPw!WsBkWgi zz7DY-oQMjyX_s9oQKf~pbx??NLVw-K5r#-o5F6OKs6{ew78N-XFoJ{IKZLb<^nQxw z(q)0b0CmA!6P)3&O2}dYBRHx5#GC%9pj*_^mtzD@IyjjBO(eX+#{Vu<{q;3q50`=N z|MJ4~=}O`Md;wwnFL+8^)=2)%Qkc(P2k*7OzYq{^?D1a{O}ct{p@ zaD^P>XgY_w7sIBxQ>!npz#!e8A9ZuNWca>&YCF!3dWimdiX&petha-2UKbD2#1>3W zZ7jmiR2^##d;m+qQ%aTohI#}D76+bTfMk6}-S5J8%C#;iYDJl+(DBWitIjzvt=mT9q}Mn|GOzrCk>?9Os7FDayVI2zgOBpT9G;n zXIVMPM`P!W>c40yIA&A!r8GK zm-*TMFznfg?_Dj06%}hQjL$iTE`%pf_q5cpz*R>kA(G8%$vUO|{nNVBmF4^li-StzhTpzJ<%R4dKIh`6M91BbQOTca ztj94642X>m7Inw6-|Bb#vJdxa7UAr(`^*0op(=MA`^Q?ZJmM6g(^q^znE{zK+DPi_a&2dC1HD5x2dsGAB)x2*HMz~)QBcWP z`ebFx)JlvCioKE(p@Q*scn@qreD$nrHv0G@ZP8r@kRB?Wwi-SlTIa5k# zdsZG&Ddw!YSfuqwfem?~FDm4`o(+Gy{mENkIn+5joBpQ_#1vo{ezIa&3vmkO_L(v` z{~0F8hat@D=P}#vG_B#t*;|h}ua_ugn#t=^QXj<_0RGkKa+#sQ-@e(^!?s^^HIriM}Wb|SDP*3W6HiswA zSj|XvamTS2*Ma@Imv^x+-^8B1 z!B{~Ey$;6K%W4etGGLjXKpuO&lOE`$+naLiJ$TvpB*}fN(oD%+m!b4bbnP@1PyhCd z4SdE}Pk@<2Px#JW|BvRt)|riQ-AC#-9$>mJB6Va>DmiSXtDLQATnfajr>g`aMn%#i zF*De}tv4MfpQJW~Ax!bcY3KRp4 zP?=)&3*a<}Zh+mX=Co~0#>ZNus@$wM@u}6Z03N|~ zG_k?EeW^yLQxqq&h&x7p6Wr(TdK1N-($iS!9&skoQ`Bb|p)*PqOUR_LnHX*aBdrw( zWnATN*XN}QN_Lm?pAhNqmxaWb?OWO2tWW7byyg)^#8VV+e8FxM$)5v1ujHBz`c$kk zb3fs3{_VkFAY~k9$E`M}h#^1Rig^RLRpb2TSK0g6_Z6uvqB0c)X{H~!%F|508R}$e z)|_Y`95^3_l%3_YMbODvvVYF=8k&0jCRfuA*S={^D~uw1^Q_ig_Lr%Ttnr-DjQaTa z$y^P?B*fFA_+-;}{Lp^~3ndr#h2OV0N_2{*s6A)m0rGRNl$Y}hei%btx@hUreXCr* zF-6Zcz3k6%Wf`QRS)BP#v!!g5dOdnM>7T0qc`wfold&99(@=F3t~u1r8>xBgZKxjX zJXTS({F1qGwfwZ^#dO0H6t}vip3rONb%AD|JTd`+;%7kMh^HR2v)=}iq%&*SlS3^w z&Q7&EY_|P#=9ZERbe3C+gZZ@i$ z9x^|T)<+}WyEW5r=cs$6yp39e<-7il z66{=(CGSRzZO?v*icqnB>eJkV(tOv+UNn=KivY3yTg)9J40~$SaU`$Y&3eOS_~&&3 zRq3fLSN_L`Zz-wY^)kWCMIpjETRIcEIV3upWV4oGbj|1m#h26kckMMt;+$)kkU{pq zQhkZ7T(4|!)-#I)Pd;u=+o(@iRL=O1NA=glY^&QW5Bdqi%7rK&*U$(onVVVN?;&SkA`J|&)whl6aBIzntIqs`umWu>#4=p+bNa^U@|OFW*k{IEAZQT=i%tS&a2ffPY_3Y}{N(z|+@43t80Mw#og zu#{%?MJ4ZzV$i3)0pJhMT5JdI2&75lKZ1Sc-3vem%(E_El*!j|<#_q%+=C5EjgS?i zKTKG3Y2#fJ1K(;iTMle~sT5n$FT-Q7B;p$LR^#yCKdKoP=7z<+ckyh$m@;LR5#iHZ zDk3jm`yJ&?UWNZQ@!HgxxeV&_wp1Mr!K~b-plwm&Nl;9;-iWbWbx77%hLU1Yw^45d z9x5?uTG{I`)htLfjsl0X=rCOJ0gWl5>rM}L*ps{V^NVrIj-j0v*>_vJ!F1&7YU4-+ZWD<7W4xjm$t;HJrRwlx+p{ixy!!-h8I0QpnFxkz`=1|euDyp z`dWCxBBVDQXlm|(D4#LuBA+SJGo{LES#oi5ZR%DEUag+orMq?d80x?5MAGLrSViv_AzGuZB0LKZ?Fyt4Nl^AG&drRe__~^1&oN$Db%cegoXh`$b&Q9a zN;>FpAED~!M3kqIik#W^hLDO`_D%|`^Ebt;q#bA1D*&k@b+ain`!{vI5j%_sCkj() z&T3U!f8vvMH}7o5d2RFU&2q_PVy&Vd#{-QBLbm%rbgzEsZvf)L1_;NKV`!ob?!agY;W|hm7=?XP^0E>x=G-&%&{8 zckOwY)rgRpIc4;u;o7e;i-Sh(C3>D^O+uzZX?=uVG z86>|GpC08Ew-9AAeB+0e7Cp!W^1=)F64DQxdX~J7J#~PjVqX(FLOTnp`tCPTlHOA< z05Q(NOz%@prOK6*{8UN29rQhDg+`vMR{EcE{owa`ZO;#4$kZimJzY;6oPe3gs!vCd zywI)Zb?!gs_hJUQAYGL1cU=;>@&kyIPqc;fcfL-!&89(uG!=ZK?%^ABktf__{d!h9 z+}ykOAz@i{7D)@ea*KKpo>2HL?UlV8ppO0Eu-0JR@toM`S6dVDVPXU$Y({hRg)JSJ z_b+iw;L2?I#+Ze+)5{7&gBCd-zz&Crw5#KSff-k6a4+H?v#w$JoOc*XyJ23$m)&%OCRl*fbn#W*N=x*~|oJnO^xPbpX}dmMAeY zPRk0j)Q_2s$2uDkEiTy-Ivrzq286aX{DM~WRedG5Sw;1V&7cxx_&#%d{Dd{uD!_GQ zetg^D6|nLdK{k+Xrc;?y;Ps6`5brpTTiKB;G^8{yhHCRI7XOgu5ULzM`NVN6B33~< zRB+tjJituA?v4(HD~bK{6hQF&$)0cVN#;vUGkGH{ehFi>4Phfa3d;IF*NTcq>R$A_ z0Y;I7v-b(0RF~wT3)LwNja!O-g4#-}Pm+3RbV-~VsJY%zasC?($cE4Kh0E6a@x(k% zQl~0j^7==oUG8%qG603Lo{H87#;+5KLx1=Q9tTYqn$h4EBnYs3)=f)n`;qE4LZ*gL z^vIhGqBGem+zfRyT+e{=p3`;-7uD`8n=K<^ailG|d zHVX8XrnlTPs`>#~2hu*@oU84VoqY2th(PL8O^WzdXzkwQM&Sx47b!R){=TO9yhoqBy< z&~NMLCfZ9Is^N;S<$7il^1gScCN~&?Pe)PzWH{8M2abD}2$^*l5Tk2GM~1ADS-q&* zWU{Kd8KGYUt=Q_^5xFz@%T~%T`79^C5aD$^`Q0$WGBvNh;963CA2_3a1b3k=YCML zLr2qVO`!Y3oRYHs%rzn3lmF=nqieWwzUa?RMjxsPH=x^haVJg;Q9WAeX5Cw=dk1U{x3Z^x*0X)*FgeBSO*Pv0sNAEf&9MqyszwqUzN^sv9v88r9P5Ihbc=L@IqM7ExYez}u^!Aj-DPg{svrF*- z$+Ta*gvn{T@R9orNpgRGm0J;dTCZQ9xVCz6nh+Java(rIYsPL^98ng68d@puDptV% z5@npdlSk%oHg?g(XqsVIdLBo@vZU189eR zlw`e&dfC{nQ3-7hO8hJr4Pu~s!82HtGN!nAWU((3?{b?4&BAV2OYb#?HtxL>jKMy4 zkzfdUJZHGF0*_8&AV;%saVh#d{4IZjiu*xBFY~5w1A0#IGo^`CS3rHyPVuSyd&ZNu zR&WBT;4bcU-ZDt|iGc6krfiO(v4AZ6R|9!21E3u17P(&i%f~zAGOVG12b<2w6MJ}P zyB=N_6^GnruFoQ3^Q^1sp`y$=m9`hh+zR9)fcSGGY_s?an=s3PVt);lkV)lFW*8Qw z7mFXt8GgC(0-@x++G8ctuTfub znuX3BT1mf{W_B#SQcYo5pV+jmxoqXC5Wol)^TC?JtXL-DRQiYsEa$Vs z6!Ud3Eh!NBjE9${hNqcLZ2BJI-KaF3*jeEX^jXc(vd9cdt=Pk`;iFFh!vRLg89+-^@HTw4>{A}$Gr~& z5;Zta)qT!-eV!_5NS6Gj%&`mNXptg081`$$XVg*x^lKjME#=ixO1aE5932>kwXa=M zDA+n_bLvGY2*19Y&-?!CW{I^ueaN|a_GW4!U)wBBcmFtIUuSy^o9^u_y}!(NL?0%^uYIBN-e|a7`((wPxhllm zGya~sM3nf`%tM>^h?8?u?n$>tg0K&cdumF^Z$4Th6QSORa+CQg%ihDY?r^6LDguLn zK>w#{YQIbywbNBm-bhbN-|ONf1wh@+b-nUy4*dNTUt63*5^oXF=v_Y;{yz6P7`p(O zK@uin@3fEqt84qDT*#~UWc>)W!nl+=wxOR5-ey1a!S`JQP&cI>ejyY|=B9B@rhtuCLAhz@ z$@$A}E4=l^h@GK_Zm91xlp7peIUMYI=eaL7t6;lo-Na$EyvV!5Iw<#qA-bYodbVse z-+;h~W%i0Jus`G4A^MVhmiz#-4Pl(P@i##g7kgjs}Ki^;%AdgxTdq4wZ0T;WJ zaDQThMyaWZbSCE9ZEQ13C;mHEFd+5+RHRz=R*KRnA)YkBP8~kE0@EW<3_i$G&yu5* z(bBIm_wmjx9Pz#`NNIZGLh~15V^n$F*JhoSw?}>0ZIDK~4Q;rdO7O_1)R{^BOLML1 z&$fa-VXUZ)ur;NyJzU?+P|VxYT7miZQ|MU^2GV!XRnM^k*ut$Z&7{Fq8J|Z2&b7}U zHbxuf`#BPg>n{eKANc-6@;WCx=TMb^i#hQK#)h|)A7?-EPLjgw#=)CRcCPFiZmNf4`of&KlLL-Q%2YlTRnHc?*{9WYeiVOR{v9Nex|e?Y zCbccjj;DLnGaqtfPY{+;bwn2rCxi3ah3M%QI`WvgpiU+! zH(6o`U$2M$`Gry{?OEaFYXRY>FrUcO-O+ki%3Dd_CW=;jNhmePW;KpN>Bu?mi^6sT zD-KNYHGkC|ra7~rtA^x-|2igBBB5nmHmKNhJDs zgc?Z#9DnClH+n4rdvApPfbf z(2H(iYhW|r>Q*M3+l8Up?fm^KAh7wiAvI}@`|+#bla8g!aqrVGqQ|lecO=fsxe(>4 zs9vE*T44&foD_C0q6IIOcK7jiK5Z1FQKt6f#hg!`ZJ8c;NZsY${!IeIH2YthWo4S4 zuS#vv^}F^~to-@CW#Q?&VIBrw8}W)#X$V02-*bJo>d4#cJi^2t(Dek2G6<<}s(2C8ezetQ^BXn4(9*pV+T529V1ychq`wQ2ix`qy) z+a6A**2hIMP5?$iJ}Jm&DJa5Fck3}MiV3n|gaF2R%*_z^W9j|c0DPk2-Gch^;&6te zx2_RJDI_M&O}#-L%bWyYcqcu|`n>8Xc|C4m#gb{kvPYlr!dm?L4_YCYjf&)pN3J;_ zeOVwXLOUUSYg@G*9#g`wY*kvl65={dK)pTqW5!&v3NcU6$7tY?R|bY7v$!$!-0_pE zz!q;IgePlh=Uy0rbn0F4Q(&m-&a#haUEv(QecPrkc4Yz}O$QZA{c{u)E4uQE;&@#} za>(PE<-)1D&{6j>G)rQ3HIC(!xrU&s&=HnR&H$Y`V|vj*e}ESG+*2;wL|g8Kwf|eVP!kn56@# zzdR=qn6{smkSWLPp3cCHW^hm;sB!HCEFH9k#%=-*=Q@)=b^S^_AUe8w|JxUc4(m*_ zF3!_lOf3sv%giE^KiWHVTo#Yho2(o`q(D!~pW0Il8uSF#&=(9dDP7L1`BOLY+LQea zfH$mp1gDZlR~!QhA$8JR6+MY7N@3|LEIFs? zpSO5Ri9_eRu;L{}GVzjVAah>Z83w4qD6=c7p1OXaFCuJV5svW~{PK|7-N97l%l0ot_mP z->|l$XQ!u|tk?1%d#l@2PXrEmdv@*J66I*ex9LfB54>9a-M9T>YBF3umQ;rWJ^r^( zH(y<^A86B_3;L-YKWR`#JM&JPPGq4Q;6k(JI>!mM5pFvBM;k{*L~lk3V1Cou@Q9{CvMhKL(H8USi_n#azktl zQj_f2bBz#W4#Ei~@{2j0j<AQ62u?|QDWSel{`rCX} z8C%vu#PRNK@dzwCRb896#W*{v@CWRk zyODh0G9sjaKQK+Cki_LJ6Rl;~zUj`|@~zdQb?W}~?r!Tg*S^*xbq`6=s+FHI3|}9= zgYjHAVmD$g;<>i*Up`-KHJr}-Mfr}hKsjX%XD5$97pG1hZ^7sKOLB6=Manb3I44=U zD#e;%q<*BF>;*?eWP8N?4>c~d6u26ye{iclg#h_n%srU}w=Y^re{{^bf4wOkNF}ba zro%8VDUT;5{UJp3fQuM>gF(V%w8HmI=|SS;-7h+~N88*>jLK=;iI4Z5URd8ZOGUWF zmrQD5LnN<#A02{L%x~;YdUvyGG6jJ*yQLdCYcTrX6tOx&|L67E;qE?|84=Hncz zD1U;L)%#oYN&V0pKNk58R39s%Z)nebpM3xR$YC?Eud`Jlpt{uxz`b10@#Em)=2taG~IBJQSN50EOHq+NjDi=r5vC}gAk5Et zBJkNnQIQlky^>Z`Gq=4dlj3E~9NIYZX3Uh=pTTMKL0uXw2m0$`J7_q=>~XnOL7#|i zJoEM2L$lBPG6398Tm=s;5t^IvuW!XKDqI)u{WQBnb{KU#F`yCm6_HE8dxf|dW!w;a zlD&IwMejQn2Ur^Z>_pWx7_4>8X0TAmQuvD7pG$<7HP}`*7}$myBsch~y@A|bb|J=J zuG;gxtCL608oUd6OnB&Ai7TZ#NRQKVoAMyudpU|Z6JpTFY}W1Bfpl1rUS1$3v6uJ$ zqbiudIb93=E^a)q(@UgiFaCy8gU7t8yaCH~LqMGSt;ok|?b1hthcB+zL!QCqaEkJ? z8=V3>Dys`Tc7Mpe>7}OP(aGE877kNm%8iB)WqOUWKDX{G|`poEG%Mh=> z^gXZ1V@||66 zdK2I^xf`2W^0ygF*-YNt3+7E8{_yZjlA{4&!cNFqgnS}yh`_(B5_xV`H?L>k9*4=dQZBVoM*f4Tw*JtkTKMw%M|@$m))h{W3-68^<1M5$T0%{~u0w+XzulWv|SH&k|6C!IvxbXRairPZq)HrO7w z&q-BCpiu7PJAhVf*kIruAzob62MA+hNz7Y>B=;8xJ&b6voz*<9(ez&%M*gSQipdKf XdOm?jrS}14mpZai3X*xx4L<%aPMu>% diff --git a/en/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer1.png b/en/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer1.png index cb77b3190f03ead94cdaae1aae98efb496f918af..0251cb1478035da0c662f8f384d65f56dca169ad 100644 GIT binary patch literal 12170 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 LR4995@%Fy~sMU5y literal 11866 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 O0Bd4>pxW3i=6?Ws#$ICp literal 28995 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 diff --git a/en/chapter_heap/build_heap.assets/heapify_operations_count.png b/en/chapter_heap/build_heap.assets/heapify_operations_count.png index 012bd7cfa983a1c6ba519d009307605985682294..c5f93069f838d6c11a7166060a1463895bf0d327 100644 GIT binary patch delta 19487 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 JPDHLkV1m$cHu(Sm literal 19890 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 Ge)WGy$p~Wr diff --git a/en/chapter_heap/top_k.assets/top_k_heap_step1.png b/en/chapter_heap/top_k.assets/top_k_heap_step1.png index 7447e4abcb302157a271e04686f4f598e82210cf..e23da68579384f8dad053fb8650b4a1100be9957 100644 GIT binary patch literal 16316 zcmd73bzD^6*D!h}C`kpRLy=GvP$UGT6%pxf1Oe±s~|P(V7B?(P~zKpLbQ>F%K! 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 literal 16418 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 E0IwXb8UO$Q diff --git a/en/chapter_heap/top_k.assets/top_k_heap_step2.png b/en/chapter_heap/top_k.assets/top_k_heap_step2.png index 5962b32ab106f4ad8a30aa3aa2b5aa0f0a8a6709..53ae93b870609da2df466095848c149d4a21ed8c 100644 GIT binary patch literal 17748 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 WbrYM?a<32omB$ZM?&l~V-v3WwPFhF+ literal 17869 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 Vrdg{`w*Zu$Jyv{FAglk+e*@*%ZBGCI diff --git a/en/chapter_heap/top_k.assets/top_k_heap_step3.png b/en/chapter_heap/top_k.assets/top_k_heap_step3.png index b73903f4c03b2f05386e35c0738f0b27a271669c..f1a919eb012b63976af363fc461601a6ec7083ff 100644 GIT binary patch delta 17175 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 Wp^ba`3Ca@!K5EKZO63aH&;K9ZyOa0; delta 17273 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 F|1Y|H$j<-( delta 22237 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 diff --git a/en/chapter_heap/top_k.assets/top_k_heap_step5.png b/en/chapter_heap/top_k.assets/top_k_heap_step5.png index a741434f1b6736a771f9b350274e1e1cc65026ca..d83d929c3c1aab67314eef4be8bb21df4d236de6 100644 GIT binary patch literal 25185 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

VOj({*DI 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 diff --git a/en/chapter_heap/top_k.assets/top_k_heap_step6.png b/en/chapter_heap/top_k.assets/top_k_heap_step6.png index 8bdd7c1cc33b1d0384adbc95dc818876f0660e18..53c669e177e654bad6234b29aff8dbe0a2d0abd9 100644 GIT binary patch literal 28243 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 diff --git a/en/chapter_heap/top_k.assets/top_k_heap_step7.png b/en/chapter_heap/top_k.assets/top_k_heap_step7.png index dbf6e71e27e1f5f878f6e945c1bfa9006ffe0d1b..b77c839d3bb720a4a8adc5471310741c7dd17c20 100644 GIT binary patch delta 22312 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 aeEQH$Q5>@y`-pUdzNVqCUU9|#!T$k_0bn}- delta 22783 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 F{{+7_0Z;${ diff --git a/en/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png b/en/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png index 3b97fd57f77e1008b6702cba312c374ad71414aa..bb76c5ab47d7db9e6086ec7c11d159f88d389c7f 100644 GIT binary patch literal 14062 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 J6=DWo{x8SErCR_1 literal 13348 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

}#HE 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 UU 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�Z{!G&a4k^AR$O4i-YGQ` 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 diff --git a/en/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png b/en/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png index 5ed1a155b792fb4fe6a2e5b2eaa889e02db7a403..e9699f7d4a16e3dbeaef49d63c5b62688dc5792b 100644 GIT binary patch literal 34384 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

PV&G# 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 RfrvvWD`?2Sx@Q&se*yS3$(8^B literal 34436 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 IM6N<$f=X|Z6951J delta 17863 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 S4H6pw000025fK2q=wogCHp_-HL!T(%s$N!=3m2 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 delta 18895 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 TqOhkB@Gw1Zey;paOw4}(Q||GN delta 20564 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 H{BHdZ@SGVN diff --git a/en/chapter_sorting/heap_sort.assets/heap_sort_step12.png b/en/chapter_sorting/heap_sort.assets/heap_sort_step12.png index b094f53db8d9834d4c9df8a485e67560517ec97f..ed065e5db9f093ce67714663efa8d7e591f799d5 100644 GIT binary patch literal 23200 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 delta 21940 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 diff --git a/en/chapter_sorting/heap_sort.assets/heap_sort_step2.png b/en/chapter_sorting/heap_sort.assets/heap_sort_step2.png index ba2fe8481dc3898cf8017010852b5930e3383a87..587eaec82087b7ea3c5d4eafa1c647a9b30aa9c8 100644 GIT binary patch delta 22050 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%0D%sZvTkjp%nq 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%0AUypj;g{iBM{0dt2HlfoPBlJ=zsKq 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�oHTbKPIkm{D(|PsecZyv}Ye5l0s7 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 diff --git a/en/chapter_sorting/heap_sort.assets/heap_sort_step3.png b/en/chapter_sorting/heap_sort.assets/heap_sort_step3.png index acb09744e15eb6508c90ec909b8aaef01fe2a902..4178dc6f7f701c2857036d784550c35dfc731e8d 100644 GIT binary patch delta 23704 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 delta 23417 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 BL398B delta 21468 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 diff --git a/en/chapter_sorting/heap_sort.assets/heap_sort_step5.png b/en/chapter_sorting/heap_sort.assets/heap_sort_step5.png index f68b1da5317386cbb3628e0de60f825329304586..568984c3fd69d90c13a4bcbb2cb3c4c54a7a19d6 100644 GIT binary patch delta 23598 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

yi>D;~TR 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

CCZCk&m-`c$wou5nZa;x)1t#D31?KM*# zG?pG*-OLW`M017PpG0?uyC;u7UV@g1a>@lTnq4uFw-0oB(XD~ePIAzET@rC4kuQZ& zzoJ(<|L-lA3EantM4t3kh0f$xgAN3Lnu4K`_za}H?S%EYaPdk$+mUp5CUs$W;jlda z3aR0;Wm^rJrOd~P#Y+7_++)b)V)h=xsIO@b^fz5HxOH=GKKV+bOl46n>c zp0Jd$xq9UmIk<>wQF9ZskeV72orV0v@-NiT)k+=5drrar$CwEf8K_8wmz3C#uOb2Q z`Q%m=%|}`G4BjOVpi`U82F?I(G_r)M2|o$p1ZdG-^L^2(?I8t^M%iapx$ zw+E21@0o2r&5C2cO@uVF)y4sLpAD*oPQZrZ%0v+s@HnV7(ly}mmo+-O(S`TI$K2qm zpkZFow*6uv6>nFnj4VW~w!VEB!a9i0Gg zpSSR5kMf7#ysz6;J%9IQ>f-X=&hql!&qlO)j5U55kiv&O?Bgxg7hUo{a?~K_sNIhq z|6CZETj(v(+Ip=}{F$er%-gwMT(>I&T?emZ9!_8ZN8BvjXbs_(zTFg&dkuSho`S>k z=6#lFvU76sNoQz3?t_Q2Ji*+$gJFsF;#8{ip3<_fd*$(L(T4f)N4w#^^i&IhTYJ%d zH3ktq-LmZjI!IPf07kVz-8Y+uoA!B5!Ea?yjGw7-h5)|K-WCmWAmez^A qXSVURk`(lg|MyF3BvE6Q3nx;E3((LkWukS@8?@E+)GF?nhx`xevFe@x delta 23351 zcmZ5{WmuF^xArqbNQZQ%fYPmW3I?6hDGf^ZGjxZ5gmiazBOpjfmox$b0@5Ax4ZiO= z*SWrbFtgU$EAGAbianKIA+4Q|*iw|8xtZ;mPvxgZ59RC7JffN`R7_SATMsjm=i+6!) zA!%!C$4^7m!G&vvO90SweI+BQ?moZYj_FOf*$#*AaWZ$xPgL!r=MgP2Iq9=Vgc}$3`qM`^i8=?e?H;PZ5Pi4$lw`+Kvx?8ocSdU|v zsHmuOF~)A(fEgC=-7MZ)2nwez{jfhj@ooRUm@zbr7VEQhqxU|MJ04$q5DXO~BX1%A zUJG){>MO`u3}j(WRNU2Z;kjV| zW79d}T5}S908AYVUKh-D4TS*3r1x}a$bj?HyUi9oE?NLsGn~sJ!veNT?kQCCMV)>R zUtg#2mX?;vb-@sP;L!@2y%@vvv?VGM(9!`{zd7o1=tZNxidxM!I(uvLh#vJp82r`U z4@zVE)7Ots`GSlk0EyY7%qhcqmrA4hZ*-)1Kx|py2TF(Q>qnCQ&$vh~5FeyHN4gVq z3KT-NB}YjquJL`S@^p&|m0G3J>hZ&Z zpMej7A1{htCv_I>(`1m|WO|#RkRIGzM;iBH1{s*RkHpg^1;P?oslX?&&B;(&~W25dirWSzcCzCS7WMnDI^K*lGt zq`>@9W+bu27bck=gip-qdI*6*8dt36-FzgdNC=`lTgU=7uo?L^#ho4*VHz?rtl`#z z2-=OHPCx_9(JV7?qU;g&9iwyk1In0?BS*wPj*T$6Q2CJx_>_UfBxVjb9u$!0frJxR zZ8CH<>fPPF;k;Y!1eYn_M3-;4onPn78v_?mgCP*$)f0&qsJ3)XyQDYg3TJ16U~2VlK!cy$>cRx# z%iw0ru@aP9f_`puzMH|rN55|YVullmovXL@S zzDl40v_FxxXs(9{wd0K8A0Lmq!ILd7!U@mcg|g{*?OTLSsIB zMYwx|zD%(Tytd&au;OeLxD22@t57z2puB{pk?k3;rdD>||2CR5owtJIQaotV)NO^- zcu_9TE8PJ5?{dD(_iq=VSof4@5AJ-$(3SGFgXk%taos-x`Z!}-qy=0^X%G5;q9~*H z+c*}#8ttF9IgNh%As}oG^*`=#r%0A_5|EbAYJ$)j;2=DHh&QI;;6N!OCQ4ZV=XyZT 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%0DNn^rxGm+~Rls zC^~c=!n^+~7Sj7__!IAH4jkBYWD}}g-Ez3i+(!O`@R*5e8HY5h!4uzc0pGoG&B6qacv`&H{Np;CDxMX*NGLVp|9XNTS_?F9WhU zC6Mz0a*gXZOqAxN6t>^Pf!rjlJ{R)mxTuS3tr#p8MZ2rrRo8Jqgt^iM}KU=;r%A0AZgK@@L=HsV4JW+{41}6g(-YSk^lf0H36Ul0^Jbk=Rx=Me?MraosBm^GWl#a`R-&b zr@8LllzjyHA5<7^R^QRb<%QM}8N4YsUyTl^=>~FdFYwB(bwk&ydiYBNY8J`|0=-{! zK&ME+k0&ak_QHyMrhHD_s!Csn0u znS=kv_lppj2Da?70J_r#LMB+@-A>vC^~9jp%5iSUww$XKVy_2C$yHKaGZqrj(*+vn zLzKs@IKqM`{u_Lk6 z!mW&F-k6)dZAZE3p&EA1RsZffe8HBl1GEyrco5~l2BSk1#2l96;sU;V1&5*qVN>`Ij@Fl3ZYd` z7s_Mro9vio1~YR42(Fka3;9@&!PG+|0VDTc8;v8GOF=FAk_ZFW`PMj+=yFVTCZk3h z;6?7VXBD$=-rzQ!VTwuQf4xQwZp94))Wc4PvcT*5d4V?+OQXiV@a}L>ngt#8wo*gTS`^XL*bfqdW3hxRM*7mNqs@enHir-k-bO{~ML~Oq6~&#f zZe7--i3SI_@wMbt!(W|j)LF{6G9PRW(OjmOU zPPP!ETlIYdBX?BdwP_cUnLkT|7dweW0?xe(AF7<{%#M~nc(1JmJX_6vGN0qoV3Z=h zQ#gj4-$Am2ByCmrX`}W-EGs3=fpLe2h8~8SpA6p9-4EV-hG^+N6$+y{+Pii1okRzR zZC2dHBg5O_6}VdSyXJG^4v%MCz8F4IFzS)N?yts$|(eMeAb<*nw5*W7(3(t5mQ z$au10^p6;?)Q%TwQ`)^&`%&OezUKTgE{BK6k23>Up2?I11_7Ja_UdKbBQ(>l{k0QCw}%fLPu_eGEhu-Zzbzmrm&ApvOHvgI zT*%#{N;eik=syc35ika0ninj1YbTOlV^#Yqct{POufPn&gU8p60?Vr1cEg&uBf^1U zjE-5SH4k!3;Mo^N`*WrM_nP)^~Jb?I7fZO#O!G-!h!2@4LU_8=!pN_?i$E z5;eS}-e>uS87aZwo#(R3F6KlI?tkR<74JN})m4JG13g5B&zE827RlpTO&{0SA>J=} zVTQ&_Hm30})1BYs5?a5(C~dCjHHmy#^%oR-?v^1}6=#kk+sclS1UX%WQj)K9GfmJ{ zZDqtU&zjSy6h`8q`#!hh0V>&>Ax2{DkSt?zXvlkPrbu9(v;<R z9H(MF^~ILm%;}q7JB(?Jyyr(vaSyNbfALyjNgsb|?9aUmMLp_zmfwBO9-Q9iOh0efs&kt*_YaMhg2 z9w(~IrUvcead%Nk-=>kl*tAu66=tu)k^meVr6sxbG-rPaTKtKz+sITCLZXRgth5P{ zRG84`cHM*fVcX|GTE9=NdEFFIZeOifz8w`MN^Bm2_4h z;Xu@rM@P61K#mhY@@3|5CwoQ}!+QjIoio*=ki0x+rfpS-d~f{E98EVn y&JPb=%M#%tB8@vdpj-TZzoaHSB?i>-_9b4#-TeoC18zUA{!mfUP%M978TvmO*n#~3 diff --git a/en/chapter_sorting/heap_sort.assets/heap_sort_step6.png b/en/chapter_sorting/heap_sort.assets/heap_sort_step6.png index d16956b21512823880b82cd95651dab084c58d57..ca48e5fbc004a18bcd0d835f5642823db6de3813 100644 GIT binary patch delta 20796 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 VyRzWuqW|mr<%^aV%1vD#{tvCd*o6Q9 diff --git a/en/chapter_sorting/heap_sort.assets/heap_sort_step7.png b/en/chapter_sorting/heap_sort.assets/heap_sort_step7.png index 6b9e84ec1baf916671e97aca6ffdc6a3ba89cbb6..aba72afd41824a39d698dabb9a7f77063da3415a 100644 GIT binary patch delta 22541 zcmY(qbzD?m)ING<7#gIz1xYET8%gQz5~LdhB+t+&EeI$njWh_-A*mqUEhXJu^BceK z@4olmzveUhoU`^?Yp=cbde(E!#|B7L6C|MsWoBz8v7DAb$e`}+DSM#>8Z3v&m*UEvrTCDFx51_qGc2+JXu-i@OucOm&~~ zY9OB3%RLJ!DypgksWJayVckhnUDL X;j6F~s$KPJOKorfw-+>)#BKC%sA4D1Bgp zVg_Xc2>_?vknmA+Nud5tMG6DXFs`>3i@NrEe?x#bj`!i!**j7T^nldx1l17 zfA&4yoSYs`*Vop5PKgF0CnHA0Zf-u;(ndjn0!{4*;@jg6*E2iX>)6dN7Qb8E9)&?5 zz+ykB1)j>MQ?-r-ld8TV#|IL=3YDMfTP?2XTlr$3!GL_$KQw*mZJp8yidfyJZ~&gn z#L|s?ghQsIP&2{TVfTCQ4|p086i}2_p@EzD<(2orKL&#qzZ30XC_vLEM8n1FD>8X- zj^}90PdDk`pcdI0&~NwT8+K*86uuC5H~haroV;%0=GY3?NXl89tVnqtfd1o8-dJ!@ zJJL6gXGN?QLI8yVTA1H`?*v5A|0wox0D$N&BpBa)-IlvEJ* z_W#{aSac1s6MaY;T@};Di1Nn*6bU>AAvt%$aS(;{tZ->6avC%|%qk1$36 zIWNgQ3yPHSgA4}J*US&KbV<@^RA4_xjvSNiG^oVAVuyir(=S|$S!jI*G~k|p`Qc`| z?S65$D;!?<3V*=}kotPft=};C74MkF<^VDO zJ%b<}IDF=i~c8^lu5Ffd9GFL@4jX z9EZU|5r`s12FlO=*bkJ=3>I8aG3jnJ&h+1AcK<@cVz)Js2$Oszx0^hZE0&^^mGU8CUT|4 zLO_6~a72oG!9J~oy8X(O>_|2_A~V(hxq4e32CfAlwR6kuNPc9?S!hF=5tXiiq{-(JK{*_3h&>BS;@^@069)VT;&t8 zN_pG4rTKzFZ`O2Zk8k5uU!Wsb$Ln5jmG+=ruGf%(Un%dqynIleLVSfLWw+lw=-x|v zcB`(l8idRrli-+T?F-x9Ndw&AG}hUHMPU*jY9Qh13>EN+ey&=(%$%@z7p08C`BOKe z(XiQqCm{8~!u6)ly&d5u=Tg@2{BRY`WV6E*9biJKx9RwO={Q`|E&Ir-b?W4?Ucp)$ zGH=lu)4-KC&f?SVQ+L-%3M;|&@Unr9Omras10s2wF1-3y-4{B-z}HkFcp#3{{Enpv zT=+y+i4Zd54F{%Vaq3A0YNYVIIDD-loG2@b!6aeP4 zgN9|0o{kPcrX9)-kDI>L1tA_i@ztnh@U4&p6p%W(b&W}T;00M|5ueP1H9C~V1kmW9 z0R8N}K1I-tLd=8JQy*@h9i{*r0M6AhYd?r4DpgLqy#PN>K~GljK_cfer<>_%iAX!7_?uR)qUb_ucB#044xFlsjGs${q`@ z*c`EYpLf|JZ=?1QalTRD17WQvVax5VJQ5^;lr6q9`brwgF;XTUK=^uHvmK#9AVG%I z>x%nfn{M=h;4D`r2r;S^@C<;<672*1;J1b%a9#dhVFdlKYk2^f5}@9NV6s;nf_(RT zy1pO{-6Meh%lb^(gC=zm!XsC*e9yV%2kO;Z0Kn{CM0zEc0+{;Kl%(&=$c%A z_r6OF#b9jrk=eGxU8@Qpm3rg4WqPcRsM?q89n(8S*7d z^u?V|JIL-@Te~#hqw(#+yS-OLUBOT~?ml!hU`r_Xc#5!nxxJ{t@xE_ZC+3GrCkt}88_f+}6%mD8WhuI2 z>LHT=8vw3$nw|0Bt{>zwjSGiuahi3v6OXR~K<0Y;UEHS!0v{BE57lwmgPd3Xp8)uk zyS(uIT1w0M5uMd`X;_^9pF9+xTbX!V^5RYZSv(kbLT436B^xS6luZNBOUz|M^rxhe zF`NOh{R!n|N{Us-1Mu+<)Y2bD2~g;z3*Y(FT=e}#2Nd%WA`UkSef)3|_PE>o+sG9n zWPTX}|0NOhUmu3Sn2*#OHWw?;VL-QHkt$;AErM6?ZPfSQ14j%{z%sWLlF(w@Z2-z> zx_BVXApbUfD9H<c)F15e?b#i?Mm0PG|{&G779Xmk3gm$FVj;J_} zynnD77wHEvA4KIPTsk;?`|ck8Tp2)s)}r;(Vu?ezP&VR2RSA5 z0V$J*f!4&`{Ix=m=^KiM6;#r^(;}b-fL}zNVRd|oEKt7C(enkhdccB@L~%cp+ED2@ zfgJJ2*A9t1w-k%puxy0Lm&fFRHe+cF1+t@73K;+L2910y|hp3YS z_;EZa^mz^rHp5w_h$I9;0eLXwX<49|u%e*rO+U=XKkP2=Iy#n?mL9)E0R|1cfw<46 zuDONG*R~xL`})R?Z4o=cR}By#@xExrRUrOW9z5=MCB{Q_wDE~S5iN&^X(XCEpLYbK zeAK9FGIFPva0jH`B3|DArnPoCQ$p{ZB|hLoVBSwoeO_w~p46ZRq#_F*Ug!5QN{*r% zNTx@IC~fKI(I|N!Fo!3<2Ah}LVW2ky1t?#n0JtttEbO8aTSDYkkMppqWx;|A$I&?l z`!;M_!i);A@v&e)*y-|~rk)J_FQKRpxy&W#QeSoNCymTPc(S)}kyZ89aauNfa|ydr z(u-JD=$XB3$4i86>m06=ouZsQ}tKj%eg!Ff9c%t^H<3DK?=uzS=HDO%>$ zHFV$s`$j#&J8x(Hi##@Q(kNJSEeck(Dr?Bd-T}Z!5-+<_Q+Z*V1QyEFj0>ud-kp9a zj>k7wsVAKOgg<-W6=g@1@UHAJQ3EA$W8h~<>G5*_fJ%AY2`V98qRdfaA0$H(97YlP zG>cDk2Kua#AOas?f1n~MN0vVFv(GGwkV$OB#p_#Y4!IkB5Du{Q30zMT1@bPk*$48e zfa*WUg4+Qn41kkXVF1>(Q*jVm1sbS#9OA2-hV5TMv|K8D;2ZoSz%#7|u+pYcknGp; zWb&a5*#N9`FzP6Ld;kXLzo6_e!VnTIv4PK=Wm7^|4aosN`k@A>6cvL7ODj~q+d}}= zAle;Sp+e)HfPhY~v<*uv!V&}cSJ*?oLUK%fSs5(GTA&&;gBMS7$nfE`N^wDiM|&4V zfbk_XPALw8zg-=C!7UvDw?jc0S&OPi4OrwyP+!<@T|`QY>^eNIhj*F3;GgRN&fY-S zJ2Re4o89~DITFlu)F!un9TTBnzt3o^W%|kv@APa2h9uLIZ!&du}FvoUz z+*Q2V=W~sy=TC9<_UoCpSC-<3V1FVb$L;d{1l8r@heGZ`#6=Pqw9%h%E{H@D7w3xe8{bARER<}5PCUzRRmzUQqRGtU`0PLcBwRq>+FLK( zRttoCIe#vteO;EXIiEvC0&&Q|A%4b@@TKm(YXv5g?{oo%Mgb^H9Q`EgGr2z+r_k80Jh=(lkw}fawSLjGB0wkt|Z9!kz1XYrLWVk(fE1_ zgRSHA@v=+X$v3^It)<&>as?wbH8r{^ed6bGcM;9>t*o#ssT?jOx(l~6MGkV8aJe?+X{629|{d@nT;8w6@rTfNkP*UF|9lX%37`5pZE zXlWwLWbbYVa<0W{!5tZ-fFIt_UvVw77yG=%zKMEdL-27-o-v*y{l~43N;%MjInkth z$sfP)*^KVQ%>-Cjy>&vbStek%Uz2-Jgd1=}z(_%LeAeYZWaOEN<1Zwe4 zo4bSD{GID4^dMKdcP`3#MX|E`@E2)SIFOktN4G*BE|!XKj3PPXM7&ZSu<@j;vi8Yk z^iWq{n(^DJ%9-;==7s7QGzla7?|DZh0j0 zW)-xiJ+H#DW=(B0hC-c&tOt*w=GWz)U8lCki@?s*=&QDY))~XLnID2Im_&Xm&;T^a zOMo?P>7A=6tgJc>{lmDmKBJh8C~R+swCW>371ofIA^b3o975pA+&PB@<5WEd*(3OQd6QfjYe>LdE zoRD9q!rk%m*AT_kPxOujw0b(I5h{ELDJ7UU3_e-r*at5!`a#lGfw_15RKOf8YT@^T zm|?VuH6c#th6HP`Z3=8UHg#3FrT!WtyBDusNHw>@^&l3h^%Z-Oa8o*!<0?p8n)d>@Q7DoViH{qVy+zQ#?Z1e@gN!J08CK5>f=3Xc2i zc^z@DKDPd*Fj?z8pLV{;*4e6J6>wecSGik2$+5Va->UW8Cm(qX?CmU_J8VpHl@J4S zPmaiOfE>p8j>fO!dsmebhG(#~(tsL55Z z0pxffsg1XbKUM}PuJm1c#^DdQIRc`pb7FkNBF zr)+stc@8Si*KDR)Z_-V(b)K)3;j-=vRL$`{uc$W~T?RXhkRaZ|xdXo9fUN60mw#vd z-VkIzbMv@Se|OKW&{nU*8Ws4TFXZR-Aw-6wgH^&YO z9bMW%-tZig8L^zIfi8`cM-KoN-I4!sP8xN##} zzWiV@@n8m}ZWG1xNTxfJxe~@XZB*b5$ZivHu-htIQ&r~kt-z_Mw|I=eIqG3zfyz}m z{?Gd;N|99^WSc3YCH8QH@k?`LQg7%r19~RK&`7xu%`CT;RS zO}J7j_GK%DRnW5wi(Y(R#m}i0L%Fa06gy!8|M;)>C;}0X*&?y{y;XL1BA;tR!FNpqn}>p1v~kbroptVaYsTb{_lbvy zd8I&}OLFy_r8m0p0rU13XS2O#D&}SuMZFn?g#o<>4kG+}!UcALJ06-nvy5Dv$8pR{ z7OwUp^iP_vt#Su$U#D8k)epY|xx}-I$o|vCtH@1%99#FWesrS5z~T8I;OrVS&XS#{os_Bh9O&p)ER#9J1kW_3SWULO^Zg9m-#eK;(xfGw)U zqRNK9FeoRR$n`3T%w}=eOh2@XZ`sp(L_+{=DJwf9y~QJ}^We`q1!1VglDb{)_iRq7 zwj6$#SjXB>sbS(3aar0{pi3~g#MjGZJ5V;AVnA56Xuz<&uee-C`2ssv#&@<2TMNGS zPVJG8Nc-J~ayNm>A;9?5xQi+9ZUF(_?V>$ue3esF-x3x4>q$>auVcY z?Xd8TSc}k}QRCEFR@YRf4N?KN43SZIvs;xtAy$z&d5Xh2Ms)gFpNfT3HQgs%2+giVSWe4JL|+|aZ3CHy9n z6q+pOSRx62X;u2{1Jx`vgj+=w)@;ZYb(gd#eVb#FGR)d;I3WJ^`aVi;^*^~Cd0t*# zp32E3ZUU%j6eBEkUrW609kt+bkyl@^53>a@MjC2qAT~tKI%8tW;CrTy)=tk^hbK~9 zNN3yqq?R>4vO+E`;flv%p(>=1fBfestmh#hK@JCNN1beB1W$?$evZ4XKY<0~zRp;S z!h<4oL6%QnJoSqnl#g04BP69vaxfo3i!zYtia3*xL@2UYjJ1Ph3$@yX z_}}x;fKb|0QBSUM&O}&4Lh-~Ku80$yKHQ?5C+QBn3>3hKC+uw`x!Owgh=LYe9sJpe zf$KG3@$t5}PQ~eU<&=%VdL1iXlFA2YK>899m2%V+x-!oJ4u=%~Im6>o(Vz7t%DV8R z-_Su<*-A)~au;R-y0rR7Yn8Vj^MOk(t01?aswV5I zUkS=*qi+=adW_GgIA^(|4u-&?41Y7MqgT1kzTs5HQIF96?_^%>*k`X$J(reV#G?*9 zDGh%lLL(2UVU&G%It3E(e>A`xaa(Z1nt!Jj|C+)_`{*$MEb7APH1Zf@0N=-tk5|dr zq-c9Il`Xu(nykP5QaVV8j+Lb&ar_yPL9i`LU;?+|avXp0W`hFsi6F_*yB)L1J-u7z z_|!Qb5K(+B$PBT`T(!>H_;g_?|33zD=?$AR+3nFd9xN^mFBIuI44iGv6-iY?X@>x={=j*l#2Q2?dL<`=ZMOhV9|5utnJ00 zl_U11z7d&9V6BcstJ6~vjax;{o{#7^+iJBtk4If89JMJ&t(Br1rYk&6K7nRLiq;~! z_sA^arp~oy=@iIIC&`37CTFe5Tw zVNOh!mNAX%$Qimv$i*$x3`RZKi9=VHMthI)%YO}>0tFaZ>u^MY0LX+6AQ>FwQD$)Z zUC^Bfc{)*m@V;GVJG-M>D#{kKN|q;%M{kp{k|~c8p+K&7Zo`!U?fhIQf$-WCFNJE7scJvIeh-& z45}`yNT{Bb@k8jxJj0D*0Iu1#{_d|<4SE1x=SUAa!=xqQBaj=#x45*K4}@=Uk#xw8 zWDgB(r9JG6v~#-O+BbzCju<-l^=Or3NZv85Bm58MH!YcChme=6lu!@HA~YmBX<;WS zz*?W2W* zzM$P`YP)#gTdU}7LNl4r4;)`9De;lSC?E00+xv&GSw^IVQ!!0wXUH)f->W>&NXvL~ zc>+SSP;b3Mh0Z(R4ms+A?5;Uf?4^oQy$tNE*emLte1Q+GRAC(TYpD3&kq1i zwt!uq+B1)u+3=Jj%9e{evH|2M*kli|B5JMh(sBF4rgP4z=gJ`2;>hZ4Kiu}jSHgJh z8)jvvH(-aLM8>}W@NMJKJjCdSV^mO-a2yXQ00%U1vz^4sGL9(!Yk+t&JhyrD?rp%` zAOU7+^V$HHd8?=O>VceppEMZ^F5o|cR6NtxNvoO6ZOr*r@YWBE+&gG}{W1v46jgKG zT&!qI5cyo*fcM>pC@z)*vu{4s-R~4+rM(xwgsEpSm2_J9$MjtAGog27Gj`54C7{T1 zSaR_*G6wr*{3}hmu}2J?9}k$xO`NP(T5+R6RYFLsHqK_PqJN>C(eWbO8jjd@F05uK znMwx+^t%m1^})a@;pEm0_O**%AKaJH+3`_X5^rl_E0Vo(0FHOPEL_9dXRo*PR#ENB z1QM+!l~o&$iBTZlzSuKXvwjP+=E7NZ;)6-uS#}!)6=*-(R35zE*G3$1uHXjqrLQ(e zXRNua*yKYQ4H34s2$U)1v)EKTL(1?uWr<*h|A0TnSq9 zTV4}fEGq*ch`f2I6U2B5e=lRn!Bj>m7NuP|zJFuwEJzgk28Z1{V&2lFE5*#FFidIZ z!(Kmh&vfU*fS7uvMM&A7p$k}=ell&vhn#$z@UQ&B(TlH!xIJaFkSPr1C)B!VgRB7L zHPtJ~ZEM1cwIvZUx0?OCebC|eg%JCK>!7l7?(5dpVfb~!@i*MdKFu`jFFj+>`W*@5 z0m-WSAjFrp7-!7+7w6sDp<{r}D^zkX+$H3D0o;~Oiv%wNrW1(s14mmlEAB#uu~?u?)uG{IynGUVv6{;UcHtwxXiIll(tQErULEn|=&8{8rmwVc`!8T5D^5 zj=#&@9Obg+QI_L$YvCAjdN!;dH6=Hc>1MRBHueN`E%9@{Xp|S;J@*JdTypxgv(|HJ zwC$BzZKVB77mn^rA$BhOaO+z1H12ddGC819M8!8sVti;C)VcWkOE0{kwgsQ7x7_=BGC^D(-&jlbrTLW9O|8_4uj_lC3b2igXMcHhyih{oePdtEl}KNm@&t;bYRR~s_B z;N=%q{kVl{$Es7hohsXRQbT5%0G+V)3XsZH^-2-T&&c^=B!jCodne-EI7TWkc9>r< zq|?YE{-gA*Z3)LAW-djcSj1_a3-nZUzQx~0ct9MK`D>GJ>-v)Cm3qo0PkS)A0mJ-&!d{ z$<`^E-#mphd^>duvwCluwe3}J`ToS?c0*)cn)MRi8-{f^z#qwtRyTSd(>Oem9?CU_ zZI1>*vVN^co4K|&t2(v4ETZtN8*!gqV5X$fgI7j7`M<+L+6((` z#S;;x*O%dE!T*e{aq2_$Q@x-i!re%5ASmzeTwoZ#@_4UP%n<)4pbP5=?R>glsCt3% zFv0qtfe#ITzWu)Z`|7+)46S6A!~$#}cu$kA?}orV>Eo8#rHs3<+Mf6EiUG* z7xu3xaAD(Y z|Mrqk-9GM|b%l|v!zap;5q1uWPedR)Sd%pi73Xa)A(S;P$UeZOj)9J&BJ+UR5QT2#?|*gX4BM4tDR1T70{DSrlWA)h%gF-A0sQ>;le^`zho zhJ7w~+Ek{WUVWWPQ%PxkXIIhWSX@vLifBe3Zs7o=%s8ZVhl(gIv{!0VmIao}IuS#^Kv!#Q@#wPQn z=`(w%szu;b5TkOpWyrG*=i(`i(5LCyRu*ZKb6OE%00SN zc>Y;t5fdUW;0l-f;|rQ8Q?u&zOn?6p-erPf<;7U z<$wTY0_TQ)P!_`fNs=6?Me^kjHxqDf^R`Q})$^|X-t99dC{{ybCoH?0R@L_EeQ1Gm ztUCOUgT^e$D`v$v{QWj%*0_--F(jO=ncvw>(3?_$Y@0pljZW(gQdqpx`th0C0k23o zTGS2a1HUQrW_(*Q80au5m%IGTQy{#WJNlh|{ATS^_PF8kqmVDEHSbC`?eor`eY&Mr zpL!G17da5-396f{aQVFud3^6~W<$@a`F+C4+CfG{<6SS+8HeW=Bh{yu@d1Z@Z31jk zGE?EMZnfid@?mV?U_{q|Su?XGLnM4Cf~O21#mdt6taFhz649|y!*gB3A;PD!|$ zor;Nvzfex>GkN6Z8~>-ES)$8rjX(N5Ecn8nhEWRSmH(na78Es=qydpP4h>k0@xt{f z=KWx0DCmnNua3azJ7GVeCN+MhMxo*2SMaU0OsI=JJzw8FSQoWZ42$B)lbg{`U#x@6 zJ4sO9pvM^R>sYeuls1W_k`xnh#~Av5Bx(Mk^IB8J#n5J*ih8r`hiTXWpVG6uYruIC zyL5aCT%;ply$JrpWJ3!qgAqP|feOj1w#ISA`*Vj&>RkVITMv z>Rp5>5&Tl{mp{he*jT@ueb5`lM6$oI`r!FnF#1LP1GC}_M~r3688ck*{X@&bHbDH4 z%{24y?^-D~#2e$mn>PHSZ!r*w8t?Wcu$)b0)EyzU{Gk8yNp1$m0TA?l=-KBAaK~*y zd?#tZtga7kz35^wF7FGQ9>Lefm^n4-0N^8N`S-wYN5?z9Km2bkF(Iub;%G?zJ_p1f z@utiCy~6f~znc*H7(l*lLzpv*n}x*5_xKuW>Yb5zQt^F`f>KuAp+#ZSD|Ix`XE0AWQSuSx>ya&KBw($ggUUaQD}Di$f4lq}PIkwyuT?;CoK^XcDP%UV^9Fz zu@=w%LYr3Ln8_Bm1*)#Y|CW*mNh9#wlq{-!L)(r+Q?HpC$$7I^XB9#P7oVz!|HQs4P=l0(5h$IrS`E9YB}SUhoq z3CkSuZ+2fDB9)%GKzEh*qiW!!q-+opoBM*MelktZabz$>|36d(TKu;JLqggT7ed-#8g~qkLU) zYx;W3`MDvVw23r!u0An}oVxr@6K0B#dDnbb(M$xq!M;12<+0|x?WL}62%g)dN)jqu zYO8#e%Q5u6UfT+)h9JIYuD-NgJs?~p)tsUDL-6Ry!HMXp8ZdHipcHG>^Q?U5`)@w2 z0}dy<9o?9+Wnv=1ln22hIS#41sI&vAzD3OQ zr@$7k(9)OR0h$fBjDLjW;6thQ*<3%@2V}|Ugnd)C9%kCI)JKyvF*Q`DXU%WDzXoOn z^&l#lDCv6tM^gDeNs)_~`~M_OjDoW&ZC9L{^AxJ^09z|Ho}arDVv*^?UUZ|YX*+K} zXT4W~J2VZET8K^-l6>_j#^LVxb%km`aZ0nL2+>=mg7^_vjtW#??Kh{R>7&B7#ESMl zt`pECbF>ci8}xq=Q|C6-F-$|2`A7-_bI&LBbtG@1l}5G13?EtXFxAyu5r{RMS0DN*pUCQx+IvOwR!YlBZ=;Sxq!Lm zB@eRDOO1@DDd{k$7~Yv{!1w3_X~|FeS>{U0GOy-q4|)qHEzdg(Z+k3F$H~MN;gN4o z8_w-NHCEe?-jltPFah(dhmq`v^KPMXU^ql<_;mAZUP-icFFpXVtQS#eWiL8JVCw6P zRr_=#S^s{n$oV#7Yiup|(8F__DrwoNV1S#rM)mNB$p3YMu)5Xwhu?IBrc0?`D)pi| zS5M5GPHJgXIb}Ij(ZeCW z)!3heH+yME0O*?J`dSb5^T}89+fXqY1T_1Ur(S#D1PPxr{s%s5$L&q&Q*EBeqBeh& zRgj$;FwzTmi+sb9kC|Y!{zrX-YfutXbuF<>+{@$>8;`)oPcZ~ZzK{CsB4R`IbUoQH( z;Cr>VCY};`Q@JC|Jp7eIoUQS)g&E^-nljG)W9F28ZwnCI*JN7_HcuEinC384p46Gk zd>i;!UzHfd(tct4bs>rNkMOeL&M*HEy9hQs$&>Z>uf-=yfbCL3=X0NtkMi#g%B z?lFl1#y1hwv1jf)qqNsO6A>@W$9mWbHCO&WypqcHuPEl9zmW*J>gh;=e$aj-(PEjm z{m`npe-D1;xUps8606a0gqXu8vGdnS04LY*Q>j3`Bp@^rhlO|xWrA9?FCdW_BB3Y`R3>-(HZtE)8fs-t?KXB_$!*3RI2|!qKd!3xID0vjA+A{)UKbS{bIm3jQs-1 zM~NKOfm)OOhR1b+>zV`9GJN19lT`FTEpg80NhSD6!k@4h=o_L%n>NKHKoUu5W%;~K zF2rr`=T|C6>6pmk(4dy?1BJrGV{mdspQ2tZGebP&C6vE?tbQ`FH>Yq}-Dj_G zL-s9!j{N^((@?-iTbT)BqXpN~ZVH{qcT!7Sz8ZnX`ff}Ixq@!fdIOcMyy`GWgqfKN zlrJMe6Rr~THJxjWwZmy_^~AO@juB(TAX-Rs&1T*lXE*5R*G zR%Y8psW+ z82D#=Sw-eXSVuUE1?3MBpC=*1=o|W1sD8;@jRwo4BJ!Y4jVhT!EHog?EN%uSQ9ukV^* zxTnZa;5AYaZ?({|ZfMB?SR%$0(hPWaI{NFXNXgx<9_NWvrSIM=oGsJII zo?IP5TX)t9DvQrE-r5Kn{A4=jDu0m&%>E+H{f`AqA3xtbuM1L|s8@Vf`T~36ukQVu z_eGMWgJjirb5tkfoP~N+d!+nkSt65R3Sqz7tBG?q819kzYDTHtdFLDM8q%?#T~ST) z^8SCM;nQ3Iw~m$NYr9&r&kJ#+k~o#HzY@PSsLVVLNlhvL#-(;YoxF6_-fVved0cZ;!n7m&vV-mHmT^0-V!dz@+(WC~tb^G5ED-X**lY)ncI zR^!(7FZriypp37KOrqP1YpnLK*>6v(6Wq<-m)=^s{$n!lqE*)0~sM zqDBVFxvbZ;{iRy5Ekr8*6(o@I=0p3-Gda4otg{bt*jlK03 z5@y}NWE?U5GxrOl++u+@3e>LSy$PAaW8&2*(?iO~A9AFSY@~roYQ!h+@*w3Z4`&uIGzBC!zNXkE);h8@!Z^{4C4~%GOK6 zDO?0o^+bmMS_CRZ*c_R*Dx9stm`28_pEj`XU7a!Z@aY+f)!Z{q(Dij2hcHZN z&%LR$YAu)}T|^J#^gHd+>r2JlPXVX6$aF3ovyo-Ut+z=h8MH8vx)h3hS>!K$o5;J$ zLCMw2N}c)sJC=sZqYsFLF@r3x?2#4ql-!y;uLWv?J;+|XeL-{sEmU6w!WE)eq=Lv}f|GKFaM;3xg6 z6`Z+A$0I3Eo`F+1{Td`IoYwDE$c}nmQ%D|s)Kxk3fRH|fUmW*{%Vs|uOoMA^#O8N` zTVyo!9qC5g>VKnCOB#QONMA7~9urLVr1N|LvWx!WC}ZH~OB^`AkM>q0#3II>emThb zl+T=C#qY38#Th?8jr)LWu$Yk3ygmv6>f1C;8^MihGQr2Qy({!lJp0gTdd)=(wvKzj z!Ka=l^@p^*Zv$BtS{t5S7S&?Dh%x2rn0(_RE8W@6akkSR60%D6&gNHUYHv4pM~FLP z4A~kiT|F!QJ~f9;T-&x-_K&%JA|KU zSlOGHgQC_gdj0YH--%bqdreI2no*!CqQAPD`JVJrv%uc+>8~4f3VQl;&?E-lo)7%m z(x-2tZ#IFuj!DlxDirq62q_Nc7Rw%JMY3Of_70jnavN{rxe7BZadx@JMtO2aXxKjK zmOU-)-PTqq({V`W<%*fc;wTlnaZ%{f3k!P>fagEGFrUK6Cw-;i^d;N7^Q8i+%2x=_ zE8182GFot=b7+fqf{s2OV>9df5#m@tku;?4{^+KHk(*|5D>7`S#-6R8Zms>Iwm2%aNErlQtAE@F7HatgrzQcD9 zl{hrlh}$|Z2dar@Bj0k2CWm1Ey7(b3J0LrSx20P5bYC&JW*wT*>0|1`c!Qm)r3vN~ zFK7MDT^}%>2GyE^CEqc=Y4EeDdLA zKOL-uAko&Vl+y_jU6P!sk#eUz^sC(WcBze+gU?&*eUBSL-p6mBroWe`rPp*xtlFA5 zDJQ!=X=5MW(eo3}w{A||^4SPqYS-F*YX8mid$Nky%QMAwKO99LvyLxa_3dEl2q6QvO%i!jjjfA;Wr{BjN<-4ZT;F=+PM0m$Ub!e#2ZXor z_?H*I%OXkNNDV7~RO0QQWz?sjLXMvkFmp`ckZGr8L1;1Y7ZnncFDG{Sy9?+ZdBhS1Vy35p_E{{zvy~K^Eu<# z>C`pH8B`?|&y4P`A4x&wOXbsdqZ<{ZE5eyuST1%2l3z>dMqInF+|Wklt3is<-@&qd z1sLD14sZ#`C{Pnqep2T;F2b)JcWm7cMAQvll$Uyn(WX|OAM)jV# zhUY5_gG=U(?XDxt*t`x9TaIcf8R?4R|F(njlz3-FBayJy3oQTVZ=fyG2b8-F&)u#_ zHzg>y|4$!R9uL+2_sg;)^B*n#qaEceVA`kJ zjmgM)=_rZe!tX%8YCz@ffRJx%ZfnB5N!vUQKRDSjuirKrP&ohb_x(?QICVM>J}_1N zrv*a;JJs=%E&v!tds*J}F?^J=kB=}3sq zuwH+C2PeF61w)5{CmjE405o4Y&$D>O+%P$clIo$Sue!HYilqv03%S(4m{2E1-76n2 z6o{%d)QixB5FK|DQtjRSbMbl_7{)i&{+VRNA-P6Gv2 z4m}=LCE(xsK94S4ySg9Iu`=Lr*W||#eF{U|TyBynqlB2E{doeF z-!&~<^Jx7qrH~^2f2f0EpNRdQFQ(1EK=5!i%Ki#kYRal&YrGrz$7P@s7VN47jNnl3 z?>;3S^sOq$&R&@6<(!$nkeoNkzb`3Sc9^??pUWiw`aABYQErQxh-9EzC*x|c=2#P9 zR}(=JKhZbm@{W7Sfj9&)p^&!9-5Gg45bMFJmk-z$Dri8NmT$;noP4jnFuu+VqRGagOCNY3&boVh`B79NT*;PLx}b0JDVrKIatXS%5J6?ZE%OB_9|j&n@B_Da>dhkVdsjm ziyRAK=SJD4TMvaknCM{M&{ctdJt1Tk)W$AT50?tct;wwIMFOzflCaCU2J~zf#+ENe zYjjE~j{c4QTq z;YL#x{(X7ssTt=TSwYK{7ab&*%fiP?k0bj$$CkQw8`7AUSsBr9!E+;^jNP^pepXM9 zS-jX0Lnziup^qB)*B1FdP}gI)*v;OAjyP2_2B;=Uvw1Au)N&_&KDul`E%QYec6Xh) z!1X=S5XK&ss~XCogG0DUu~-w%^b^G%Uw!!^NUTrJbeE=b6BTi-PC`epF(`WFeF@?M z3(bG)J3n@ZNMW$KAg!d$iQ>ZGPw&F7Dhe0Jts?4gZ++v#>~dy}n#|v&d8BfyVbNlK zS|CU8$cdqDkgBfl{+n2`!Ojqa&y-(kkf8-8_~xZBlaXx=`2KC4Z{=I*do;sgOQSxc zNY8v;*D105+P{v8n`z){41qJ?pBrXz zsE?w;!Y#bGC^`rfqye6V!y5C)4G*~oW`dWDy1wEMBS?c8Gq3Elq=^}Fa+vJhW`tNSo#H8Kj%yq5hS!vexe0m-^J?N;U%6}61s&|u9n+Y@GVBWm!O%je^b zq1c*FPm<=MAmD*KqSvym+wSSxhFGwwz4sYH1wqb*J=K6yL%pfra+G^ZSb95{xq-gh zd{ZSXD^Yy1Bbz%xcee|yt5~R!YP1A*H6BhpnEPn#X);_3`B>mQa06&Xvq4-a2rU2_ zP=iw{30^kDYTUwElRR+Qqf}D_-8)nV>IT@zjY-;LDwTZL;1Y2s)C&}ZKpIR*w({V| z2&pXukb8f%Qr(Rl(riQh0HQN7O7G!8F)=YU)(@{AhW-GKA!Y#|fJi(S|IJ*)C3xWi zmWq26g3=51-PjsQf;cy1xsxGO+~-Uq2-@C8lA`+|3ALq;_*#$SOdv$`ju0__ASjO; z7(wyiWvCwlFm^!YL;0$@6a=#PE{Vyg&(KUV42*=;s9yV1%iqovPF= zf0d*#BV(5_7@XcSOYlshsZ=<{j4skSzwN4I2JY6g70WHSI;@fm{uYTc&wHBO$>Uk{ z_uiWf8ZhqyqnbD^Zes0FF@%O@DPsx)`w&DP{ShmglBN7-k%ep|?6&!55v%Z%efiFU z*&ru<1kQy@J8F&qvu6A4|*0-iq7%a;mS35%P3FkUoh5mThbLRE! z1a-Xb_Kp*?|8;C6vhfBK#-^+-94FCp_;Pa}v!gOS0<2DjiUp z^=v@-m_w5^60Rn?_bum)Ohh*v5|e-KZI&MGqPrfrk@}OS>%a=)jh6WxP51S=pHRWr z+PW4Zr~Erd-s1h_E(SU@%1%7Y172A*rVpe6KbMy;LHl6?6L_PcV}rw7$s0VI$nCR; z=xVp9SBDWO8iaU$qJ8My%6M#2w zxsjFEQjBndi>s52na!I-+U;Sz|mTzOw_~M~SXiTvlDXTSBbElj*(YYxfyKP$m$v$n?5=yQd{iJf++= zof)!_OYr8ko*B+wgVt}*zD2uRenlNSvgKlLNu>pdS->v)p=$r$Uz<2ekhB3m_EZ20 z@mreEe9({}jqUquZ+7Z#sNv?9^s}sUGT~oa4P1`XVzP4D%5>BsgYwx3)hEA~d=wmn zA*-?$#(T!9KkJ1rb{{{HaV2+<5G0lE)2*4~MOK1McXw~9Om~2e1b*pwpd#J`=gVa& zoVH$0?#*Cu`6@Nv3Re zUF&l=?iO1=*Q~efnkwFsi$^F;I6)F3vsw{{$?Sy98?^X-*v?4>mK;!LE7%P5#^WCB z={{tGM=H_l$(3}<$<>)lffXymQ)aV2scICEKD}LLqhqsRF!ZUL0swY`XBNLYvJ=2d zofU`q9HX5S2y#30+f9u^lOj35p;IaG3sEf+vC^u^YZQ33!x!2>7SLLx&v@zrHNt`Q z3WT1OCP1*6Nd$lPj`*(fz2_7Mb_!!>RqOdKNWNk6In}{DQYE8s^Zg#@V7JEW*5>_m zdRjFH;?9{1oc!cV@nK@lF~iRMx8C_V2{RQmR3}uSHHo!GIg?x0EoOb`@no&`g)#E(=nJ2U;2EwaC+V}4B z7v_5{U3YxL2|S*lVuwi)R(lXUIDfk=V}rT&p2W#>h(L}tmwYub$ z&nyNamWkM;D|lBjE9_|=<7ZhTcQ>qw@aqi5XQ`8)kY36e&9&VxqYfb+sYvRVUK0~{ z{MIH+cv`pU1{^E}pgze|L2S zth=u7%u?Z=C)ux+?x;M`1xXVywK_xo$1w5?kb9FFHSwV;W3yohd6rUbG?ap;VgmjC z$c~`_lL`9^KLEh*3KNf>p0%#VHyujU4-Q(l>eI5OQoRUK8XbA&OEgTav^|12kDkGD z2aMw&nu`%#k~MT{0336XOfm%i7n(y!rJ#WI|6Dl#0f_f>odQ4J|Mt#~cQ?D#(!Z>q zLg3bS6(UBA&oezRK49DlQZ~O%@745uVmOLl4N$wtARX#9V!AG~RN)@xZ}kW%%?!mr zp=x0L;hO--R;NlclP*bos-^LhJ&k}oW{4zi5Z;^;@9OV)na+bC!Q{;#jlW^j>j%Y9 z=pW^FZ8=b*jFBku2=)F;g)Nv+xoI|>Q6lt*MF8>p$vOw~Q=S3R>1&BCrCJAVZ=o}` zU72%EkW%3s*$LM?-fG)-sknV9TdlYh&M_xmjrKkDc3Q_qSEu|WJx4}ZcClRTc94dM z=GY14V}6=7Lx!+x3?9r1i9W2+l5$CUds>&Nksxr}6}HTmdTsWGf~m(rwvyWy*mu>- z%%3iTx9eA^=V$5`oJa4?70`M8NN(!1_n*2OE$0c*GXS_n_FT92JCbwbSL8eRdqb|@ z{`w;RF6T%-(o1O`MA>GquoMlpT=Bk6`4Zs+Yux>Lmnq2WO*Fu~o49jrA}ECo78gaO z1v;8>7WE>?Q|y>%h@kBw5R5vEp&G-5?m?BF+6Fr0sh~-iI;?T)+*uVSP0Zs8MH~#) zX!WrtjtD!^)1)@DPoMUFuaA3m)Gxa}=KR=0Q-LzZ1IGR-{d#_9p`3SJG}5bH9jCBL zEq2$~A}yog6`uvJt_=W^t#F_(d=DK%-{Iuu`l{?NHg@Z9r|^4U)nU%OcXHzC3X}Pi zzWn=$8-QC#bEfecf3p@Q_2$dVI+71o)|&L>?~7Khl&jJRIzPs+wA9poWsh(~%+W&g z2S6g&J6iYj;)s0bIwKY0TrM-{JlAJKX*tu6Zl>Q;K9X+*jf=o5_(Q;-keUg&k;tor$JTx30*&s;d z^f;Z99O~lJhC?kx@T zGHnzF`YxHb`DC`-mG|Z50h<8IDLwYHT|J-Ud3zduzc)@(6yFxt8FNIBLOmkIm?Nt` z6P>M|c9?I$b>$tNz@oF2j2mSI!^62=HA+jSE2`PLYu;S^6+D#?TgFHcmSFxv@BSz8 zEX5&v;d?lT@Z^gOFq7lVgobd3^w0#MsQs6#rLU?DrSMks1>h;7#m9O9K(q+-#|0oM zw`bCgizekrm$+tj{rLun57(wr^k9Ic{kF%!`fau$WOm$yJU>=cad4^ z|NSd~lLag_t`AE|wVDy2_(ZQ5Qdsbjs%=GA9Os8^wiU!mnT2A2*EDACw$pSAU2w;x zHnvF(&xp22@%vSab}jF|($BXKV!4Tt(c>ZsJe|K{C&Yus11+G}208fGoye-!tk90A zdv}jyev`sJN}6!;7>d%M>Vdt7zHCi9)4Y(Nww*zA~uP@NYFBpBXcmM=Db_iV4J4p?s{U7+SS_bz&MSkN?H zlvqIW&*0@J-RJajiES0fh&8|lOs-iMa3I@kRsY;MPI2ijbD@yAy zQU!7``BNAzt<`gs76e|#eyUKW{n=e`2kWxhO+z*WMjUPrY~`ekb`c5t$0-kEXqY2} fpaR!`b3}=Z&QMsCyYhz+YKC>YC|n`Q6+!-c&ta_2b8nzP`Syk;>wsqJm%f zpZY)6i9ymJA10yC!P8(`TL3T|QIVH!0fv){85-He(UU(;zkTXnXMMAEs_Kv; zUi7NAqF%M2rk=H6eD@J)qBk!&K0hv*ku$0+Fm`Zr1vh`|fqh}ud2OI)5Y7Lg2CWZ# zMBIewf&t_yweWJW3CnBhlRbt3TSUj>ZCXnDWG)0ip2_ZTZ{TON*TDcFsSCo;Ab{jl z;J=^w59M=q{a+$rKptBd2!o;?2;a&PqPl-srVoMx@L_!91OuTk0WczWhlK_OTFa2V z6BEC3rMoI!?r$?PGWhvG1|YBa(iKlQH!*{Xf)E(FyDOfK#|pISJ^bN{_W;9jV^)+9 z6CLniMylKm(p$Nls$v-nhQ36N{&}Tw%slpOym{<8BdTXY!L)dsaDZGeLn3L!CIkX- zsA#4kH{x}|5E_LHCzHQjV?!bQZ0JBjP?{Lfa@uPc58*-szhp3v!Y~030p#nw{=;EK zaE9+NO-%2D9XcBDjC>XNLBUdAH)YNT%c6e;7YsrT8>V9!HQzhYAQ$U|IjqD?0VMof zOY4>1DC=q0p>XT`gMgtXFO^U6xfK>ea$pL^V=$wm10QRVz4F`A+nxNc(3t-HFF__n z@TjUI?d^%6P~aJH(-p*y?f%2)ioY%_!Vd>fCVKM=l6N~C3F%AA36-Hn&GR1Lq8O6r zZ#g1J9P^Y9V0d`Ph6Y!f_po;RMy~f>>v=ZfUvp%C?X_dq ziE}Spuyc4i-ia>c9e^_Qo-{`{48&S9A5YtKKutVCdzb1c04slUCQNbjZm)18tcBrU zcl-VZ^1KRU<&|G=r!#o+$b%Lgr2)|!OQNL%Bh#X7|U zOS;yjNpB0Woi>R9{@F!@2B56X*>xJ%KC`FbXyz9Ji_%}8IQDK4Y;FvR6T$w{<0B!! zdwkn_>c-HUgWq5Bv7mZ=lc+4TNtGp?JK!4QY1es9FtObSeb=+PEDgXpg%Q!7uaOnM za62evd@FlzJJClk@wel3eI5~tJf);XnQ-E4@kd)TGKIo6bb>v0fr|1fmQtWd(VlSk ztPiC0;v*E%iM+uFl=YA*(SroJlm=Ep=#~W^-?h0@?TY{mMs81mCpz_3#l~Haw5PBP z1$v)E8r0_mG;ackM_>M&#;?BXUXGeG?El#wOzjqm>qQGB;E7~Fni%pV2Z%{TW6q5G zq7Ad-ZU}%aUz)c7PwKd|<+*ufra@X~6i8kxh2}*EB&go&7J;O_`_k*!@YIp5jfLh5 zl;lUbS@*B~0^9FbFTZ_T>TJFN5Io=ePvZw)m^9(<14#a-dg^#|5wj0~Em;~o1nHij zCNjbXc=YWOCDc2Ae*i!{w*v;Y>DAm>b(Oan0ZP?@97(jx=eKdHjR1czeY-uyN)syDp0Su$^;=mJ0aDSV=MF&ZA%6M~l@dN^7BR*`? z+hngw_g)_?PY!m6qXEk7q68?{^lf)#ZE2MadzvlF`bz)^^!Jk}s}xWIzn5FG4SZ-> zG0}k5X^@uxu15vUaBTOf**4W}hdKaHy>^|ZJ<>wD{gv(=(?50)UOKRW0>nXW<3->% za7nuNg__TIliEX32tW*fj>hmE<(FFTvrTK18()~6Rnqut1Bgode_lLUIX8E4Di%qn zu4W{se+cAp-Le&f>d}i}P3NlXTn&6_iO=5x&cx{XV}C-Oowd|#83 z`%B}}FC9Q!zE%>wTP(g6%~wPMcKN=kT$kTjl!elZ}I9$-kk-!0jur=0@y zOGM~Uc_T^-m0v`VgQz4z!>%TUy!N=A80MD!4-rT(obKQ02J zkg8m4bRXCPNTiGbxS#y-Br!|c3<*qd?Nb;s3hkX0{_#hxwWT@?K%R9BubJ@%jYcrcoCk#`1s8f*ucUe0F*CN1$Iz${5j}l!vm@xq%hSoySYtX&dnvA zS4zQ>*7L={YjdQTfr*K! zX{;6%V9{HP<~ETfMj|BCFO4>2*EM5&BJ}*h*FJn8;;;1gKzHvs;V30Au+W>`P@vd~ zX4)QqNha#np$rS3>SIXI0OyS^T2zq?YIr4q5y{`F6s>BQkpbKqNu)|=4ov9M#(gwUe_ zzO14fAVGJ@UGdK++n8{gORd%_Dl|qQ592Wu{-^w{Ww)qKI3jzs%YkS@v?WAl3k58= zEm(kGZ;62@tXGN(H;>iX1`+NQz)vg)79*-khgihcVOEnthg3dOG7#JqhatSlFcEYS z;+4RN3~XAZ3PDtpB?tL!NrMj5BdoB2Wbk!@sLE;=1r#2F0N@A*VCy-ZDlAQ~3Lt&z z?vK5Nfu0xszAzVEqWF%Z`*#PT@Vylv@9UIsqL#qOFw+g3iWE3Q%mdb?|48A_-}5Qk znreI_tG;7-UWkte*CNj&{$=!L(hC_Dz${Dct@#8GDC1r--b`hf?M4-TlCh7$9>?nP zHlV8VzE$};Hf^>$`$B0%LCfrMDxdOeHWb*x8EM40m1D901^p|5{L_e-Z9^FXr7E(NCPXb?sJ~}Xiyv?OgL&jab|FNeUAP+nct!t@%VNL&4PG|=7v9^RRn!& z|65sU13g-4Fd+9<5su1?Bblx-m(jJOwc)NY>s+?dDYIHT@}BO6?>D|`ym3#>KprvrufDGN zip+lI^-L=89HQ(-59YOfs45aagYdYFzc>S|SYl@|O^adL%z`=m;%WH}QLdHvtUgnP zFzre?1mIB)IQ~VS-qtet_PBeelHB4%04FvIU=xh?J_sESE$93rb&o7=JGhPDT`<6y zzCO0v{9bFwwPxRWw9-JWdGei}(u6%O+vo73Aq@=s@K47uc!JbAn2%#lZv-~Y5g}0rZqiEG+p;_Et_L6d&fZR6Kl(-6gK81~mU(DGP=h@Nc;yn%p?CMpn*xQ{c z|CW%0wu$KM_2>$J_gcREsYl(mNA3?0LEG7vadO>M(LM~Krk+Aytx$g|T_7gd)n*a9 zrA8z!QY!RoaS3ugXq@IG15Z8$AMSnn0CJ@S3M~RhG^c+BQzLMsZJdg|pS#_JfYjfD zLwKKL0|wZBm03ZX03@M;HGsOg_chGWN(giAt${AJ9E^RY({u*fNNh2~mCw_?*gCW= zhF(mqsJ!snK2(D1X%}HU=GXz{NftJ%J@+`STWzg7Yv3`2ujyTOI0Civwe42E(#B)7 z5ZayLx7aOp3w5=F`Y~m4k8rqx6=sM{Io^1>!=T2K3Mv1(X95-{4n^d7H_j+uWD<_p z^XBOR)1NB1HW@9Zun5c8XL?SEjg34RE zt=gs(x4`5*QI2bv^q=x}hWuekCKo6FUaqHf>t#)x{fa-P-%z1)R|F`I{tN#B(AMnL z{~E@AXONmiukp&ro-cz=d-_8zQ(`w(ru zTjx{J7EL@mBEa+Qfp5dHL+W!JAe-194-*(kbY6NfX|H)}kop*n;R|7PhJrUs&?n^1 zvmLZx0HUl+ZFuSQd;-KQPaL(>sKrB+;60;v@?7ak!T}iJ0P#a8Cy}W}()~b%S}kVv z7%XlEF&V|DJMa(S(?*%SeDg?z3hlR@76EHIa>AwC4v+o2L8imK)m@Xzd@Dq{0eF;0 zRIXZ4gxa>2X%YQTI`W>1p%LJGLUD&g}I05=o4o zq`?llP5_E_n^rtz=k6?vEa}p5PqKM}kJz$=+xQoX72L}s=~twI5!jGWV^DHu2bJF) z2HN*EM?kGUe|`sct=4g54#2-se;M=txz$@jHU6tvR4D3xV}fN8Ps9;TwGIFC)4`as z3jI^z5;E`}4KSqUV{b;$i=uO0?i+4bu{hFMS@*h@(u1y(lamcEyc!x_1V-I`yl*}J zhvwIW@{(6i!`0`(mj25?(Nef$pUNHMEgCRQ;g)oo_2*ro{Hm}zs3Hi^6m`2{5fG0u zD544+BD@j;wBcn9i_ueBA&2L&W6TsqUDjt{Zc(?`0(y$ZqD*i--52BfKnOsDZ+FJ7 z-hB7I?v6U@;wxs5<4Y9LAc#q-u{^?{Jjh-q^<@otL%hQf@sboB0Aj4y#jrqgEMP>^ zZBt~zJdRoz9~cn`hKGOvf{qHE2_@U<2m|3Y8sMRZu>nW5=FAetQDAOZ%Yf9VS12)= zE>W*Uh>Tdv&|QBCL_Pobg`t@oMfeJVPLxj_jr+(%+<%WW$Dsj;^e7`T@zlp$kxg@Z z6Vo+ps?X`CUIPGMLen;_@5D1!FH!dI*~@X72ujLE8+nnBWDii(nHa&v7@J9?7#yKB zuB(Gx{oXD}gNTU0{yS<VQ~m}B?wxHXBtNsXAn?$a&8eMBNJ0S&m)w?NjY=uR#V~|>Ry(s zKf2xJyc6AxFLp*|ZLN^_#H8;Cyudv`_77yuCFRRG(i90B_N>KZOBufOi5-%vJ?QKH+qKp!~f#}}P(c9;__ z>3a0%{sGZO16n;RUl!+MXZeK<4XO`s5ClvYV3&($X6br-&N>6LW>n=i%f&lW?3&n| zbqXK%Y5%`DKw$C5S~O;XY|T-E!)GfZ4DT3a3AwcUdP0k;rp0+4&rXG6*%X0&L71Ds zsCP|^fix>IY2Ln5^WesD>=$Pb*R3qMKGV(Zw>7+Q!T%%rdh?E80Y|>f@6_#25m5i& zoMg2g_CqtV;jdx7$=R3?siIf=UXf43L0oOGrw>N4-h{0B_zHOp<*zbFxI7nrmH8hV z1JIbq-8J&#vMVC0^h%^ln;zP{-C54Vxh@W@g}|9OKJ+$(DrwJ4HZfZT@$-*AJhlop zG+N9G`MD}gm`xgP&TMS;dDx8>0AM4Lz=gKjBS>px<2JfTdt%A@-_jFI2uS6*gE1X$ z_o4QV=8oe%Ai$wqmJCqK_BH+2%K+4aseAQn01#XAYIx$l~+dS$qRf7lR@;N zY|vTyY6xtR7glhB=6+QAIxOnpPo(4KG5tRaz`_G6!T3})GETrVlP1yvP3k?=KO+a% zMpD&z<%-yb)SF}UO=senn5p(-wl|bsm>BE?w9mp4S|mA6#i$y*d;ZMHRoGaT4QB{) zK{lE`2ffgCsQj-jw5tyj*Y{uvjn;MG*!YCli?~WD(-i(Aq4!Xyyk7s*6rrwA&D6HA zMXp>l8ky7cnDWo$J{wNGwI*A6voq-)oEjcgr8bdhvklX}pImdUqp zU`9P5JUEzW#fEp7SO~e$t}7#1-=4mOdw($bYlP$Tcj}?A3J1p45#>{znomHT7I8zi z-liYLj(`~|5ZO-N|4u&#Bq?WRIX6EvjAGX46iH!CAF`(oZT{qQUik3U4gbM_`nJ|# zthPkMHA#Wmg9TOdD9=rqoMLc0E!PfX@pCKOqsyl_$TuQ3FqFQ{-yEF(@2oYinU-7n zj)VJS`uz4b-aB5^WgR(|411%N6axj}RW+>IH#w{*-X@tmgsGSDA=;TeuBx0XDv5Jo zcXWT()z2bo9QTem#LNows z^9AaAw!137y+vhbN)V9~Hnmw+RrLUUXE#79SD3}|&^H+;iRv&B#q#KekA%I8BUAqB zc=$VfYUw*0E)dbHAz^py+wml3CDFK#igQ`0#J9qLQ`N_#>DaJPq55nk zTk>rxPtdR9rG^WN8yLySa-vz@B@B4fiJ5y^_I6zg)!01)3MD)Z%A<#G0RfNNF{?B| z>{d(wE_{}|LQpj<7^Gd*s1fjbhIv^CovXUy%Vsd@z~`mgOYh){2{-=?i}%f8d2=(R z5EQJYn29@6{cBxF;GCc@$luX#EGHf`=@2oz0wDG`r4?|_cVL*>XZ+V3M?&Z`B<1?S z%J1T707CG6I9UM3%y>9&<0Z$k&;(aY!RLHBeg*(8rxV9ZsGKHAY!>V=SmFqmMztj? zF^GAwpQCn7#$}<)Bv1ExA#Z+SC@|8`%<1*bE{sGL?5mBUTQ{l>}fw zcBt*KkCf7CJ$BWX*TB{-6#&dX1w7UW`XI(%9U}rGMC16#{_z+1xik{xS%*}XFn|c^ z$tYlpAM5S^wLB5KtZj9G$Gpx_Z)IP>uTO>?9YNqXg3{-Mt<$qMa<^mdnlw?=3AtJyo~02eu&n>qtY+C-Z9^ggdSlr z=dgYG^Zg}OgnsV}2Sr8bNwdJ*vPmR)Ud@brN=HV?dgcd87&_&3-*lz<&n z`0?#1KgLEgD{F8%VfCnie$PRhV&E@2MF4&+hLe$8iMwy+TYL^7f?FO*&Qz_DZBO(q zsuzD7XDyAwxI2ESV<%6r1Tf)NdzC8joV0hyV%I7)&yrY}>9m@%Fse}E=sCV2xBZi4 zzVSmMH5Lf&53(sT&mEDPCRQwg|vgWl-qBJRoS zReS3F_%c3n+2~IgPLlzRaiGNw+B>;BidlzQ*|T2V;4$D;BQ&NJGxttzM2*4(lqdeD zy1n^R*Y{jqMealxX^kf|qw7<}VXpI|rR;&@IzHRs$DPL zqW@Jgkvw|?e0r9od7UE`8ff>$>02G?RYH@Qb((&$Rl@tj{CbY6MJd^hckTtzT5Cs> z+#0T$K4oAsPlw@;r(Hc<{vOq$T2|w=-1MBAj+{5los+*Oo(~=T-F}!mQtWTg^26&q z!lOZBRC7P{sCmDB@WQsggFHg&1@0$N@;trW*F;uRk)LvFsGZlAqg^=DP4R=|0+?|4 zTB(>MYy>{k%oFv!3n&$#-RC`hArGM=S>(R|K1bRJHU#soi~M8@b(oQS^C2$8Mpu@q z@|&9f#mh?af<^w6ds_!iymcM@-_>vKHQMJ?Pd~9gy?bpIp>1sw_Kfn(p!4(#_b2Tk zI$ah_2o=tx!%t~ugUfyHqVhm9iK^sF;m|{_ zwdOC+dQ*C*6v$N&A1E>%xVr5eBN)1IdgB!RS%QQya?#iJhN+pcQKgjYbz5(zTE(Xg z?t7s-Ycu_O*H6FH2aT+rstj?6=?z^=YdZT+y#@>Vow!GRP3i7K{a&Aag#6`bT^s(} z^=?b5^8_~9Sl-#>uV_2woY{RkktD?>Rm9p4y{<+5yk0?v#~=|^nG z=U5(ave}jV)((F5v@32tr(PlUw7PyG{d0ML{4wW((SE<*d%Gfz_+|f!%frK-%3cBPaVSwbHEq+QTwkp{o|)D7-RBTp`Iz+ zEnIzbp!8XOm_*n~!^5S9ovOqm%NBzL#({$DdEC3#J@%Og!*V;}K6uaEIpJU%QB<~x z{u?Ad!8cy`E>+yQ?Y6k5R}4_$NKwK{+1NA-8yQ^J`@#gPR+o1O3Yhr&#Cb1Iu|?+- zuEO(lN)k>9dHNp&7n|F9_ek}H(}IoVUkvb`y;-%*^%^3}!eQok%{U31UnY~fzmn51 zW$I-c9=k`r`q9BHiwG;HAEgBI*|hY-jGl#A*Zw7PARHXFc-l1Kll~Xq*W?~*Pdcb9 zN7r*TgRR|C7e89}Gop`W=2v;Nrzh`eAAYg34>&z=O8jvn1SVIXnT)Wi+OzsLI#^g; z^$x_^#9+ck1>aw+cWAe5OFxO0-wSs-Dl>VX2>Guhn;{${o~-|TR^Shgr<@DzRdLBD zr}O83#hSQ`TFUx6Z`-x;?w8^#j{jGQADO;Ts@Q({v+i~*o+X1!KT;FXiqfRXp~LkV zN)KuUs~%pOg2JELwg@&QRQ83cq4TF>*cHzCmv+DCq}_<47=HEiwWgHbaw z9RyaXicvbJrPwM;{D2W-L-bHb8V}`&@peXI$(b+Mq1#nH zdIS&1H%{S}f6NZo{cUs5zZ|Br0XoF?TmQk&H=TXVZS#wy1Gph9wNf4)&85K|*)iLS zr`DW3zCX;3CsVEnMyHtWv^i7eKhB|m(9!>T(S$|J1yAPi3<%+1>u!+0sQv++Q+8G* zUw%>`F`mNO4UrelM7L9CS8*&-dd2Yr^MrZE@S_pJo_9RG#pUd#GtzjB284~gP|-$& zp{!XJSsM(+8xV6D&z;#iR@ZIlMXiZJ`I8CLo`15fGC-X^n*O}MU|%vs=wHZ!b8a&! z7vZ$UbqU5wXAqpr;j3TYP9Z!NkNpNSgw!ag8(*0QT>}k4E7e2}>fCr3c<+9tk$2n82!4_tHNsepmRZ4RIeVr=rjxxwO7~ zj>Ewrm*1MfDW_o(@cX_{?VDx6lWymK$>wopu9aKb(k~KBtpH0eMAT*enk_oW8#U-}LvSyx(W&wol#CN^xZz z!R4zml6v%|b~xJg!)r$@Q@YRJ-h}BaalHIPx}UEvy4yTVMK_Lr8Dn;ELUi}ZfIa@a z!9=w_i?`OS825I{h-;5r+(6kt(%Ji!&ioVqZT#e|M>g!w2c8^0kz`2uu*P03wd*j6 zRlM~`K+my6CI!r1{A{)s^o&}K@|Xg{uKm#m-~o{ek!$LJGBoD+zYD-0)Qmv;^bzk% zus4QCBp7Dd5?k{o({`)CKVrHvtn)g5(A%M!d`V*A)ie60bgC&-ab`olHQ)Xidur*c zQpzrdw_m5MYh&h?1uONrm{9aSU(auX0^LHR-t3Pc^{YXb{9u<$FFCTMd$W9%BQ=zn$%0U40sE&I>7**2!cV_up;X}mW#B)n$4mr9)AU4&S z*a8WjoW8_xU!0MRZ$lma{QS=bfZFr&x&M?Wg>UsR3b9Q~7PTkTY+Lr5s79}n1by#R4!sN&(GK!uCR1mDzBx(0+T_;*7+*#5;=KiS_zL z%qR7Y8{>L=wwV+i_EuHAUyu!a$ktDrRJA<5A2PG={j9wkuB}!7lux<1M5jncm)41I+neH=U9)f^XF96 z{2fl#iQlVbX7!HI!8^${uoGK#mjV(6^5cYlKbNat2*Kf- zp<3I0RqoiV5u5metF>R3&lgi(B*h?cvv&IZ>!00k#<@O8+I*+f|MRFL3b&jSwyyJo zonth92#*Wb1;3P{MBHM|p_o`V-*|Gpr5v8^{qomLS^2b;ZlVHyi%oi>YxSVfAJdS1 zLDeUPR{-riZrS+nd61rn{haf=U~}9qI$n9={F+bGjMg~pn^Exb(3s#;?jb5BJTzD0 zml0g9a_v(i8nCAm&r;g4J_??fSmAe1Kf~mQRWG=F-e0aTc`)0h#IW<*DufD3wD_D5 zRiOOL)vn$6(O99h+Jy<@Q}GTPD(B>wUE~yl0O)DmPu=`L9q`BKBD#tl{&_ZHZ*pY( zp6AsL?#NBf*rbmby}2o@S`Jo!!tTMazh4(JMQC@SW4BA?YmA##akpzy8i@VJ1i4wq zYc{j|g?y^}AEwucXu$vLPA4VmAj#SucAX~Moihc+1VV%vva#$?Sh5&}C8^b5TWWj! z762S86amKFY|&t9VOKGx5E4RAH~CV4LHom`ORB7J#2a56DSyCMLaG=-KPAmy~8F+}B!u~6c0_}dC4gT<+CTejWV8131Dbw$3}_OxSD7=U8+ z5y?{iov@vVaa!yu8QPiH7ihg81USF0PSp*_+DA=S5QJ`y2IS3BY5)AP3knQ!mRt`hNouuT&hc- zhI6;RNtCh+1cDFfKRzeNUpU0EK#}wHQ0%kZtM*c(VB>d{sYEDl<{_By?ZxI(r<9mJ zZU}ISH}_!7qbF`P)qv$=L6FfnvGz`g5wrM-%V3s}V3=HF+ihhV3E+VXJ^kZmQ!)Hj z)bcfV12-S*YmK(I=68>@vL5c`^`d9pt6T?I9t?k!WNGDQnx$MOB4F7+7C+HMU4%B& zj9vZqq+;j(6&1G^Z9y+65%AugO=YB3;5UUp4{b7J!Xx{x!L@ki!M07!j~~?yFGA!- zakROaio{1=d&x@T0={^aUUsi6JI++g_ZCR`q9w$FIDd;UT-| zYV%Rn(?;yO|1?vf8}*SY3XMuaQW18o2{~kmetMesToiwTU}fowQ*8y?U_bx&Fyxq8fvr8KC0EB$$D1TAV`?pBL5@lHe}VO<4Uf#o!0|<)b5jTI z2A+`wgR7Y;mYF>jlL_Sq166nb#l%?$k1y6FRRqVA!s&e+RC6EF>wcJ>KyPf8_!Oiq zZjcL3PN4s$9m_@eBzEeYx?9p6oL0!l=x(vyn)`M7*ZI+#V(cq&{N_;c#PfI$UI!w5 zef|k1tqHemf&=u7?!4k7OFpOoEJ0|rNZULaroXjDTbpbsBbZa;mjo2NK#%HJ2sH4d zK%KvQ#Grfj$?cacV&JksE1GW|lO=(2P7%Dw82e=Yk?p%aQnAHeCy%k}cBXA;e0N0| zVMl?SX^PmTC@_rCU@>+@aT#G0SN15hjLmm@{1v@q*n!w$D`7b#2$~dca35zJp20iz zsC)4EF~uyGXK|?)B6lL%@`@(=LEw`x-^tAPn)3aNmYksgz%Pgjj}6gg{>T2gL;l{lnR0@)s`$zs!RouFBe9F za}IHc%XaKk{s7Py+9tzq--}R#rQDP$*OLedUG6c%XbGL3w_@!igbZ6RPoH(kyoBD8 zNLneUbuH^vcC$$^A+AU=l{c?ntc;F+ICcE~EGtAxb6DUUBGkzw zqLiC4Rx#SSq!xM1jVrj8Y<@%S9m09uu2|1{*#N3e{xCXf5MI+6pivV92Oq(s2kJ=k zGA30K$0%#YKz}i{e)msgg#^mttLAulClz741?~LGjPxy2pmI!Pb79vhkJ3doo1N`-YJCJf#e(w0oAU{u;Qt<3y?U0QuiF|t@zF^$ zdGYcP8tbz@)yW9fJ7%s=Eu^sp0X@9DtPm>AAM9{e#Yqivdr}Mfv6bV^<~U~9h+(vd z&g%b|#@=7PjT_^#m3S5#hpUg1D`&i5FJoMFTq`lY;^T+a?KfnuLY?Zi--5^5@SqZ! zw#?Xk73p;8pZLa;T$meL^vHE`^xpNhk7;E_Zj^#;VMc*_u|7;NzQ4zoBzgZa0IM;| zNxJCMC6eB!bSRGD|37^@ysL(EiLzDBOgLfnEMjzOvX4W z3>5Q2T!ZcZO!(GGy$MnBBGy%^{$G$@+Y{;7@%^b?w*5gOgLnz1l4k<=Y}TXpVCNI!((a|B`wrp8y0S$v3wjWWI?XtSfxkGaZG*tI3rm}sdjk4;W5sC zmc*_8nMp?;II-dA`opR|&DS@-P zzI)YXs7RPsL*`Quw(H@|#`%_695_X99PQ)5g&bFXHFWm+ZPePHDLk$yRVlF|o{_mM z*4ZA*+o4XN&?(7WwxiIQ&Q1S#_Whu$mhSGM1q=QJn0D|4+igqX+AfT%W5szMU0-P4 zr64%nX?k};BJy91m0fPbbQm)6r`0uBew+KDVBPl#hlWbc@%7S&)=eWaO#{ymDdDGV zAF>Qmt)XmrDNlMPB+aKSve$e{kPFAO25t%@_eAx@kp{aW6@iJV7yX-y8FVfjJEF z%qx)BhVw3rdqof1NB&@7^#PXOB%89i&aUXuFPD<{{VS%%p^A`NJ#Kk&sz@o$r^UO2 zyN>@sf5Zl%c)H%PUlP@f)jGJe}ZnXqR~V89N@93A%E?2js3vaB!-V zjb|t9se7X*qDDYX8_}*=^Fy%eRc!=RaH1fq+Id%Ve-~~ zPTZWV?zz@t!7uPm=uU;lT!+43NbEer}>c!qh%XcorK&dSeRK`3;4+7{_!ikgO9w{1#HPu66ZC? z+L1h3nPbh|x*7h)4V)VTx?Cl#48?8~b)UOL%L%qMm2W;BZ+;%1^X26#WC}wm0YhCE zcwL)%KtgglHls}TB**T3J-8(bx8mN3+^HPj&ek4=BItT#uLW;ezz^F4oxPIVEG$On zq1H)BpxptSh*6J=sk`#9YdbF^394sD|2PnNKtk6@Th4`%G8kB(fd3& z0E`%_l80w{R^;xU;UcG+M3b@8&xuMvnrG3boyX05UriECh1G{J&SmcpbW+ryZc!4J@R-=&DgUD+jt}Ev+r)fO)K_j>HP(2!fjys%m@W0D zI^h<%jZ(|qk(pv!<-f6@?-sH>uo#LpA?88}A*AlX*aY$QTI0OZpt2xz?&kodgIG>Z zZf-6<1PUX3#5fM6Vk??qo#}qyS3t<1<@I%LQuo^lPbdIEhrI_ABwq+BO;w1ql69;+ zv{?9w|FC=(Rvp;<(*2xC1P_WnAI&%?pyZ7!RQRqcDME6e@zV|ouDy|wk^Od$lJ%?k zp$F%~Zz8h;!ctGYO4G-WmCpHLe9TF#u z4fMQG#j^g17h^vF*0+yd<*X4d9kOj1_r%@sxb7P=KA!gUt{Z2LeDyPSN*0l~$rtDM zD%jA-?e_9Dz4b{~mMD6WYk}rw1Hs|H#*98%^vX-cS3#P{i1wVO?;jNp_G#={Duh1Kh zUmHbf%G3Sz!k*rIPT_RBr|X7GIPY?$OQmZcfS4`%+GCox%ML#LjWU3IuU5UtLI~=6 zLa3zce`M&Nscg2Jvd)K(x@G^W4GAS~N5zc9je za|G#|lp8q&VNB|6BLarch2?SFkPUS|=i2w$Qu)mmBg@TRq~DDHk!S4XAzz{r6Ryp( z7_;$p_K=Y|Qj@P+8;Z7CCAau;Il6+>+TzGuJy)7J%aHz$KujGLD1q{*6MRmv72Z+T z*~HH)cDk1Tr6h&6>lEo=h!|ixJdOo-9aCeba8Msdra);1(!z0_wX_lTNj^ zLxK2>C>pM-S1zufm}||E_kSqwaOKIZQ*jTu#n@-R2pSNm5>B3kUbwdi2LaKnT3k4v zO0t$GzbEO&zMRJpb701qPkjI9`_Ed3cB$_lRX;VRuR6Eu8yc-odWlmtGCg_@qL*k@ zs#!30mki-T(N#30!QdG|?q%fgx?e~lfeJ)(4EONqAGnmip`e>-+a12ip}Qb> zGcqGb@3HpLH_?LMT#M_x9sRy>edEndf54k|@6SBi5<4SG;CwWg3T9nW}f4df{h~8x1u~VCqaM=IJU}37KIx_ zx@?p@U1KoKt&Z>tQxt~M<*ZesLG-tddGN9MvbkLM@Y^wd*$8u_X=n%k>BRx;2WB_tj_J0nZ00o6qmj6T1W;^ zsz7(|r1*~U3+xkVMhVYAp(HOVukv%bcHMbyQ}RbUFW3n|t;0jwzM`|Y9__cA){b^a z5{hiV5#OIV;poajNu8INZ`Qk&Qz)LcGW$NHfCFRUVj*=t^k5Wg%totZrDgb0cMzDm^&*i^!^EZ;SfngmqkoC1 zg-dI;Oy!w1%rcceN~GL5I`H5T?3z_c1lZ+{h~R+j%JnZbu+^b4*X<1OgnH}6hdUYK ziOeh?M-uW$mKxqniA?Q%=@G6eFHEEhA;8v_a-g05qKNr{es~-^VV=RW!scgrd-rR` zmF^)PvOI&g>DCLWr}uVm?`(W^*t)e?OWS$Tn-jO@rQJ0-nOUtKv|qnGVL<`Hivq_{ z_U8zc%s|()`PLO_)tNDAavQIrFTI=+vJh|UmaH(4%HjC z&y1ZcS(9ZXOO`AlWGz|B7Ba|SvSy1EA?8ekgov`s7RoM4gc)Qf`!4&w@7q}3Gym&) z-*4}A&8M03JkNRV^V`ldzx#fqd^)Ke2t*p>nPIEqpR1dHv&&BbG-FsJYFgC_uaSC- z%ZQA&g~pOcAhpU=tnc(b$KDO;pbCeFpAixK^QB{)=TUkSQpD{fZ|pj0*-wO3%GZR@ zk_u}vEqR;j*tbVjFALVM#&|?<{eJoh%#d$!^(elp2(xINePgw*6#Lsabjh@Penzq0 zeyXo}`{L~^j3q(x2>vEK>*R3DS+<$tf?L=oJn@h0YZWTxcP5xbvGxHa?n9`LmBTx4 zOCv~#Ox>-gNhE}gnNyN-Q~4H~fa>@Y)S04^Ihq4z`Q>WsS?{hYRH&)Bw#K{yokImk zBW_x<**+4GrgkqoWI^9YzXLLri6KV*G-U4?ne2^VTKAx=MHy3nZJHIOU;6HDdKh2n zhJ))5taxH#6(p>KcdOEuEZmQ#;C>O@NTkN+FZ2BArwF6K0$`9KNXLhy+tb>SdD3~; zJ{|}G^&%|?$j$Oe583+P+koP|T-}uJGTrbBuC&rCnHJhF)QFFIn=h~Zf2|UTX3uLv ze_Sf8PtA<|l>SdWZV_n?(|c;1Q(W-*`m2tC(899vhp^U?m|@mTJQ*2|sdMDh5Y48g zaXv-EcP`kw92P-TbmtUv_?cmH=aouP!olZ^f!4QFGO(Xu%f)2PuddPZwKU6G5taXW z0br<&rC5x)qyDBW>u&l3$&k*o+fSZ;r_f*vcT1Zew$?hVUb*k)ozmu7=J&G>p1x)O;y2=%Tt*We`RxId$G3V5&CKE z+sxwy;5x_@{F$WcN7-(g$Nff9SfyNrMA`q{gviIouhlClEMi;H3pt-Q$sh>@--5o8Y&{1_0n|!^iUabO$n8alQwU zW!)*u?FP(6P!E2z7M2W`6)DK>H8wKfYjazZ#y!}Z-2M^tHUnr0z*tYO?Ct}0 zyc<~&C73;xlSQwjtG(a$Dma)NQ&JGs5Jw8&q>d^Nh^Xf=-eG(U26boB_);IBRpleE#9z3j<*uh4>&3|Kn6N#sol?71p^mNGxt zTLuO-9^eJ=T2=Vx>u#F20Cd3<*mJ|3_H_K4_rR;oe}GaZMe%r22Kj2(XFTa}k@zl! zuLencTPMfnv3ew`>vDDsR~~~HqMbcf)dPon$9_az8KG>6B60iWl@-rtsp1Tq z4X|A*U~v`@!*j9zF4gJTZoG>3mCk_3_FB=NW9f*CK$l~m;J){c^hCX26=d2g7dDnv9f$ID3qs*$ennLp4= ztOghzef!4`PyCf1{ehb?B&y3sv`GybG8ivF>u57lQ;O0)`F!MSFdVi>K84t2BNWk% z-2x2R?@B&9-T&I43#4)Q1yL9eYV>ZomD$zZNZ64mDpKy^-cz2K`WO6}4iFTHz(KU92Nr+eN&iWa=+joA8Nlgl_IllA%!r8-N8bQ`3!JUs6QN<0D!-NI3Wx?kiBAw6eZOgG@FScI6{Y; z-vY&;oY!!_$(fNw6KMDS`EYDYkbj8o&>{-kB-|!Kr@(+F_NbCWR>;kZM}S81XL|^U z3TixY%CS$I0}qdCX|yY~XkF6v6vYpp3|UgZ$1YVFCqb+D1_MP?XM~Xh+)GHerBc8* z&cfo<(;!<4rt#Ny?R(PEc!p!c$$1hNwYzho8my2S9M5%y?p8?+YjR_MEpKHRv(1t; z>^vYwNH_f7QIEr~&xhHCM|cU~nbZ>0U}BG5PA^g&1F%Ku8bWF6=_&%ZC5}6s1J70o z)`U?%f}r&r!Ea7;)%@ffJdCp%J1xciK3@L~9vdgjZD6){euGD0sr{&nH~7PS0d(qHlNER#BoUN#J*SiN})+;M*q26Irv zr!qY{G1GR=Oi?&1qGB^~`ss7t5oS=otl&2eQ4Zh;b(@;h z6T$Nhg?9dohE&Xff(mmRxXuGRbH2QTN=b%~;cWarjZX12{|Ju&>E)OwRrfS#M`>X2 zu5a+FBu&h!!yT7c_=)U3P02>;(XvXhTd39+xHY2^-K20AYXSzQYFc`#wv5@KGedj06(I7FQ9 z`^N=3@j5QO3im%^oCE@L5_wYZhR!m{C@a5m zHPXY#aR0d`&lX|T+P{{fYY)ocit!CY(K5~hv!K+^7af*4@G;&>ddPmGjj_{IwN|;A zjT1`%>wY}3E?=W#dkM_2Cl`C~O%TG>Z^q?eWP zN$eb=vHaoJA%5bbFzm*b-$dv6!NHsJe9~)(q$3Kpwv&6BisU;*CKCH=2w_x;pYCLL z_}rK~p%oS$@%%(t)gh241XK)XxsLl3lK7c~XoUj!qsjyXEBs^`Y!%EoH}WE}WG@21 zG;I&#Z7O#w#NOC3w^lJgQvS_mxsb)1jsaW9G%4E`T8k@Qf_fi+2V%l&Xe8=J(E)w8 zo)60omnYM7-HeH7+t&nYhRhwNtf;kDhka$A_u6tJjxc8_WD;D>Ux z+bQae_xZN25PqYX$_<6Zp;cz{ruQhUjvUxY&z2X?4{_71XzD6PaD(fW!qTTh&7ZDH z@8YfiUHyK03LxU>%0iLf!mEjzI)e{~Nj%U8*fr&e(Kq6Xu`;3n7ro&5p1D~ge_Q#s zi+w|oxsft4y^1%OpjyF+rg-FATP_rEn{AE+dbAF$J7%RL+o8xBH3H{k4r{x`AH$p` z%L;=6G0|0aNSn>G2jvE$d*}0Gmo7K?aNgAQFLB6?tSy6p6w-G6$1`WnDKkil+xiOV=M;E1!#X<`vr) zoNj41knj)kRbo66I1}_>&H&1f|$(*@c%U zX5x24thk_d3bKGp_##@MQcc3hf+k7+^Jw@ceN6hp0jPX{gmI<|is<>Mlo85wfU2M& z?ps-344>#YDG5Yaq@S?Xzftmw`#<%clk%1rl*{(C8q~Fn>gg&CV(N8zk zyYr5PUIqJBkFQ=L`&GZWyig0l&l5^ERm~5# zxrmH!Rc1_+*>*4AHe4Px43crH4eWv_xU6Xo(+1badwFlx^E8u7YK=vP8D8qjqueB~ zIoGIB>>kW+$M8OrBv!T_FyHNs2ejVq@j(Fnb_5l7zqb)H415u|beTjOf-A-LbXDaL&gJlY6&d?;d`NwXEGf9adQLy++vV3d|m1kQzpn6OE7`fZ{&DR{>~J zo6!!Id79SH-mc=Fzjgif;_`2`n+`eos|CvBSMA^Gu+^0P97AGk`Nt`sEqg&zu-4;f z?!RN>q-zWq40YtD(Tvq&lDcb8)xDOCQk;tgRneZ=y!gygjds?Zxu@l#9xr(64kd_y zU55EKE)foAZDsY<-G3J~#Z=sTSv4fbWSeXkI^9wm;eAya;5i~&Oz`2mCY@U8oPsGF z#ZS^0MItZf)cr%B>ge+1#;IP-1bi2 zzwxI3<<|LnqJzbl2gXHTfVest%;T6&ocoD85{WTuDej8#s}AuA*`uo7_VJr9?m?Xx z@Bymj3~BW*$0Ike9z=&D4%0i<<9ae8RrvjTkBw=ls`W8texj^p|7E?9I|3$*WdTuv&~mvV2d3c{SjO}wo!0#g1`_s42IdX7Td zg_9+VcA_rG#rR=ojRn z#qVnGv!nyoi0Mu=Jl8ZiZ0iwa+~F&2?AW8f!0kaeona-2Ec_)F!Bo6WR#9sQ4)g~L zK?SzUq^9fES!XT-6IQjRp${|7uxh7QFNyS;8HK{x^arwpSVQu>flHs|{I^_WpWB7B zJ|lqI!}&`tV|R#7$kTJ0rFMFjZb$R)u?Wo|*JWE?@WFoS}F|6lKXy9(|%`&y8xVVnwKdnT}>*AHtUkt4F-0QuLtRs{A zD=t*RfX_!4Q z$tam|Ykm~A;Vk2IvM3EKmY|ezyMSi7@hI${OQj{&g}2Et7) zw)71=97F!Qb@t_hg*n1$1*?d4U!7GNTiS1@?q65zO1-as+S}4^=UAsM@Mb;QreQ@^ zsPWSu#LXcO+3bRQezA!qDnC0xXY1!9Ym;hv!!(YM$?5quuzOj=V5{|WB6WChW5czi zZV2CCEfGiqDU^T`NhRY(Yy`H*m{^YTW}KXPd9*?&&fE8A;cR$l*lDSzm{?yH`vXbG zW!~-~T7G06dWnhk_%x<8Af(5qSiU+s!m_KH?AK5T;x-V?^0LxL-xrzaB`Wgo*YvZb zp8f4ja4B6nXgVFQbN*0m8qFeBP*v=4i*6&Ek7-hXl0g;AUH2wPjc|ceB>463@Z$zb z2t$k86BW}}67Q`SDpE{je=$HiE@k_kJOH|Ev{s~e1T(`rYZqwvsP^_OPqd&nU48bn c=ZEL83+V6m=i#f0P(}srsq5V>yn_z-A2Z6FhyVZp diff --git a/en/chapter_sorting/heap_sort.assets/heap_sort_step8.png b/en/chapter_sorting/heap_sort.assets/heap_sort_step8.png index bc28bb736455e24937a761605d418f8c79e9f0f7..62540bb5dabb942a767ea8ff752c99c27e3eff51 100644 GIT binary patch delta 19983 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 DfaH-R delta 19680 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 delta 21562 zcmYg%bwE^2_y65xDe3Nzl#-B=P5~)F2>}5KX^@Z-xT`23E#2Kxl9G!EDBazSbT|83 zp67kv?~lKhxp&T-`J6K|=X2)VqbkVRcSz)K+?kn~{-wU5g~6VMo~RKdc1lW0a&mG+ zT14dxL>&TFPh$=OfUbawg6s>=shuWlpBLj^XW*L7C`S=fUaWP|GX)-qoDB=c{a9_7 z-0$sAAZy&nL*7&^~y?XtR*VDK3gwg3Vf zIJ%`q$`%trXK`usklGB>*STM7uUsr>pA zk~~yP9ucP%iEgk}+u8w7Ab|qP^4xTABX9HVPWY%yIk>AV_z?p5_JBt31+GJ~qgdGMma=?NZ$r;V|$8r6PeQt|d>4Ees${5jg`Xo04Dge*HFz}R%d-f*}* z_u*vcCCKLDBQz(>2Sb^_X2u=)x1hBdXWx*sTTidU8ZDayWp`oHX`J#_W4Ou1n)Iy= zH$*rguT2&;>WjRAV4%en4@oW$AJdS*LcRJE^xVFk-ut*=&RBt72S8y!PAxJAptw^K z_t?a_N_IgMrf;8w1BE~V?YN~4s8M1NpeKiVESO1%dOZUYDkTE|*W*plUlyi-Owt9f zGemen)*6tZUI^c9*&vV;C(FP*qXHs7l6DX-P)^2u1|R^{II#N>7!9cc_k}3|nW@XN zXbpt4l}QLc#&=?KMidgK={^;e%OLhge!@FZyT8EHst3YQ zbGeD`qj71{tmI=XBm~eV^Qe%&9d8l-Wr+w_3c{B; zMs?EuA{Tg@e9(g2Yv~|C3y(r7xZ*-V89>Iw2B6@*hvARZ`@)k4r3mGquaxl#M52~{ zJIGasbPqGipsvH?KW6U$DM+&+xWES2E!WH5o7!r%Cm>$?;71wM+8jGDxl=yo=OXZX zK>P<%7AH1Q!Ok5 z1DF$h9a7?V`mlm2>PS&)T>5WZ8l>k0K;%==BuFhECGIXwayfE89o4z;Q#L+g)#Xy@ z=WQE+1u(w4$0(H69nMRAEGxIXnr6a8K5WwTw>s3$Z*yq=Yysw z14eS-nLfTTw{fOG>|g*n`N)poO$OJ7C22u8h}tVQTP`<-r5B_Dnajo9icN-n27s|W z2n2qOS8p;AZKdAeaC_y)A-NmnO!g zPnmd!^m^NZ0$tt+jj`E$mhT4b&Lb!fJndfcQO>-=MrkKd3Yk&=4;tck1~`i$H@}l< zbIY}p_ODXfI36j((vA;5+<9@RXdbw|8}}bzH+(RR)J4>hh&%Lb!Ntx0f|HD_xBC|i zx1;$+^VWqMA(SOD`UlPbHO`m8NkI8eui2%NB0mOd&q*8u=<7=xP=H|2qPECu_Iz-L zzlstKg{In(Nqfz1(tnIXWR5ZO)wjFB^*_jD5x`&2qpu1paO4{ujtV7g1K5XO1h2Q%0hDp!>gndS^xx<}uv5%&U)LfdO~c8|VzWfE`P`0y}rXv>*s- zgJZiWv#1@KugSaThH|n?>Ix+05bo=itJ31103VP+Ks>EK{qf2v@mVOQDGJf32WX7h zG}LST=`Dxzw@BpZzyO~Zj}^kJsab{*fi@w7SU*~1#{KJKr?!r9{7>-*lvIzw+{Jf9cr+^ zeg(9>f)9Oo#t0xD0wZ)H^{qqLq9z#ND{WH(Jh-ROjq^p~djLc$!Xdl|0~C(tuLs@b z8Et75a;=p&A%y99EkQ()&nPlB@IFBxzdgTc%DC<+j;9OXW1>y``Dh_#CTl~Ja)9C~ z43Gh=w{MphP26s5WEVDKwWA9sA-~(#!!lc*5&mvdxITx#kw0&vGiNtqQwK6IzZ7mr zPhOv3h|A&-9e_9}@Xd8&+zi{gVx1|=Tb;S;@|RlR)GHe^a84cofMif36By!=Rg`c2 z?%~7FmyXjNWf=T0QKJ@wAv-puZDaz?TO|d6C6XJ^`9ib$BR??|fXd8**~=&Ck@MC{ z7~4@8<+M{_!(ct6=^S--J>sZx2Re47)#ErsKwt?04*5#qegfd+@qavJz0~zStGkV)B04YIFX!zO71o|Y%Iv)^20QDwq|6!0?2y) z2rgmZ?XaAT1P+=E#?r1fu)zr1PQ>6NsYsEBVDRBX0Ru!Z3~ozn;n#J}`vD*X?=u2~ z8RUT2N%}p=^EEQ~&o>%3fyOd`K&;#{%fdyfCZuK$oi>#kjd94_xD)!~KI0Suu%JDt zfwvra%!ghIx~;b{O1=})GDHO4EMrjU@QRV1*jS?irr-9EBGbM&yXFJT?PC5Z#L@HD zfW94Mx(Us$+w`3eVr;{~6bmGTtF@VXEYw=vBr0Eyews$4(KpZzMq4r0G0%YL zCnT;^G%hR#G?dGzk-r1ksG)PevT-BQj!de^_XRq-@L~Q9M^uIp8ZrQ!8REB^j6BaD zM4!lbGjMVWDC0uL_-kajlPL{}OGpOBLxvasx^GWZJTWwBA7=-bDM;XH8GQH~j9X_&xigb0SMlqDnb_&fCz6YF6p=@(Boa-+a{}1HNA$T zxY@Jo2F)G1`(vv3bYgC*gH8QSM~L2+9cEu@=#VEg5%wcWskZnM$YiUt-sr8`eeTs; zrFq|t$Op*dO!YlY&{#HNyFQ2WhmNOSoW>+Q|R?kxTFE}E$ip|@WT5;Gp* zKOl*u!cn*Z6N)Ljn;)$q1GaiGGsmN;9wNZb^QAVku|1+@pU_~01D<(hyKDsUf=kB} zpVs)mW4XSgus@+Z%OOXhO`L8UuS?~BX8(8!k9Z~GK#L&@U@Z$vV@cN2pikiN2Sg_9 zOqcKeHY*)%6(lxw$1(Y~9GG{oioLd0r!TE3K2Obx?rFR--L985jzcv2zJ+?di<2AV zrbS?UG0XeX@|Gfp;xoW-ZxkH@%?LVs2j@ox-du>E#&wi~q17Y{YqT9*x*YflRIptK zh_RRYASb#$6U_Z@s>d9W!^E2oqsj>6TGn@S9euc~LP7zBOS**jX@%jhx*+ADwIRa} znjByc4nTsYupfvYuA!o3pA)7MV=x6`MVN8J_cr=|?@plzmi;3vfj&|q??YoeCrX%S z_4jP@9_egW(b)p(ZmZSZ^n>avMj1ei$aMRE@wxyRHG7_s%t&#~)Yd zEuFo=nRo)M1}IH z*nI9Zq8$>EzsDh`Uy&n~+>lPFMbov^i{y1+p3I*ii-dQtJbtt=(`d~G2fMsFfq$IK zXZ1DDd`dLC=4}GV8^7-xe^v3wry|iwgPiTy0Co=b+k-sQp9|g-h1r)UVroy==`l;J ziNdyb$jeg!G&!UGzBJD*?8^er99rs!Mc{L8yBC;??^W56FSu_Enwbu0k5jnggYHRN z**AE;c)RtBrrrNj8J|DkM09E-)b2m;10>{2~$u6W9Gdci83RM)M4J(0Wyuv zw{`NCVnOqj6&~HkVRdGfy@q2sW5VS1_UsSGt{pC#fnTe}DbYn=?xX~x1buTbUB934 z3fS0fDn4K%gkI|Jg+rz_KXZYG6cfW2_L;I?TcOZKLO(CJ!S2gG51jKiO^%4M(Vhn~ zXYWz?fm(7h`Au+lh-q0(X-Xixi2?X7zB1hRMX#z)JdRGZ-LSf(%!$;=$A;9Ls@H>V zaUQ9P_wn10-{uV>O4P`h9kKhDSklu4#*xqV;XyRX>1SWU*w6nO#MnIu#_6zJ*;5QsW(#mwOrKeN^6%N-FXvV zRm_j}-xI)p9=8mxQ;73tr~?z-x61<2W$r5ZzyL>PCn^k@oy2%Jma_H>0~i`Huw7EyXM;SEjvyaZ&GBf=B+K|2L1P_B?o7I89; zm^T2v4q%Ptj163nF8s!q(fneh$tZ>9-DU#;tYLQjKYMt0)jk|4sp=%LLn!ikPGJ5J zC#!og9E~3YX;7SkrItv-AYu=sHv8*z>{G3l3n7%pE$9&O;Xh%&L=qw)@F#C8evo~; zJf+Us;w62MXN;zwMX+;ew!wST0YU&3Cz$F{;b7PxURSODvBV0G6qH#xW7 zM|5x$4-v{pT@DT8o&^inrC)tG4UfK*KgR@u%n*Y^uDY1viyiht|KYZaR2OC+Y3x|CcCqz@+F>Q_nO~o1O}=4A}Vv#X5AnqtJ!4|FN|eIjSc~TM`>p3o^Pj75iisu zQ~rjm-gy`m_fx@`uF(JsYr>#?6y?d3Wjw|NHlpuwf4W6IoF)vX!XWp~K#6@4@Bs_e zL`8&Y!2MfZdII&b3N`MB_b9>t`-|>D;{X{s+pILV=Ac%6^kccp0AQNySkv3b+Fev{ zu&ZmkJ4eEL&uvo_01_Td?n_C&=8C?ejalk*?qo-#q!d{G63rnaK%L$71ZP85Q^EDJ z@czL{XYBGcYqJ<8Guok$K$N*>JFy&F`VAUT4~Jb3?v+c`16$%8^r#GqTQ&$7GNdNo zcw0fa3xDJ9xW`g-vLdov;$`8ibAC~AI6I-DBQ4(_)B|Bw%Y~dlgc*yTx;Bb&nH5go zc)Q*KfIuKO0g_x5-pkW1?5pPHnCSW7BZZy*2+-30y(*2CVfRg5>b)Mgmy>+D z%*4011@v! zCHKgO2%+Cr*M9tbDY9zn(N5nK0{}wP7m%UK=l67dp7J>UaPCPKKf|#t+9)T$M>Dd!?qVq{u%A|Jr2+Ni&#Fg7HtQ}8)mFb9HJVTtPJ_WCE_s_Cp%x8mrP7*$P* zSH23ICYUX#ceaB+DiXl6YI6{dcf#Gwz-(KmmD;VBaSHa8&037RR2zo?a3K5Mv+!aK z<|JZz3*Ru~Fb+iRCi)M-Fz8+$4!2o>-i{#lz6#F~qPvP8)P@ICdWA}TWv1mFq*-*u zXJAlqi>~4C{4WajkZ|TCa`MjCmx6gf|DazsfK%J(R+Jmt0~Opw$$2!DT{BOhiG=DZ>}Y%FOaxN9Hz8&QjmOp63Fw9cL9(Nc7(ZEcGAWJ^V;qxEZyT^ z(goLJGtsTre+m2J3$zw;6}m41)_Lj+xY=D2Jpy14@adk(|DH)B^`i^ZZQQh{&p4&7 z&?#r@)_~{kBr#Ix8gBhNBT{a$=0+08P@a#jFZg9j>G$C1x~)s8Uvv&|_RO_VwclXs zNxtnXX8M?ZNH~kPQ$YR!S=!_DifiGiJ@=RHoK^Dv4+lEm^)%IlrQIVdpl}jPejUFN zO;x&Gf3~si4z&mj`grlpnz{PL%m3g&>Z8zGssU5pvAU@B8z&v!h){K*nY&iAF}K9QFT3qI*-Te38iEIvcU7x zVIO8%&63;Djl*oaP1V8Onf{|H+5?cJWWg|uBAC8r_l0%f#KibT1s4IHKuXpff|NA8 z#A&|Y1!H=A8s{}0{-`nOrfSK%>_PcB@G)y5P!T>_CMMzA^W2a;oHB3>PdJaK7{BGd zP<|2TH8g%EsVgNYbxr=8iMmeOYC^7Om|v_Ve}7#aTmKr%w>ufBLwXd(wSnUpPyiKJ zqSg%r$RN?U@gplmi*7}u0xhVG(|HN8VE!NA{p&}0mUzZxMKYss1`dEx>K&Ft!iM7q zmL?1*#_t%se%}GO=gcpEwz6@qwg>cu@5(a28vEys!%-bFXoDDdQIb7ijbo-N)J5;* z3RcE5lA7j%*hEONfDJVbE!xE`a$lAfjP&DT-_^VP20~0I5|sLAN-ML0;foriOcqqB z$3P|JPSRZh$E~Pjv8)}Qn^5dT9aGDZDU`IX`=f3ih~B>TlrI@k_Nh13t_z5q5i5jX zz<`9Qa0r>WqE?`kGFMW<+>4S-lGeXMZoNyW#O1m)>*tNXSm@6_z;0r$sXwM->z2vp zAR=f1!ni#@)V3`cK5uMGaGNhYXL8%YM1bkexCkpnx?I z(vu>|y><{>sl-~cyUW|)-WzWC)q__|9N+ss;5OkOcTAlkVIDo#1dn!_uKhDF4Vrl% zExVr%Z*T^gAr~LZN^2U-&c3SIVpni`>~)q^xttN=sYtpqLdWTIn5T?q+-c4oUUpxI z@`4z6S zO+sgtWlSP#=F?X?gof~&V%OF0zovOp7{Q!|N07J|7D~k|+#Js{4b*p^YQ`LO)95UH zVM09n{%rDPF4;@Uo=6=X!GUL)7vJR8?H*o9%+eU}>Q$H`qq&%9K)P$p8eU2XzQ~GR zEyIGj(vb`l6)XalOIs;!?r*S$&Uz^iRof|Je{Z&*Wz_RivogQOXLt27i_1wpY^FYc zHMWC5Y~%1q{-kQ!a4KlZU^n7-Ucm(`(T(vn-Q&T-3)AKV&%#xTMTuUXt#ljaTY1{+ z4XUiu^-fO6wr5iqIOV6)?viBac^apRrqlA;I%K0%J)QW~T(WuLFK!w0%*>=Ow+*oy zZHZ1bux~H(oBoU^pOG09RkI9t^-Xz)Zww8y`n-GIE&hDYA-}sUrZQ~r=w3RdS?}=7 zcl+Vazdk&c;Llny0|VQORLSb4N0%vkMPwI!v|mfZwX34vzXqioMIE+oUj7?w$=dXx zTaSAi^-P?YZCY*TJviKN7m4LI!25`X&W}!Mg2$isJ@L;(U&1n?*)0YCjK-TEmF5ZR zCr6q(22D(L#JkY0R=V))Jp7>&$n?E1GJxwqVBR-!>+^Ea&TRK>8 zD!7@n{f#u(jzje2TfbK9Amd3UfkUC(;|A{71ei7Fi?YJwDx<{)k(b{uy$%|6y~W3k zN>~%w5I2puX_wr{t6F*T&WqV>&iUkrs`OdB$4AvMz8Vgr!Q$OGi%?pxw1QZ6Zxe|o zGn1<9_pkq*r54$sv1o}Q%yaJxnahkRhq-D4IHpLU3Xi5trq+QUj1kJi--XhJUp$35 zQA=U}o=z8OCti4xm5%EYb_Jg*E-}0|znqlN+|XIv}m zk3HRBYJkKw+F93M6~*nB_1pb4RcRadn~w+w$@}5c%^Aa!TFHpx?U;{b>DnRF+QC|I zFi-9z$xqHLC&%;;I){w8?zqx%yP(Ht_FtI#Xp-$S%cHG{#N_I_MEdwRvDuBpYgpOR z&FT-yRUy_9R$+1_Jb}tWX#Ka$ogE+xocS79VdDS|@^68wxa4*+&KiM6! z$RrYI#ghjw^cLu}>Nl2RltQV;9tmI1fd$ae+5nm3e4zcqLF}+D-HrhsM>~9e$Z3Wj zmf#zlM$|3ayF~J4Zt97{Ve|=Yb*w(jTBBfrq4b9je~v%BMUQLJ9Gy#)@gD)~eFb`x z-E^N$ZE#e$ekaY~-;x2d(B#}r zo-!m935_y#yT8h)wb!JotsSi%uYwH~;D9q{D9HuzU6pf0BG> z+n6#US!3E8q#yQ6P+}CyhlUEvRrn5b?zY@-EyWpV4rue&KdnifWtO?3#;{Wf*xP*s zb#wI^t)PT{BZ^8g<*lygHk<|vUOEa=%Mq!+S^M;*bAx$u@s_x$wWWVWo!6GGRShaQ z+dS(gOHacgd@o#@|MBSqJ|`W`3SBcQ*dWemWe;o8{j(ZuNYZydx%|&*E|QORRT97c z`L1LuD=6*%ct)GT;(P6;tY8Wn^6^5BWPJXO`X9a1NC39D7=+<4{@f*m7vc5cn=K?QJ!z40D-_McGeyPt* z8=ZOgM87Mh)2+Dz{hVq?>uR1tHpOAEZ};;--DZ`;9)Y-8x}2>BIwdR6sKmD6p&HYs z0kbwluu*VHp_0Y2?9eLS*Bt{|4Ih<~&rL?f8{F^;+a6|tv)p;W+4B&CL{2lYqqtlC zcSH^~SOY1~zAD|HYIjH1vMVhClmtntQy+WD`jDRmN;e*04H&5C!#m_oxRZnQmEm#U zx}`|%T2d`a#!}Scn%EodLP~Obyp||TAyL8s$4oa}6~NB_)I{D``;XMCz*|d_bt8zG z!M#633xoH2-g)r-fQ}>(mqhUG!0N&`AmoN{53RtzOh!*$m`x6$>npewE5g@4ef@_b z+^6a3JgHDF1}crShh1l<)_u{cEgutRRDX>G)Ia}ysY|jN2&0U8cO78zZXh->&bIfD z#pE5QXb6}#=t}97{fBeh5^!vQ`f&HNpPn;rQ#EISbh(cr4LnXD_s;h&dRC4h4=uRC z-XtMaN}A@iaF!Fu-wHN!l1l}Kg&};gwAo;Qf_StmR`R&wohmXxgW0y~4mXNHXL;6{ z(ENg?u_y2_gZ`9j?uWYa=siM}&Tl193?=G0M^28~XKLFb0+A14FG0+(65^2JQJ}Wa z;5puRd%y6^*Shaj6AwiR7sQXN{*u(GiHJKvr)O}Mori6v=NL`}n(zzX1p)+nv&9YB zY>%NmB1+DG2p6J!uU5VW^62==!iOIYm)XzDnUb2S6#FQDTs0v~XFD1bt`|^icgfRQ z;2@eLC3x15^3JF{pc8acG#M~NPakl){Cu>*&~V3wejbs(S^@i}Y|X7%2Yt`Ezsz_l`LaDE3Cnc)Fo{)Q|`}UCg4ikm0Qbi0$#7p>^>UXSt zAd2)r_XleAi0=L4rX^?V38K%`ZL#Rxbl}nF{m;0;T0UKxRjPVX2BvV`Hb9=*L(ewo zA;PP%H%HR(QMKxLB=v|<4#86i;?h>d&UhMhPmjVZ>1mZJ=?FY9#6Zy_!N!he@J|Kz zy0HLm}9u2RB0W0%EHegw5G*8 zT0ZB4tDl-AM~wd78_jh{lse9PiVGE_C{hybJjW(o=@sWix9$fB6g}*f zKPEyQ09lfGjX@QgW`7Kys=p#Jt)dR6j|1(OdxzVU>b2#MF*BV;>6aG4koXe_M2ch= z4Vg>J??weHa3$D6QfpnUE6}O_x<5Q79JO>!mer3J(cLUFa_Oon7lsOa9txBAYI9H{ zmL4}Cb;C?~B1&^R0G272F-(YHy=jo<04#TB;dy?srKLM$CNlYs2ejEYAcYLVx*k-hrU)c7j` zx)nY=PC6@d^R=*Z3G;{o%y@8=2a916vAjt)WA3JnLl}lS;_Kyl7<@<1FGo5;6bK&K z3Adk*xBn_;SAB_eb?a#Jz;%jJSL4ydEQ$Xkapmpdv%o3EN#9!)PL6Zql}65V~S8sFe1RUz>DUU*%PB_Z!s?4u3nI zvY5V-!k&t5woN_ov=%?JD|LTmBR|+^ReSU1$ zlGHWxfNXN)nNc*w6^7E|Vrz=mqG3gio__G~-OsZ&G`kU4q*prT)JA9Tpcv!79S^@& z59Zsz8ub0Wt!&7X$J(jQaM7FyUk4Ri`0ABqMiAN-PeBDFcU=#5Fk1`L&9 zBc4X2-YDHyLXxl)3MuTtw!a0aU9}`^^2+Q578M`8;E<{(G_57vUeVexjc@4xYAjzq ztdzN9_q&Rm4>UZx@)*7$J`_QoQLLNH#)S}+20w2x`J5bSO*64B;o~ymt>%sQ;gcMq z#}0x9FwsQzp$VpE9}J@isyYkoIQNVaRo##*C)4TchVP%BGajjo6@+4!k;?EjLC>dt zczyCRk0sHieEb zC?;fl((qk#fiqz`Gx9zF10G1XI}oIkJLc-+NwH(7{aQpZ@25SJ7P{i-#Lh}Xc9FC2 zKTRldZz7bz`|$m_epafLO4)tFGKjCY0V)&e>F=y)ZG2H4EFxsLK<2qz)JlT@Kr8^U zov$H22pyt>I2DZ%KBIe|I!35~s=p~84(z9pr+ejw5uTMq?BT>YZwzQFG?FiXT~U9!71%~4Gm%*TCT(zNZ5_Uk29;G zQqDGVtr4n4etg!w!}o_8z`&WlM(=XFK=Hw%E;W}2UB((nZ2r}TU3s8Ja**;-CtWY8?hZB zmPD7tjU|%KenQEFiO!?P-og(dwwvCU=JP7myu+FoXWm)CTHF-N&l;g4A<7&0Zqum) z{ZM#lW^f<4a?swUK$rgxa+uotd6C8G`IeDm^9*KC9NUY|qhli@=*ZAX6(C+HTx=9A z@9PE`^LPb6!JhxHOKK`9MZ}ox8B+75y^X=1c8ZcXYsBH2^VN}nt84dHOkQH& zMvZ`2u&{Ufzq_`FY~Ra7zbiRku~tc32~$YP@5fUVTD4 zn47OSznT~4k=Hn_5pTj_MKiz7e)@~h4mFr%vJ_i=qe!QI388=QYSR?4#eZl&MO*{w zqJguRY3hC(_Gg&rW)pt>wOk>w-Z{ur&4f>_k*k}sohZK)7&$uQauao=kS|h6)bFEm zJQ?=nhRSwu_tT;n-E8pwXH==5eV(S=76wFPr18OH&GdLGrVjS=vza$yyjk)2n>x3z zS1%ieG>$EQ;QCLk2B{QK@aM}r5G-M2gt(k^%ld$ik=L#?L#;t>+d=z)Q#9yg>W*%3 zXv=VQBSD7*(oY0xA)(d!Fm@yIxA)8bq9FI*Z{_NN zLUsCEqg?@`9Nk}o`-Pz^KkZhN_Xw85ab`c5Uw>0f`mref`kUe`_VPQidXhyP2;=i} z4!T;B1sNvL8aXS`F;NJH*A9c|b4y8`(j3E7-OUf4JWI>%zHOA<3a0;>{y=Q4H}wj= zT2DdvL*YAh=Myv*0kX85=xY0c=ObDU>a|fD?EXf}QW>YVS5S4Y(M~_Q!M>Sq?Y+l! z*AwZE$7+5b*L^@Q$3Kr09`SgcM_J{Qemjpbn2BR6?_Djt_jAX{TvwF@oOt`&Q|>-Q z*hHi}=>6JaP)L>FhY-!-$;8PEL*4!wvZv$)jy0WJ*F1IE6$*13#lMoYVobUp&4`wZAQjv54dqXNVA36m&Xe)>o z1ezaMljIqdK@;!O9cQq<0#8}JpV;Hs#w81*CmnW0G;KkfSi@n#0Y?$O$#vnGU1s*2 zgQ+M>IE6%|ODe3AL!KBLe*(f@@<4GJ1X77j+>URiltZl3InGLbeZ{6T#W5YcWu6VK1TJu}?`W$9ThQgg$&w_L>( z@~Ng}(gR3#;uzF?9~=wGrO{OqD0x1=TJd?d~;tz2F}>Fk?;GF33krqJr`5%c0*(IL38~Ju%@?dD`xmM zQAw$PAi^@*ty?wUz~B!Hq76d?C6l!2*M!o@b^QXjucJ!s6C|7$#d&!KV)XpBomPm7 zCXUz!lLk6(U#c@({py^HQQ~r?9TW@!9KeVDx^M$saY&bZ9*F?XfV^As2@?mxQZ(=R+$@mw+@&8&Lh9wY6n>Fo#em+kQap`DQuKHYIIg->6Pj9L@e7enR z!!OO3l~}OT^9P6R-wUapY{H#5x2r-$2aVYD^WV^3uhmXJP0w-iX)vPcu_o@FQRSe5 zsgW+p?a; zST~T@3?E0Ym=|ySg4HiAmUN77RCzx04pf0FZK`oY-c%1AOnym>b3+kULsz2M2{P+G zuA8bT>$DoXx}8pNE`>b+V1CHU4@uJa&5iKMdN&qQr2y}}^jBig=8FS*tAj{{O!C{r zA&`%1%a)hHC4lCzFy8;%i zTdj#cpP<4d_`#kz1gVDyCN>6w4`<;>ssN@V6<&k zcIL-)lBjG&IEqF343(Rz$FaUrDfV__L4N$!ktg%q_@aW>VO(kyr#RbZTipxnAs^P@ zrPWD%$jgo37(}OZ{_Td^+{D)k4Cl0Lo0OZdc3$8U{t+3lC+nt!{?7*#nqFIA!qrT1 zeE)tYVnjX&9rk$NHxQfJm?-?0<0NQL-!Wk8;?TYMSl}_~#T>5YGMCRI6Dj=~j&z;$ ztW%=Qr>Ce(xNauIYw*99YPcl&)o$X!r|T7qPFhjF1#i%lsyM0GAZ6u!pJs4U`z3@qIJH&2GrN6bH;9ZgF}xS zl4KXfZd1v198l)T&zXLHi8|m-WJA!?}ao^XljD>SYrrpH0VKz zkzy&W%P&*?U##5QV%5m^hB!rVB4>x5xK$)>L_f8wzin(j?GF}#Orry>TTpU&vvPm%6-~1>690;g1AFv?YZTAN991?i7dF7;ISFat@ z*Fh7fm5KzY;Aob{h-a$C-oFu!)2DT*-VthJm%TUg)MuyTzqm)A*A`xsN#~jTS>2kF zA4$8pCK+}4rCBBClXWW5D$?)3x6<#Iv`*hz;;rQYT?24fW;D%2)diZt@!SyKKi)1wue7?OurA3Ddye#=ePeIHtSR9u+dZ0crZV8Qj zbcu=O%PKe4cdVuQ=u<0}?LuA^Wut7G--atA4WB12Z%6iGlZ{b3nx8YZDSpz(MO`-< z8%ekRHpnuz%I7dMVg`JP#+|I?fAvvpHY;>*t>k)gJYxia4enf3X6}Zufp~us9{jt{ zUx+X_t1em+FT|(TbHd9Q*-%yehrj(Isnx~tYv&R?ZSwtEir#CMP2<1-z?^GB0#~32 zqZWn=m3csxkQoT8B_mY~E+yQA7tl5U%S{A6Kp@JmF%Vj)(Gu^$V%=O03^4#GB6J7) zR~Z$s&mboQ0I(ob!R^rJERN@Sq@QaJjb>li)APD}mYL8#fe&I}_!_^i4jJc8)=$Z( z&x855a!h%*G<GOIOhZWZ)l&@_HYKEb?Iy=CIZ}4{|SdC;I$Q*`?ykDpEedT=SOr@vXeR0I5#| zPI|dm*m+vNdl{bg7<^$Kni!WlO|u?B6w>0wq#79*?%voS@T;7FX>B6hs9#dF)EmT z$9ViBcTq~C%Hszn1f=C;25)XvrS>%{TueDNMH9=oB}j2Eg>HlobJHtq&VorB*m7zB zhRmbki>%$#n^yIsU*Y0~=GFYN!}U6sfAO~B+V?&b%^Gr^XI(op)tkjLUPi6B!oi2K z@QnV7n2s;FX-Ou|8?~@W-Ml4RFE|*vWOJ!+;+t+9Hjj2j zIE$c24w^Fd{`pY$m^qct#Uh@hgBV;0iegq%McE05Imfw1Q>V%8W-r!zSPUivnXC7T z51J9?HD8v0vnQFKPGks8;tnX0cwtnjDD(s zoeMNs7|6jH9THsBiZ=F(KKNv7;9{(IM@2C^av*%idrPtLJ_hYJD*lkKIcy)e%?cC$ zKsIZ|i}+J2E0@PC@6Q-(R-P-7uhsEc8@}c1dbqZ~I{NLYa4N;Y-Xr}u$_S39uOOwF zmDycgY_Bp!I^$w>nx6_9?t+birCU($WIkOVWN2ELi^OG=M$_7!?N5EE&u3#{p8GP9 zQZIJLlB!QadDc~V=WBI@4SoOw6d^20K&5A6ZJU!aAa>L~@!La>fehJQh`-Y+O>7|-!o#M;9&^~}G5A21bOC4Y@eh#z zfQwDD7%RUZeNpIF%=6yYvx;K0ilhO|IAAZwR@IC)Jp- zynqU_iLjItnHsI5Lq3usbeeP(Kakl!=kt7l`|}>NIt6s54HwECn_ z6VaN0E~@jyqaJV?7XUF8$(V*&5-nZ%JX`D;ak`-IG}BpaLB)H=+FMg5J}Pc+k|*>>r^E`kD|NHN$HqRF zRr@i8c~w;_9%cJ|vYNWkZusVLKSE~nC_T7{>tQtp{Zh40eHmzfsoJYxwKvqiXljQl zC)+|}8fL3|Ez2`D2ot^Md>--yyLyudPGjc--=` zBrnQ&@1eUAyj`@nIK%W0{8eL()*nV_`iiedJIW#t4KioInBgazKuU|oHZR1cjMEcuh=N~B~uY5x4ZcD33gfv%ad|GH#qkMyEiPd=;GHNLH z*bMG}_fy!jwcJ$d8u^OzmTmss5C4r?qo-t@LC!W~E68wy_isvKw*- zEjUYaY${0pLUV+@&O@jy^I*(69B$P$-%#JeFv<*UdG0lXSG$vDiV}Z4SnMjvAsX=| zdc^?O>VCOdmuMhS#)fpG-fB}f9r*&|!Ayv^+7mZ|-2`#Y>SRPq#(K{zlA&Aqt;C=M z2E`%WG@+2#D zjE%4Vcq|XhCF%MrmFp_L$CX&7GjQ9r~?9<0X z)>clXNp2|{!4uf>(8emi>rdGVNU|uz5G?%aZbH*^@R>)3pARo_ew>(;bnr~jX{)e7 z9-4ET;Kq3>WG5oK@P{vf{B~x9L`UiKh)aIq2{8LxA?$&{Y|5;Ux&+%JwRd!RrNDev zI(1DA@oeFkflaL}9HS2CZh4_K!>sVUtC8VW!=1uUnL#C9vLtx@ehAQQoLfouQ;_Z? z3hD#KY!!&0d#j?M>&Cmb>df>rlmA!j*NKtHvDp8G5D z8*RgzAo_4lM4|%CuUj$&k&eY+1bGy=Ru*X~xmr2YS{K zguVC`&XwdLb4r3;OVwTqe=D{bp4)j@>z`qq9KSyPw5GMto`q+pVoGE>bGQ8G-jrtA z?TW=UF<0@YenwB=J+n8@mQ#v|;{*9R{0A@~MYX-59;&E%)WA>4tKXq60=XECniLi6m!D?%A z(|24qjrL4~c?D1jRoQA}?Quw?b&{Zn15?p=Plw9gwCP~B&!M`iRs3({DuLo(iu%O* zFv>G8)NwanNYFbyv9cC6dou-g)N}g-I^rkB9pr&ViM@v&?d%9!2bWG$$(yvrClCSt z;|kSpF#%SQJ*qmWqPi*aB)a!;eHw!z#;9UI2`pmVPXDv`SoIc#k<$w$lO&kur>PR? zN_$Glgqp*07WP~2&A|;CiIp$%a02b(DPxT)L5nJvEMI;SgETZ2F>6rWl-%_CAM~uw zi*}ZN#H9}ZGQ`$zr9Q~$a^!y5+CN600(6<7QS2Eg^-3t~+jgW1oM3Pg3v&2m`7nOt^Y;Rx z1y-?~)ATH*C8C9gf1hdYmM|w#3QWP|BW;ogxDgdgnsC++tkBTAWf)1kg3F8Ff;TE; zUDrEZj1g0KR#*OQsde&F<7~g~HdVgmey&0AO(5wnwZwGL49UQx4R;z^wzV9=wtYoB zhve7^=0pf7yna5X?AD~8gnrJ}L~2@UzWWt2Qp4HUuq03t#)S|Fo zNtea7^9odlyKGy8_da<0aD!GEy=lnOpLVf?cuy!`jzvCSfFWelz{6T!*p-4N1%k?}<8mm|R^!LPf z?Dqxl!YPSw_b>m_%rCjna4~F7i`3Zn+1RFo^c;xx97$FZMR>KzP-45~T*=OH_hCX7 z)$|i-s#eV-zCq0=vFcv&4|!wzt9=A(?N?qeyTWU*+xj7;C8cv^8h=t4mE+ms1LObM zLS($L-+rbh*SGf^uq?!N?`u!ECvxhW6<#^z6JaGsm7D_<-lTXwspHm$TQb=6&w+|W zrjvB>!4LP#NV2=kLe_-npStwwG_~1XeN68*uoTP+(F~m+~Hl(SMBX~Ka1EE z60@Alx2Kai)g~k@e-$2hUmQp#sE!l0^_fu4AfTn ztpd}Bn=fMgFyX}l<7uf|*$_UX?AV~Zva?n^S0hFA#xECAXIc}F!YE7J$fn3akeE2| z)B@*HZP6FdS2pm~etaFC8917)U(umKrQKD`)*9=t`2=+L&l)Mf)cACIifkOLq1Y1xOht3n>i!u${)*;ZS0t? zR2TL`JtpyZ1S?d6`deG_g$38ma0gYuJPB5A!KDNc?!QT#UAyxtnd1_qqtI@`?TH2$ zVaA-mBEiall~oA=SH6V{1A$-|432t{6!eVP#1GdEGZKXjc671q^1-!5nf7ao|4;(7 z!i*|sfEBLYT$XY(BW|d6zm!(I$7q3=7jYbn@TO>}j?(bM#euaO@Gz9ptXi+q><#vN zRH!JHt=jxq*xUC#9%{)NNceH_8i+YimGT^_(RAhyL*?ARvaj88%o6~N1PmP5ve3}7 zb;+HHYYG4|KSwRS-)kX11OQdsJSXf7^izTQ>Bbdi$PaF?d3T5*F^%XPg_f}T;I2qn z-TqWc^O^C%I(7mQc&qaf{jvRZ#Eb~=MVmVR`FOa{GN_Kd5(eysk+^=}pqd@?5&?c5 z&wH&%+pFQ%fZ?=BJWcLnRa*hn49~QiQuy=Szv6I1UBS{8mmjyLm38EB0bgqP3N?O| znY^9X$u;&p)N|T4Pjq>%k(l}ul!GKb43`0))O}<^PI2pYKz7gRII;6hbH$D?w*T zRWVq01n+(4eH*F5$Iem^2=4N~*)b}Q!TPxiA_s>tY2h)>;Q%c8@r~0U>R(xjQRc%e z0;Rwo*4ghYozzD6eHL3JAmX=BX_DM`?08PlD}R{i2Yl(J6%_7?yPDLmFaXvq47;}z zuY-07lxsFsp1kM`QDdc;K56<)3cu=A9jySCNtk*OR#Mq;>C_Qx=?t8@U!ubsmBm)R zW30|2bl`A>)@~1WMheGFyHsyC@{P!m5AKMt`}n6`g%MBIS>1uUwDL9FjQM{}lGtrK zZ6?FeK9969Yx55$eLB-Ei4}v0pa+8fGR^;1Y=fZ#a7?~O+UO0@$mhq2Yhpl&$C zt`labIof+2c2WqhGQb_K8A=O*y7(xRMDqqgJuJBoq#tZDNILX)bBT3&|EZ6Bz`!1+ z%9@`EjPvB~lj=-uU#rA;siVpk%5`1g51dSyFD6%H2_j%`qR5QU-Fz|HG*{@K*`l+I&6_@ZzFq;{PxDk@!9qLn_{>kMGElGL;vgMkP`Mb2spAvu(4j&CZRdbo zjaPYP6GFi^(a-Uy(ZQ=zY(5tJeOfE+E|gE-Cs!U`Wc3rl@P?mYejk79<6J#7=z=YA zI)@xh+xVgw4~b^bX@-|V55vIG8zT!&qlCUi(f=bPs>@xmZ1 zAD@)p$;dQ?+jrRPXC>VGRT)*`>-R3QLSzfX)_o3|G}&VJ5ycdD_%+fRFi=}jp4lAM z3L0{TF8u@=Wo=^go2Gh{Cn?&Vh#&)g|I&y1*y4Pz)F(NAjIBRX*eKsB&r7XXkDA|L zYDlR#<7C@0q5Q7};=Dr#v}ui|GgMb;6nUcGp?*RvHj0TM`4mxujH;-#dJZye)jd$a zL}(Bji=r#G5-y#{;tUt=b}4Zp+ljg_5g~fmum{{8{hI73(Tt}S{-ROLCOHou{gh~y zYU}wXitpR!zmH`3mg5X#@gDE|dRLw#EDkhEH{;!TpAiJ!agmBPqo{(Q0Qv!pj-;d? zA0k3F;k;%3N75PRR$+QNm`oQt}kf}r^Pxj zF-|vWSeX^0+pGH$6r~${VWDQGH16|p77Fifs*}QYxg?!>K%2l z&OUBn#j|Pq_U(?)ZgL`l9#1&DYM}Q644(zVffp73A|FJVL_p{Sz;usr@c;QTyo?Ac zwMe;}alZg}wFO~ghV@G~z(VM0=nWh6TdlN>!EPf};}Z9r{|{_utzv2va*c`C?8h)^ z4bXklq)~+fleP+T#;|3%wHD(rgfRyMiJ$E2!EL!c*@qX?lYFGQ@`be0d&uZMg~@6* zz|aiVJA}{Q|7B%I{7V_>h7E@13%{?d`*N_sR&O4_t=Fn99g7s|A2pIm9_m4RCAw}i zi@4Oul|Ylm6pwrBKsuj6A+hRXzu3WF%H)u&gDU2bdt;Z%BNmp-%GK1{4@s}CbRhdZ=Fkts3 zLw%uu|8&D)E|fed1N{S~`m7LtosQ~rKp8;98oNxccYhT-=}uBOe6i5`n%7m z(kZ>8P9U*0-`xYun)t@A85~e#;yZGU$p$RxpOvpZve%M-w)9Itn=VF>2X4g^ zR672=|DlsCG-Qbki0rnNX|whX^fKC;agwvF8gT>ZJICCLL9R@fIK4zU$E-o1;fJ($u_uy9+EXy7?Y zjOze@e@ddj5YzKxhoAzyMES&Xgts!Q53fU-mxbl`mYds;j~*VuY@-diugJbJrd~}K zCt(6_Xc0#x6%ot2bN#)(*LdygH~u_QqcFF``Cq*o*cLIz9#CcSxsW}!tSKG#M|L@| z!{s*AF(IM<>|pUo@9Y%+tc+rj#I~Nzo}W~-4KF^b7QAOBUiW)rE4oUy__s%5OSI70 zk%;rh^kmiWbU;Uw*B??;`vC2ye#TUTj#i7U&vI>UHVn~^=Hbns^}hAp|MW5a*B2m_hGk@G1_Y2x#qHyVsY zzO92D6lef^IM@6wElO8+$E|)tX)y4#aIoX*T=0%%jf`2X46IDH{d6vLkz(_=yu~LG z6$vGrChO;Hg0F4VT4)JebXnth++Yt1wXRYQt0{R}3w{9v>SC8Fhq@ zs9qKHD!MOwYj1C_wjf2YJ(=Ywf>IsyT>?}Iya5#qy*Uuv z5c`#W8Cl%!z*}Mdfcp*DI}x#SXx9jKT7vm~`Z!w^D(~voGw~&9Rii4jcaf@0=}QTv zJLArie=Zqe6LZ$Ygh9=PeM*-Gd2M+Rn)v~vykUpb&4cAc(yMDF3(%I#n$svfM7`Ug z%O=G#-wM}8l@KbvU}K>dW|GY5Cf6~iFAC^O4SJ=|W6P*MNH0(=Ln|xZ0RaX6?`xk3 z!LMg@O0Y?noH|^%XKzYY@X)s#8XW07>hO~NCxQYChSp$%p?ULb51-mcUioJRY#6A{ zf^&oH(kCw5oEhe-rQK8aKUoYp5HP|Fwy#e57fG8`+d}NpAi~>TecWEC21b-|aY;zJ z$B~AmWMCE5*~=$%YTx%eco+)j_3Idyu0%nJHR?-kaOcaI+h$&w=#M95o3Dc%=!7nP zTov6O{QO285jamv@lyXTgL}tv@r>ZABKDOG>``wWGu+;7` z{8D3B0Uw@qu7OS(zL4=_$g!+*GEx<3QpNPUzCWf)&W~ncsYv5KLIuq>D*bPB0$~EH z7iV|a7Y7f}P!!eq2dnP=wi3<&M3lb4`I@c`dgwIr3T%XH3TjiF*=U*fu*v-mQ=<-_hf=w z!$02+JLm-=ZP&LhgCn~kS9_4RHOR|x?s6J$Ws5RY11s+TisbdMDhGeX#8T-!*~7UH zL?4*qT`>ato-lPXNuCu|^keYTM$f+U&#udpODXo%lAZ*6dWwjtg`y~X|BjiO} zFMY8xg%pyP;RTo%G?R66ODXO zNFY=e+EK1#f6ngD8B7)qX+l5eW)0eshe3;5Qz2aT90Rs~SQFQ4Nc;f?rox7dID|mzNh87iX83 z=jZ2VXJ;o@=O>pZ$Ct-P7bgc-mj@RIyO$TIr>7?;C;MlITc^9n$HzxUM~8=p2L}iH z`}=!)d+SGAySuwPJ3HIk+gn>(o12>(8yoBE>uYOktE;QOkJexZD=Yi3<=vg7-NmJy z?fE^}%+~zm=FHgE+}Qe5&-&b-KYxDz`3?WTe#79Om6erc*vj(q^1{mE($do6;^M-> z!uCd8yZhI#UtL{Yot>Q>9Ubk9z3q!o=+o8K zy3pD>-`cX!(mK{zKi^(6U0*R#(J<6lF;<(CF{k-)YcRqt;Z}(9lp{Utd>OS5s3{U0q#ORaIG8Sy54u zT$@y0US3*ST3lRQSXfw4P>`RWpO=@Ho16RN$B*pn?5wP;%*@P;jEwa3^t80J)YR0J zl$7M;yA4MZfAQFDjE#*A4Gnd5b+xs%H8nLgG&I!J)m2qhRa8`zl#~<|6%`Z|Ra3kwMeiIFt70RUDZ zvQiQn?(_R;sLuGB^OsEGNo;tyfj1EW;*`N6oV@)qNPSWrf+e6T@Lc$f?^s|uCBrbr zeLtl@Dqn{zdp{+}3j5bHoREEpWygF5Lno{(5FM;S_+~UwJZ7`0uBfr8sHt(HE@t_$ z%_*}fesg)};H*5ONh6L12)D=o|M`C;fzjyrI36&-gocS4!SM^i?Xy0+86_kD@yD6m z0c?Ku>GOnV*FYG0p197-;CsFw=nvh%qhcucmzQt*hy%{B05tx`$&c-R0PcCBFQn|e z61PMEVs<+c=n(|~SQAj48AiMZ=%U~S0HeR*W1~_6J}scUMI-hSfm~H1QHlqP6UzXA z;v~f45J2WLjO=9QK_D0ak|Lr60Ma1X@ZX@%03ZOH5{v?X0I0+Pl;Qv&2!5ep15mKx zgWwkkJ^&1V6q^zP0KzZ$qhJ*HbN~BM$Oe_^#vu380Lqs#tTW%qx{?J;j8m8geo5WK zi2?(@Wa4e>;&mmb({g14mpX6o%z+mTIt7Uh+DYwasXjcu`rOcMf(QNwIT+uo$Ru3nu)2?=m z7>Ziwv)=i#V|8(Y;C?DRwr+aeUA2Ua0(=bta2ErR**6W|2hWY%Notg1M)1$}BVD-j zEwtA-BCm)E!A)mTYo&4QujEL70jDTc8uL0>XKeR z;jMAjYV#In$$Qt*YO@5V4&RKSSI}Yl?KNV7Q%Ni04n!FtN6r}|vq&$bT;{@@oKQd? zN5#<6W}&Ebd{bH;MLxZo_qVMI#=?19uActYuMcSn{MRJeq?dAO055I^t3hhLe9fkS zzADS66XUJd*-fZ-Xk+bzU8?j2zF(S%@BeE~7pvqRe3vNnC~HMgnb7Msw(abfP`{64 zF39-O-`3?92rM~dMLH9V_*JLkM3_|x)0kX9v10j7vcmOQO@Av;Q3&P%h6BwQzWFLwxOeY>~|)wZ8}w7PmCNPMybN7@&85y+H^w42jGrFFk(+#jIiW z*~?3DUs}f>Q-1Vp4D`i!|Mo}!t$-?*B}2Io z_BNQi9pI_}MiF=7^)KF9DXV!vbdPO~UpGze5;V-VTq?VjBI7=$hQ?BC2g>gh1b4u2 zyyu;Fq^0Iqfy4AKa?XM2pNRgqgxsTcq)&Rzcw|Kpw^R&r!a;}BY7cLXwaJ%a1hdTT z2t>gQhnwnm^9`7=lA=M&FKGC{lZKHct0{@C2%_tp>ij6n3+8*Q=Ft;W1No3f4YqfoTfG|CSvwuztt^A>wA6;|7U3y5jNlv>n9Ih?x zrH<>tM!j##WJ!@T-*@o->|eXe2drx<=!pXuxEeRM&mVcniEMVyB65^Zz`kF*hi?y&RE>iDe(QUlduacwnYhw_bz_?}^R#R; zr_Cbx`dEfdSIH`q=%r=LOT5W?c8&-=&UdGCY*4t=i!6>6yNsv8}x2%P4=-q~;c z@LKoI^;5n#elFFTSR@n>L6K@owaFNB-4UMg74tZ~qg27q`Q)SIT;r3JmT_ zdqK5tm!~I%{j`HO0x1h69i5vZNf)QB%ga^;Z_C%H%ee#^zwO2sh}d#5vJEvSRu3WAUvc&l~>$&po9BKl|g*qa_HgOB}NPIWK2~?oH>ypB;W<2nteE zH*rF#u)LPN;lzRaR1-=K_ua^RztN1T^uTd7eSSp#sEo5{YDu_<$LR7yq+?2%jS4$u zu9&nFxM(`eu(diD(6~Hie*Smt{tC#?_?>>1NK}Mh4hsV6N%+^J%#^VHbgS5^?3XU~ zUhaOPf_cdK25@r=7a_GM<+r3Bw#!{zu`{ortO^8GWXMGy--oeKileX_;X+^Udy(?< z)(Hohz7*ct$OqT!#+8sgP2@}m8KyJ%xXlSPtoOwFW!hzh<}s@Nx*$0S9(aha*R*=` zBq`@*9AL~7ttaoRk@u?{MysNb3BICM4BlhH9WN-nm9XOGoFE;=wi?^)JGH3HsGk)z z@e}P-)QZv9Dp{n*5*;AsfG2wAAbe4rSv#s;R%vgQqyoUeQ(Su60{EpIP=iY&?LDgA z@e}}`4E`wwJsI0mX#9Hv@YjByBH`Z~@URHKA-bimq2WvbzY9gdf&H1g3`HNcjACP% z3%P9F=+@u=!>aFTy`nEK6<~2WmB>N~^|-fdJjnAseN74NS@Ak-5q*lX)UP2H#-6&xiO?t zHIT=0q`h0zudRf_CJ&nbFAtM6Zb4RW6`-TAMo#EO6(Rj!yhhVnffWG&$1T zspS{Aeh*1j1EMX{B99-B#0celH&~fi;0!)esdFsBPM)h5gO8{9j`0UAvjKwbaxY_VQ zi+ALY%9^mD{tmAcdo8||YI(!EmYwc8*Xp39NMls^#<26}K()iL0=}S)(&mE;TU1o+ zWj(L7IDqrC+ugrwTQAx0(~+w08dc08j7{a1VRd`1tgrU}c$9s+zlu#VoF6YM{;L2@ z0A0?@mDgN)G==tsnSjj?ei$s4=%^J11uJph#QZdYl!yCTgBSezYu76qoUQdqe16xp zRXx}JhE=Kcx^pgdwMXaH>^{BxzMS(8?U_VXjhA?nFU-wwfWZ(Fet&;Hg z(1ULFQ11Fh)JG?*USZ)}d7k=dkp%>>4knsy-{?$%9Rmvqpq22LnpLGn3F@8xvIFKE zcjC*7UTMJ_Th|K^Cy=f<&9|xF9V_!s?-J>S4){stp@{VbHRY$`-e8v2P*kVkQ~~CM z6p>BT-%kFvF+XJ-us%U!W~ zFN6%_dYyd>v#+Zi;`!~dad9j&L&zBKklbkx(Y%{ihV<|fEkB#jOA%{AQh078o~&ID z7+)bgT&p1i!P*gMA~&rvJp=u0#0A=*s~K4@xn1%s9NWKex&q^xR%f60+mLhMF{it+_+U%<6kOKZcN-Kb{`=KACWi7DVCw_#QIB zUiRwqfI!Mi&eLap?ylAo7S)kX{`!p%pUVu$=RF{N45s8(IhS-(Ax$f48^D9<4Pa}2 zxc^@3QyOgY6K&L%csrO9-QlBsX|}aIC>@DQxk)EsGJCIZG!3;XOn#r`l3!Yk<=lyF z3HAahDFg%VrX+A+=NtL?aeC;SGiuhCA(Q$Vkj`Afus6Z_atAH1|LB^0g(gv&^PLvk z)$C~#-l1m?n{F=(r%&42jS!W4r;4qd*Pq%%`p#qbvh)wPCG`-wA)BLspS&J)wwdMu z?}Gj_+t+eTaL86VrS?U`uc^HIA;mWP@|F1U%}c(!?iP2=43dEJo~N*cO?iMCkn$4v zKY7h3fjxOxILl8S_OBPG1J1uOe^-ay1&!3CadB|NQ5!j0WV*zjt|= zKtFZI)Xb2VFrMZ#xkHVrAxc0cd0P=(*o`uczmv)N=`lzO(h!06?UU5OtnhKf4^_2PfZa z1aj_Cdf_0#_wcpJn1OXJ9}q9Ao$#Mrn~g89F~uP$2~e>2HR5Crlcyy~;8I$5&Dpwpm6%i~1aHhBJnerJxZo_7;3fLc zA8pw8&VM~;Jb)z?6@;OV`Q-TDRsziRv&eYyM5zRwMUbC_5y&8p{X2sUZe0IoT>2|v z=v8J%G&+3p{~>_=eel0;#Xr&S>74j?Z?Gx9u##dvWd;AWR}?_k{bT|xXT>Msp#WdV z4un$tJ>qqL1t1fWJpa(DuO$rpJMm;Rxi)BTXLktg+Gp(Vo`(Z~ye*IRYdcfL+UI-= zRWY{DiM)$h-c2d+Ekup*3P1Zh?u-_icf0xVJqG83W0I}A=oRQLSkr0LrW3RFcN26T z`p>$pL3f{4T1nTpq0e6gY6ACfMY%!3RrW!whbbJUU*caJ2;mn1Bz+}5{1t(z6r|@_ zALS;Z?XS%&9N3DBeD%&(BUjeH`}i3kNdtBHO=R-O_>?N30D~nUUSC8P29n5mfp)Zi z(}7GxppwqfsBNU(Vm-{Y)uAV#?I`3O`a^OYk8^ttmhGbZW*P~fXmW0unb*>97O13D zF-9v6J}iR>qh+;$KEq2!*WI}t{BYD8Ak?z+*hy_uF8yHg5-Q6x4JJOZruv(45WfT6 z$*;$=#D%9V+D2*|tnHE)l??VbR*xgr{Q;eCgV=z+63%X}5iY=klEojf&CzT&g?CJT z?)fJIBR3(8(z*@iiFJUs%;3|1gv10gJGef5)Y7s$A%wlPXkqd5$Um_)-`bi})lD_!iUJ2WdDS*T^_@<2JVw8dB}Fb0Yqk}@7A zi_}-2>@QSR*{u}PBp?BIc1LdVV~|Dlbg!kcfD!!4mPk)7{xhJI$Nw5(pw5nu0G2T~ zPWVeWk`n$DVh^-BuV%5Yo<6k2qjR@_gnZF5 z`0>+lp+r=P#P?Z03Oq8q7yuv7OQ^I5GORnK8A+o5YlN9D zt_ka3OJb)4S}e7SKM$Hs+@}?{lwRcU12K#4(aasu7lahUU1r2}yXa=Seuc43f7?p=8x8|Hr+MZy;(6Z-M<&+n3 z{6M7lKfgabfb07NNV?S_Sk0Xwa#uhlcC@1~dx19Wv+!1oFdF~m+4F&7U8eUbfLXxaXR@=H$72ky}!0Mk6wRGj)pZ*+ER(_CJ*d36Zha%qY8W}077^*M$Q#2S>0gqH~j(bRf4 zr5J2mRy1)n6IxkTD>TpitAtP}M&j>stfLVm;PL~__YomI3YgOJnvVwFDA*k1&%RKL zwEsXP$Nl|JKZrR{w1XmD!)YKS@!nPR(rg_xa$~O#ZMiyd^5Z6eZ9WlP^}?p1R(ZT` zA?~1{Upz1!uys?o%IW)s9V-utsPSb?rSClGy{I(b`uuKgBcYQM8}0`D=t%!Mv@Bke zU}hSqcsY{O@n{xlHOnD|AW3p@JE_ReZkx_f$&9~wM$bp~=l<7N30;2!gcpdLBQxnS zSppJ>Mx3WOrEAj}1w&`g(BxXS=_Iaw=P3@txc^G|*F^?TLh>HM$`?RSC#`TIpeOO@ zq8~OTJqCTiKL-99;pWJgYmtZ_$u8XJsrJUc0WRRmWP3zZhUA=}ryHH#Rj*g)VSFV8 z=H23&z?~5#R0l6}0P?)m4K>)ZD!*j@w?nnduOE9~4*t4n;xN!8##WD?qu%MJuk{7z z?!L!)P@McmLV1z9t(dVM8LEeg-r8V*|5MaumqHpmYLoY@<_$zH7l1j~7#9v)-)xpI zA2^We;8`HL?(dwEIXuOla9JQHg2m^GTHar`WXM`)M|vwxah;WI&9`rePkr}x)Ph&pm zHJp(=8H3f?=;u&hvSo+n7as%LeE)(09hFD022NTN#Mc~ zZEx8k#nkb!30ZouhcH3{9?ao%OoN_9JO_EvU+8qQ#qj*CpMr_+&z$#UQN0f*XJW&^ zL(?bn#38Em&?xS;jvhIG+0hqYi!YD`@hU1N z$=8%wm;<5hM6eiIgp}&~)id8ya^u_Vs-Z|CLpH**7n+igyzmSG1~tU38?*(qeShaW z65Ho8QI-lH0x`L#5kFkS@FE&~7wHwFsALq+w*4dF7(>bpq@&#?#3f(3C%3#@1x_7= zV}1oZLw+F)tYu5Wh3uto^NtP0jf~-7h zC;)wmtxC}>b#fy<-$9`_kk=M%T3#)1uiX|-4TA`GO!(&$r_jo&b4-*g%_hq-7z zcq)>q8V+HWuIOb?@EPaLwPn^yIPix99P+WsNNIz5{)+_5@iPJ+}Jq!n_1u>K^8~SOXKT1fK z0HzBPRz2^#p&AswoJV9Y@J$vZmhe(^Asu*GwuAvTj$O#Qo)nbgyC51tWi z?W#9>+#e>w`hMd+qA_}Xn&vHt+#Y^;!CqQ<@3(h|n<={WtX6aGagvJXAO&3h-Z0Ky zGh^?RzjsIhvd;r-v|brel$op;Zb)Ie;mOX3%WwPPMV{H;C2w^ueHGA}Iuo07-+ry9 zO%k~DP85@yA0(_qH1#e@sm56W50*Hhdv1AIeU4ydm9AM!UM$e@K=F&uyG_sdvt1k= z^v6uYl-SO2x?O=leEFUDd4ln~XL~o)BEqIc*8O~`@7TPhlT-8V@638nChf1w*V2`K z6PRQLWxf{p6Uf|xB|%`4*e(8=Ui`*gZQ-O^gIXSSW$gOZiFjV|CT(G-te}9JoY?DU z9{onr8DuMcIjGI?NlXpD?yPPS)FHu?bkGU6Tt(r*fa3n|Tw-*|JBB62j)(E)ZC;`E zkGx*z;$`%LiRtWX;HgayKL0{jm$&JGTjnDO8Yz`T1y&9nI<5*#BK^Ok_4B_uw`uuQ zP%(d2gb}57QnIOao)!U4St}6C+YsqJ`yB~e-qt^$IQCfBk6CAiz8nf^{6)oQ{l3X*WE?W<%Q6ROOBFg@O@!%HaCv< zzTnqAE|RW1=x=GM(tQqI_KwR3=-(G%BIRrEVs^7YY4@^h$^1~e5hm4sHI_9;9@57T zJRf)$y*_`N-K-^9A<7&JYTixc#c&J|)y+n!SonDJ$NOQlJtJp{8e%VVW2xeJj1~D1*xl1JP zxlcU)cy0No>gvJlmaVg?Abhd*X}Ksk=Y%WBD5H%4V-3N_FLbiw&jp7RXlV0kWyh&* zl%4~wVp?7I&GBJ?`1B8z6Fk5d0n3?T{k}Z~p<+La^7c1=6~)0b0xxACCS7s?vt9l? zm?8&iJWiC3ToC6V(@jT%CT^2s9ghwiHiYn@lB|fmVgK?8&F0xyy z!4lz^_lV=Bj=7w=F-7FC-B&jikyz^$NTFG#CsxcV+lCI>h_mORoY&AaYucL4EeYr7 z4mY6>tFl$c9~zkK9In^VCr+3&69iq zCPoHf%n-}yfEieRR}XEixy#B?5uJ;I>z7&vkTfCPlw81M!d*#7c)T$B-S-f{rOLNP z{<)-%YwXNpfPn2H;~8_0I^@PgQilQYD%=}_73f@+%ePh&3K;n$U-<2Pe0J%NMx~Q5 z=jetlucC+K&i_c-Oso8lb?bUduoBQWTR`*GJa!JM1OAvs9l-ccTg*Za&nW{tJm$ZJ z0BApUHI9&MooE!kVIfP;aGo~=&)TGahvX`hgIj>S2L9rZ|*GJ zM>SyU(#Aa8#~7>`3UI5}Zn0n#Hw`ZYtUIo2pG=yeu#8fuFxTi8oS*)I~Q)=HZm-^ff$C93} zsB|&o&E$Vp3C}DV0lLL5EQgg7VE1rQHF_i?wQjM4yn)?q?u=HoU(&C`pDf3$q3o7j zAq5&t%muWFP?1ZNA_jj&1_s+cEpTs9yoatv&fK`+K4x-XTkw0vsFgDTQHnfdp|G*Z zdd-C*I_KNuN0BLvN$>|0PJ&F`$|AtRG*{` zbs9p;HL_v6D5LHWG!fRZI+0u>n@%qBb$7H;Y#S6V(hsAEvm2m{gw!>Bn5g2r^5V!> zVpXLJ*P($LVliTQ<)6|v-|6I{uotI~_`MsX_#+7kCe8tf<+9B^T7Stqj@#4b#0MD& z-x__=zrr}lrM*2`o>_D+He589x8L`&{wg!N*ZQIw!A~|Ujl+j1!~pVc7la{C0UPiR z^&=bG=CzrUyI9+_%H|Rf1S*+%O`bc-ZSt#j>OMSkuE9N*$b0euyO6tpf(suXv;rfn z;>g>mntAm|+^I+Cj#0LkfYnb`NHBtiN0$HAOZ`*dY%}H_c}TE{PvWt7Ad9%DOVSnX zlqS%^=m*#8T5OHWS(YR33%qPj)wc(IzPfp|bdkl5mKMR9JHpWW!5y-7)^e30Y$xE0 z_u-&Li7DN$oYtQxMwIR9Vz$JO5c%uu<+t@zfj6ipS-D~##Vk965Z$rDJYUmnxebdU z>%-Xk4sJ;FP=LG?=lyf`&&~pV441ABHD33yo}RWiP8~;;Uwt)sJUCbm;{l18EmWty zp|LYZm07B+*|BL0B$p_kKvaZeY=b|jm1tcXis5CnmW)X!A=Ni2@I4#VY`W{l@~&t! zcyyfH(%!Z--(D$lK1bdXCaMq3c$<|jmCx4meA~D5Kg>h@_b3}1!3<)C^3MMEw|S*i zc-E2DNwbWbZ1U;F@JOr)A#0c#sU&LYlt%jSg##_hI5Nu)(kyWsCp@9rEGeQb1qnNB z32w804?3eTE6YW0hzwroeaN6@fCjNhA#OE74_W-t9h8U>iEBBc91L;AJ~=2=c~Rx( z&tMu#yG^rMU??3kx6?3Gh{PaoZn5#qp9H6rD<5fkZEOvK+s0b4*v-x8mufyV_a76K zpr5L0a-p+p3t=6|*UUA>fALZwKjx_(S;yiu-!$o!AI?H;{oO;|;{0Yyi!A5zI(gD| zGpReG4VvC6OB9HQ@w*hVyJ-dicFk($^+6z!EwIcdxCqeJ>G$sH*`DU<8w@* zvBJjzyuo@ZfKPcdr|h!OLCyJOvO&$ScMP*DxE+AYY_d*MnWL9aHVNi?6Uvi(7;{xf zjapj9`rl9~WF#$HHjn>4z?xO!6MM@l@8g@sy6q=@_x8`hpF69dEJ3hRZFT zHo(jv{*7KwjwL=c9gWW*=HOW+pmP@S>F8d`{ebiPIV^j+br|6o=jRn8-JpQeMumah zMJoO05yaZ0VVh%$>ZnVBzdeKgw+<3ubcf@b4aZ|LZvDrxWs)ml=r7vgBo=f8A6a=K zHdm#r${-y`L`51hZWxHP;pST$d2yc7E@2m%mqN<;p1Er(FAFLtyiyg08{ab*kA`|A zaWC!Vm&wCoTR8NyK{bXD`6lLIN@*;`I{gQdHiQ%0`@GF1(~HV>DOu~!8yZrYYBFf7setHAEb5mk@tH0x;ne)Ns<&0j3P?ud$R8OX_5 zvBD42h&1Bo1Ypt^)u6o!U)w6Lk0-U_5j)R{Fn?^#6y!xy{aWnBr~IDCeJg?3wB;TQ zqeL0l(8GG_MTxCGUoL8S9pgFTdqpVQ_?`nyO#YB#u(OVL&Ku)4HFH74_6NPF&w(YJ z_QixS$T@y85iq5V?eJj`?MQchBf&A*Q#yz1OmhpoRg6RG3aoYZli>sFLgc-y2@Lgd zujD;-nhc~n_OM3~N>EIROw3R#f=+VXjIi3&_0iv?P8p-GcxYZ*;J{|Z!L!*3DsZ|E zo<95Hy6H09>1<>!E0SDb5PtKEa92VpuTQ`mjQ?9ZD_|su-00;=%-)@vA?p5S@Qp^j zgDWst1@cj#swuxL>=Tu4Th2o;C0e0C+F4kVF1b(O%{c35iYT}M-Fi%@s-t2NLTkmb!qYn zKy~{-NN-i9sO()BPn&D3#pEPI-74AjbNx@Q8Gm|rl4;p8=o)_-&Xne{?PH+Z6%?x4 zzdrl-_{|CpO&DqH&}+WI8!M-<*uiw@=es*e5fXGKGjth3r?UB=j4M?Sg0XwBDYJPy)k z+fpJ&YXckUcU+y(M#<)=+1}J83Ko3N2P{03nTtCR->qU7m>dq^j^U?%gDNBH_K_y@W%Ud(OjwVjOr4Rqyb35yDiTmZRC0s+XNrA z;w3BC-OfVqGO+&}`*o=URvtZufW)~+jK*;5k)e9R-D@J;)SJ;{Xb}RZ(nO@Xe$BhG z>x7-0NctKUv4K{EvOP898)RE%Tco#eH%Cw=sMNh4ZFeGW(`Nb-us(>f>=GbRB53VaC4J`xP+#O zW;H4lPL=O4*n9F2k;#Y6R|fILu{D1MBt^bG&b1AFJ6jiKEbQB)kJUZy4cD%Chv?Sz zU7gnT=5HR-*)4lnoor|RmL5_)>dv&!19Xde>F;Z9x}+eDo!sc=AZBf%E0z#ThD#(P zuk29ckVg)4bri(eZ}(ja$_Kre+Z8YQZ)n8spKsVr!@ScyDxMDI`{edT{{@BYq2@mJ z5)|VxN4b6Op-Pb1gj#}jL~thxtJ3kB@lrd!8PdY8XygVPefxHzV_K)`^R026r;4N z#BAf?DZV_{2%u&GQ09nK33#jn3A=QZFi+@GNHV{{E@mP|c)%%w z!WzzYSm-GxhXsaYgttIl&9l55A}wX1WtTyF(P<_0D8Ws^CT4Zr2C&oL4#JltHu^hjyt%z<)=Z6g0BW_cP70$TNJqUaA3t!8F~HKCd?@8&4!RH0u#Y8xsN>2p6Hph zQcJl?`CohmHPZ7YLL?xYsh7zme}*hqpRo#bkKduIpz62BG?o*uV3)ccXt$HtExb*M z-J}wiJW~GI(*`hfdw+@M(n^K8QqAj7e0mmB73;Tkbv-|?f`0VHwXQZ?{w#DC(^mcZ zS?I}ZPcF-#Bf84I$8BhYXK+;pj_CYCo@8<%K)T9Ja?T5Rimox(`!Qz`ah4rTIAY6g zX3Tc;GS+mR;WATR%-al&2=*eo{BF_V39&$}4ndVFuXtR!e7Y@X{q)$ex zV7cuOu;ll%qZ5xDe?bIub*yZ!S&hN-zFu=LKM@8OV8y2)!nRO2?QM&SR zS^{3StP4IekH`2X$k{b}S*O;I*JZ)?qy}qsJ0;4~ih;ikgG9_x*m=Rk%dF5*viro>5|)Ke^%vl z<`MXz4VDqB--^sAE?FQCx&QihUpr;o`s;=3_aB5*gp>pQGsPpVYuBkp5TV6k-ywC# zLcuVX2CKI3TO~zaBADprS)6w|+6@k6v1u{$X2r^{#%g*tN8mv&#n~x9fCAogGCcFL z{|A%NJAR9e58UYf4#+>6@H(V>QFvaJ7XQOP@M?0Ui+Yc5NdwZeC278inXq*TFH6J| zLI9gg)R;))$gi~7iF=R>Mfy*%GpVlh_eVi^nN*Xs;#$2I)pv2nBuz~DI3aovN1mB) z$=w3sAn%|8lRUXvHzfCAu2>Gwd!ju{v&KSzadt4iCDQCr20*CFOI(vf;in^F;DbSo#Z+Iy$4!_SBq=a;*v)rI>Xv&&v)m=YT-11hiowH zellv^8h@5Syj-OYFmrO@r(g5^^mDvNE4CVtJSQ@?M=7CR;|ydL@<%gS9U{GL9XUFP z(?9&Zw}%qt7LoV~gd2U2>hO{RBT0h$8yf@2AUl?B;Om5?vpJ|_K<+WZ3P~R)bEuza z#o~>8G?`f-KvEd%XpQpKwxZfuMcfDF(8*Q(BC>J?A>UW(JAN7;9g1#dm8O>PQZZ%P zWb&ouPm%=%V@&A8O+S)@Y}BQ_%tk7Fq#}6L^3OF^n;kVbkpy`QHFwa=F{>(t^8snJ z+ks6pV};SEbI5&dfT7n*pgj%gWMV9wmgG5WGW}&dHQ>Pn_hsWr0g;JT3-6=(19lo9 z&cOZ)Cz=h4Va}_t`|vGr;vud{onFn)CtPqLfF!mu{<1KONEt6<AELF_t*{*bRRGmR;0$MmHb-;aa|;ChXX(Cwv5s2N=M;f%(%nru(qroR>(b`>4i znLU`_H}^$C;2PQHOha<@V z9Sn1}NKLJ(jSyAfMvGEzb8?PtYJSZl>3j;{bB+y3g@d(Tyl&zhJ-%CWWg_4y0`2KM zVV2WQ0d+Y4K`o1dWv1521e?nS5eBJ?lBeGxi76LQXM9n=^p@MXn{e(Iz`5}_@$pA= z0?y0Z21p_e7_7Me_D8MEG=GPJ>qmh$#o9Bw1H#ayFcG-jnW4~BI*422^M#p~ty|f- zM9Kf&L%-_>_QZ0%(evrmGCN)7H;;Wks;!`yASSapLgId^l61${r&*uHy-mNF`Bm`v z$a0$U6hnUThMH@yvZnEVhduE7N@)U(J^3|^2_a+u`-a2drnrJ5mDdio~+5hO~qHKt+^ zZ*mA6%lkFY+$H56b#<$SqnPavZ+ST4DKb{!3$qLVsxRmYg)>A@~M?IWF=-OrohY`t-YfkWT zQom1&_cz}~TdnfAkT@AG9TT1TK!hSHTKx15$r#yG{oW$=$%Rl*@Fg8r#|%H!ATDA{ z`;`YKtctHKZ3(lj$zi+B-Z!u4+RI~c5-`1V`*@J!u|+!9x9fZNZu$VfszU{Z(zA`d zLQzIH?oN<}0h!9~Xe>``!EQ|^p4VL$e4zjaM44<`vBL`vw>zr4yj7)}lrlR}q!d|& zIVbbP*$d(Q@?5dJ!wwC^_JWc7Fz;ku_lkp}amS0^HSub+)5F+eRBat%@%;3b(JL1$ znqDrtj=-*EWG{AHsKdz95nY@kH3u3Ujs-;8W+J7>NBW3S|Aa^}kpcI<_~c5WVS$*^ z!p+b|{_YTj@eMHJYmCSx0r^dsIlim;g?TjQA>ecZ=RlUdo3{@g zR}cuVk!6QB=ZU?pa58O}es)@P(1VbRH!1H}o_gQ#UUmSy&hi)hLR|j24e>7^j}m19 znc(8@I22$&1!~2=E%9;|7#uPFRI)I@1%5aAi&+C7FMxsptCA1|Dsk+O8t`|Dq(IEW z5P(FN3$P#lYS1@8*wYs*FgTR&vmE3*945v3gepfQmPYyv7=w?c62}4(Vtock(9psu zgO9Rv{F+hN?J$VvKnjO{fohSVgbs`7qrbnTU{vrM1qV>;LOvd6i3R<9s|Rg>&rt|i z?Se!zLreIxt=A%fl8|FsXdfJpN33JhCG95ZDU8a_Byyq;{Q&Aw$KzMRAZ`ckB?sZN z$8^$E2aF9kUJY2@N3Ve1;_1|*rcRoxJe2%7At;{KYQF2P6}iRQo4c65+0-u8 zQDe6~DIo9r?JM!?TMQ8Rwhr)EW_*{pg*?--NreOZv^minD7>9Bl6O@k2Imdi1PY4f zLQ-NiIzPb-@vGGq7U3yZ4?`g|ffovdKn8E#;lreVI67w51JL2UAF9H~pHmB|!3&Sw z^Ctn@>fPT4cUP!$B#RaqYfKYL{Hc33M+{ERcC;^xg~;4}hVJ}jaTuS3T7u$mG{=rs z0h!v@Iq9a&MpFg8RX`^O*?cBkqAPV*beW$fN>Acw)LsC$-O@YvCaFCHSPdZTQVht3 zivznGfjMs=c!a{v3ppfwto3PZ!i^>%KX&Mm#yXoqv%NLDIkju;)`PVE&8n*9 zGUuvw-da2V8*l$QKp4pu@-B#b@=<18sr4YMzrUnJ$naeI;a9P*A>J(QZ+O!y5zl1v zt|s(u`OeE%ISfhuh0Yyk0_-8QknE*Aq|z3;g=1pA-YxcMZ@x~)2DH28`VI&3r3(>| zwcKyz9BOEZ!d^jv^jkAL-_VYBDY!4(;i$c~5P-*${=(t$1!^G+V6mUFQ?DG$^ zpR>q8gKbhhRhxW;sC#8AQV>52dHv=cJ`@KYBI}{*08k11jfq;+MXRpUMcq(A_;BZuCeU2@NpBz1Ny0yR_o*A1TN!>QpaO-zL+DNfRNEP6hHKgk z@}eDiWZx7qPD5=A=697L$e7k8HSiO~O$(9)CXNp)4OGSon1fnke;Z%TykBz{o2fbK zgjj5{1ntE(*~9$&Sq<|1y~wjx#4{|H*eL~w_sf3cjeqoh1o3GoM`Q$YtLt~n|jiC|2#vC-;sEBSed@73`bkKIrozk*DNO7{(Lfp z_JT(HxI3ZxOFqzJxuyy<>>Q{B4;+%n_!p9RHu_@XFCsCfxZOb5nSs9IhT0bn#&_mV z_nWJvA|)!@shz59q2B;@cMC(q0V6-#X^*Lyf#J7wM_Rtw2apPlw37hS$EXTaY|8-f z6hw5G+Xe}^PK1vi&bP!FX8Ro18HoA52Hy->tL-BQ-ebn?kGsVzK^dr#*N+v##K1@Z zd}4KAf3~%|G!)7BX81-Pk&8M>Z}ag9$6BSrKQw4i?8z%)guZ%|^l?+cyoD=a}(;Pule+FGe4? z)by$o&AWC)ns;w%h%#8%7>v*V6yMH{x7OrPmjF{OVgOpb$Mn!IHO5jX6=x9B?~yE* zh_di%Kd~?ZuV7>P@*0i9Xb}Qt&xNM?qLb>4vTnoBZ~h~1@T&^z#y;!vFZE#dE70Ch zb<#5K(J%ZS^t{6bpJ{yJl{y5}I)J43ym$Oz>E3ot>i`!r+`3#tx3K8`1d9i-L2onL z-paV_o!&2hZF7-S5Zk!g286o+FBW$kO7`D17M_M8M2O_P)Po>?q8HaDoVac6PU&zu zY#QNuhKu!{;~Vl){&|G}TL>-wWNgm&8~ivC^RC}VI>#Eis?igWAy(+@rLh9K!-;QC zF@m?8N!5=LLtakWuFhSQg$ril0?fODdcuc^<{-}+B%_7u69}u1X#$Epk zJq@(s563`ang^Z^fA5JrBQCB_=ZoNSlF(&45J> zk%|3szjC)Rb_^L`a1U_E3-|8GBqY#oK!8O1izSb7u)!7-Qiue=xh|-TZi2y-3 z_~A$ufk`5OW8gL6k5(F0AR$jRJY)3ZV1#l++zS8?k}rx@pJVt-MF8F?BPLn%$Y{t< z!vS4CI3qpG3mIu zx`@Pl4`GVHhowqZj-wV!{@S`Xa3kdnB>=|1%>~d8z>Ck{H)mJgm_f~2Ol3zt;!$rQ zN__wk!_#_Qm03gvNyym$>h7$gqWb!Oe`XxI8wBZ+MoMWEr9rw<w_hM-T;+Mp{6S z?rs=Gy1NmOM!Nf+!SD0j=lT6{??3mi>vApE8qe&#&pv0@`}29dr-wZ(fxg}%_Tb~o zrvu?e-&xglZ=u3V!qxrDopky-qTnySo#NHr`8u>lN+6;r2C(2!| zY9}mo5M}ybM>+!UflH1VhLQU!9j?eQylO(iA4n4e}~JO$7SJY!ZaNk1v` ze1+{DudB-H%U^_h%)7}=J~YI+R*uFjAMcRO@28888@f3SzCi~^7sn^HtImD-c1A2+ zZ9ZJ@y;R&ydqWrte1T|w@uE2H8yX7Aglt6TRN#2N%$wfFst~T%oO0FRp={f85(~5y z5Y-K}e1r$Zt^<;$BCu#S@6|3!DI^}@V=8Qw#slva;CR2%XFh2w!b4F#iVeCh-Hr;Y zjp*dI;xMbsFXa89$qZbG2jiT<`ms`QDbln}c3XCA6WX6fmKCpPrBZl%Nu3b{pAx}C zS^aWqxU4eJ!i2CH-FgAF1toEZ$imgQ$5e52$C)} z?rX`F*}SPU&cQHvQ&|GsFv@*|p-K7X8_~ZtKALAn=c$2mXf$^SMt)^a(ogxpOF+$d zEk401=+7Vw0jK#bm6%v@RyM@50L7`&eG+-`wjbB}vhWrrtC}=0LahKp(Gj$#-nrE8 z6Es4DfWc2aBIPytxy+)uCwt_jiH~nfE5P6pN+&`%gh3@(#nI_GB)=rD1i^Ygf1@PD zz$~d|oShyQy!@W|W7s6bdxi@JwS5N3`}N{$Fuc2>xMAXtR6Pe(1;>(<)*M>3qZte2 z6A^^VmadYEAVI{baOBO`9H4T~eEmI(G)zZpWQV!Q5zIn@LNHa{Rq3LabrR6LT=ywq zMEG|oBM*>07DG2A38*c4%_p%Tn7f#A@-X z6u?d|0{Mgm;d&K1Oc{rP?qCW{6<}aPENt0*l#iSH^}`ua%L|!npn_t*1p-xIRr=^< z-G8g3N63PU)ML00(|TeneKgv%0>&S1X$|=KAJrU;85YQ}$zw)@nrQ(H*~C4ck_RYR zAO%|vBt+_QbC95)+soB?g5>0h!Vr$r3MQ7rSH>d}D%gE9)EH!9`wEOa;RG7S4S5i5 zxX|sF$t`^DRou{ZN(e2mT7MzX{W3U%bKZ&v`+6e9&JY(FHfKfzsQ_liaE`Rh9j}@M z%-y@Q>=Ad0){Q_k(m?Jm=)qxla8ncj4ry{?6RDpU+$&(#OJEF7`$@a?99mAwK-*MV zbu0%?P1d8R5u*eiTDkH&yWN@UiyT=a~G5_Fdf3ehldN$Jc^SGMdEAyp$0QQ3i$d}rYxHyH;WsKyZdCb z#-A(~nylA()X-Y%pwze@H!fD~QYchtLPD#)|3D{rm8CZ z77@8ASBCvV{s30`cRzfSAb$sy2w9T(MX%4Qet)w}h5|Scg2~l{E9iB$rdU|eL&~KL z$I)cyrw~-6&R|SL4h3H<@tmfACE1MSo$0(7)9-oJ{W{_&3P^3+R{p{|55X#-XCp-7 zcb~iI z;y#0K`G8+UZY*h6nXvhr!jZ=vuRgw9Pt=!2&V-ZJ&18opq-hMow>A8v4XOdI(9XUj zm$6EH;h}N(3rnj)1PPZIex9KCJVnvLXS#ku1Rf93dA>m#TH9wSyis~r$j0$WOw7QE z`pRfP`#F4Y2ngea^i|R$g%cRLFyw)NA=86Q`#lo1&DM0}YZvf43Cn*POJp*_4+mq+7aZhmY6Cux z-Ri9MA_C(y7+DeY=saVvj((+PV@As`Pe%b>h#>XSs>%Q#ca` zQ#mII;e5b(`0@1$)`Q$%Hz+`trIv5D-&Gz-4f-ImOwfAb2XQ zxu081>2fe+$aW=V6JBzHOEZHOyhmop_GqfXb+9v_TCe8rr+M0-8?19wE`;RzI{u-}ISP>53hlHRAEU$s)U2R^_?vV3`BJKLF*H>c>5=kbJU25^smIpC8#Fjs|>i z6avocY&fkKo=+^a4z;Zpd;-9s>)p-W3BH=3njjS;0DnR&xhL21_2)v+d_a=T@+_$Q zA!r-E0Vw1y*I0o-=G;kdAP~4EG_E&=R3X8&^6AJKHzO2AhYSsZ>oHU&5DDXg!%YVA zY!Vwe@Q~Xab0U*N9QZAq1#Y#%0jG>15ZJnf#gxcQV$SivtA5MDT?cm>XCLE-2k+7< z>;xEtQ(X29s9^G>{ExWPyb7E|^&x<4!XC3^(r50b-jG;&k&dw*C`XXijTAWT^+f6~ zsKX1ksud@A{BfQMJS)k1j;8BD0|ItzEC{4NDvB{+WKBf%KxgH=4GT{(2!#{t2~sA{ zaedSldt2?XLp;_1*NjPpRjDA>-?g1sn6FP~AGCacv{93oe}N0G#!1XW0G}V~mUN(C zjNC@_)s+60K=#0Q!IE{Mq0x8j9N1~<{YI9Tb!dc36hsSBFLnZEWuWA<*U05UhYIa@ z5KAYhx{WPR{Jms4l4OICtAv`=gQg=Sw#RA*#^E8XC%08v;>Oz~w#JYm`DKaW)UX*$ znWxSd$j&nxf#a5+4g9c>1X^OA^f!&=e7Qk(PiZPFF*(KhA5l5!go;>t{Rj`K3d6Hj zCwS+P4TVW2&xFM9B5Qz}FkO8-Ucf_siXh~Tx(2(F79bsxkSV%-tUq7v7(XpIMb-$x zx4CKyyG9lTl#ba;aWv8*zePLWX0Moe`*0;MH*POP|LMz{ds|T&!I{9+#zU`E+GMZ8>HjK2P zfbv3~m0cKE(eS0(?>$<_M82r#7(8NX%d4)&zc+?uZ)t03*aSAtJX5}Qamwo|x>P&& zI*d>w$VsalCNh66O&4VXyK_oN+W9XkEfN{^nnu{UOx^dOJ(vaq$+qIZflyCYKlTzY zyKE(iHppFQdh!@bRejcY;_7%7N@=kri)@U41lI1(RCz-{obHfJs*>YtHgp5{@0H@I zlFh~w!Q#6XSAQ=n!PsR`d-Uk}bGTkH4bi;5(j!8ozE5ia;H60Q=3}cyoigu19tp zAjD5os#GzQ3TR)Y?fuqkymE$m+iPoS32IZ5&2E34 ziZ%2O7K)^C+&%`7k7K|a>U|*?YqwQk0E)P7XVJ~(VrsR4h5sg_xgkXbb_4yGAo_Z+ zw4@Y1>6_&7L+H>xWQw`uhUKM_$&lB(%J*&unv=HOuU)-uO~>DvCXuKh6C`21Op=-5 zJ9e2ke>f2m7GmGf9Tb+Q3y!>|-(k#A%v*0)CR$K_LCpyBa_@5=M3vInK9SI^p7mIL zCxLyhE#*duWM1Fx zO_}~a`wDBoz>f=(hgaR4d33=GF>lOtKDX0)FHOCwLLnb=Yp3&01Fq}FX2zty%})b+ zBz;&b0V%rNm?$k47w_pfVn9sC;C`P?1a5Y#XNwjhtLMD>Wmv%3m=;mPk})Ac@fKs3 zMqVW?7bq`#L+!pj+x4ZI0_CC8XkPt9OSyEmHaf$8DJS-v7cO@~a9bEkzm z7ZuO^>>;oFy6$#GHMW;u%S6u7jEEyXxNc1q;M~k*VTbQh@DRPHf|XFQT<+$Haw_G-CJHzZ9HBAbdn0jGeR{3DRMYI!0d>{rWu)zumx(*Nhq zW%XEvSc(~VjyudwLIYh+(5$0V%bl-$MUN<}^s7;Bix_}Ygkt-PBEf3PW<1`DE${8l zE)+$$$k|f7i~wY=3huQxyL!ELACX+R8h`COC-l?yZqFqSrC`sApB|Mxl&^NncN4FV zPs-I!E9?5zD~WV$j2%zuEj;g!JC#@#{s1^xk@K|Nu$KG>dacVmY*O~D|8C)QFDJq= zG|TU9^(^l~__n+=<@G~T|Dt~TwR_bIFVMkP6^hyu(F!A98#M`|)-$UzZT;Gx3{9p< zyG}$!4wLzAIP*1DFVmjKxsU|RP3_jB!JB-b$FG+TaS6J6?wM1zmEa6Ni3Jx0usCrX z%Z+CI8PbOu>qrMAx%;6#CE;BM)`_nKCA6$kZupkKjtw|$}$$$LA^Q?1OJqAhm25t`&#O@X9}WlSHm=pz;& zTH_p56RqjM@tk(zi}`;!i6PXU|2|f~Z*8sQzZ1YINckP#gbI`A=h}NGOVIIU8*}dv4mKIkrDA=Qvjn8PcK4$7<|+(Aj%Bq z@qM*-BZI~Er)sJy?~RBJX4EE(OEn`CY`GyDLN4TgT-2YAvw`l2WpAQh8jj|6nf;4| z#g&F*IhTx#SEzAxiB z(m!tS#5#IH&WPKHglHl-3fb;FjDHbY-=hPaDJ&nnVsqRg;`l_5H)25 z%rhnR>l}eiq;aS*?`U35Hd-M(ve>Fhei`Qag8Xb_fq~Za+1s)P&0K%SjR?KP>R@VK zTM3tLLBqnuf19`ILwDvSR6Su5)cDS3{8v1QYVD>$g2B~NgqE6|H%1|foo0ShE^TOmUY?W)P2|ZJc zoVi&oA%Kd?4$m_B@KkX2wDZk7%Q_kC>3uohb3Th)=FI!x=`z}+5Z0*`kV4pMt%O86 z@ui!A@WIsrD}5PmD=TvQ-3NDYBKU%iOIN@6F8Hf)j5daeFL^0BVn(b6ue;PqVOImQ zNn-@Fy`-M}HE2;d`7!B4+(W#te#WvUX&MXpi|ussyODYIXcOB8nOa%tSCs_Nu-u+V z5b3}N{6Z5v8g&w5J*7j`?%XI5XW1pE8)c`)iuH&rU2D=oex@8{k~HCw3!3wxan_Qu zb>l;ysJh)yC!rR$%r(*U&+^p_gB;9=kBLd21LTWV0!H5dg(GiIJ0;fDdYWm}FN7lB|S zliqK_d6vV#efKb|fq&3OaQpoZc>5HRm7I-*MvfL7V>;JIv#UBkb*F12dY`CE_UFrN zKnTC{2h>)9YvT)_0XEnt|Kbpl1_8qJic~|THQ$B)vyipKn47xSVz~|S6&u&0B@^K@rDxtp*d?ZqW`UUn?kr6D|ZT+pxn1&IG6#G0X0zJm-ng*weUd;8gq+w z3MX`l`&ULkr;*S`S_XQ~ehU zH)3rET7&+V4u-KI!*3uBKX@sSvn;9#nQKW;!FQK)9sf1(7@QJw0F@jfrH3BU`pdTB ze;lPmW?$TqASeo3Q)2l07AVePL5<|dt`-L?xIw6A_&$VZm3+?U~? zZFd@8E7lzem+@S;9xEIQQJ!^8vHEk0^=CcFS!#0KOk75P1?S)%H80LLgT+_hgz=u| zk0u)&Bn4fZFG~DR0Z+sMa%@(4`B$!2k%fb59t_33nX#8sRg#7_Xx0PHeC7YUu68Oq zH^VvZy{aW&RZ_Cj;iuxYl;3rU1xmf$xF(v_k#<)!iE^Ks^{y)5SLnMNUZjSc9AGRY zOHc1xu)USddI$pLRR1`#Y^3;;*bKO`TrjCZu0hJo6d(386}YP1d#+tr@8D2z`SfBp zRRt2;W2mLa#s<1Of+etaZ^U<2s$sol-fi$`IIw?o@v@kRV4hyLZiN(7v)SaBkXsEG zZ{=)lJnG8q6!DL-5^Dy=ZUaXmXc zUAH@X9r*Jzq-sA}GPPjt2m1(=j|}G+MUQ<)y8=BE&l^_wKi;4G&V%5Hg9)d0^cgC zTq5Xb2u6^WW=+(KGIyI&L z-5?Rx4x7m9$eZi4F-neKHgCdUr)k$a3)hmyLyc4SJ)L@^HNcVd5y7 z;7?6b8&ZQ3rlrzDaYevwlpI`K4N-zsl6mo@j?M(a)!a!jyqY_YS#oH)Wo?L2&Wnft zvjAYp6MFJsS^b<5A9Bu4KVOou?PV@l4lIWlm_m%~eLeMZD`}lLD_#9$8}HDd7#aQ4 z|32h$@Us|Q%)q)-XNhU@EVGVqs=qbYfi?@};o!L7miz$(-6357vhgDdwS#~W5!A$Z zyI&s*OmqdR zi#{{aJk!y-V3RMx!^NXno4_pLnrocsYRFiQ@{!GwQTC|*85`N)I7)qs#>nO((HA%E z(F3n#s{l4h!$$Sb7b8qG*@=J6mHe57-u{Qlw;WNtc&Ccr3diWTjyJ2(&TnqbDzNu# zp?;6!Vk>$LWD>j9))G4nmja~G>aydEH9*K*Q1I;+=!oVr?bJA@Pv=w6o?+mQwE7ZR zkdZVPx&SjNhfz*32X&fi4DFfXfbc!`(H+_s7-R?2v$kJl0=!1F*y$@ber|e~hA6X1 zwR=225k8M7PEH5yZfv&>=Enfb1jR9D2=(B0bF5>q(H<|R zsAer>uzAhvsR-!X;Qa||ul;&G3#E5xo3mg}e)excD5AYip-{@rFMZQpm5<0_$i;X7 z8-y`L?;l)%NlbK-N2D>o)Q`rKY1YxWA+Ek#62C@AqKx1+9xUldU|a&Kk>{C`lc5i% zJ}O&rL`0h*H8`*}R~S5BEF0@CGh;E&@lEvKsP2GAU+Z)v0kMHn^H$asV}N`n9;kj~ zGoN=*AoL-pN@*CylI&`3niIB1ZX@-||C+sAFFNxC0)_ELL$rpqEKt{WS^hEiu9G2< zGag*mz28@#Xd`8lY(+(u#`_SCT@tDQPdTD?#g!LQ0I_95ndvboKN?oc=UMxJN_A8Z!LU;KUz_6sM=dDup~ zpe|gH-Pk*cBu*EzZZZV0qjQ%7_r>=hE9D=2q`OjzZNf2AhvJN&qOwN}XKLq(jN$b0 zF)1tAHdGm@vr>lK!*q76ZUHhSq$}$1+07VDZ{Un6e1L0pUFV!4PabE@e(KU1ePew5 zwUh#fWrD+}N~FD}ZoVAHGaP?F>JY2M?B14=Tnr!gP=e!|t|{Sjp212xG))U8PxO-2 zVrO%`7yC7Aqsn#k`$2hGF7b{rFd8;%Di)&h!hKVI`3uFeiP1~Y``nU^?lPz>{qob;#DiZ zB`Lq-f;sttl%E7S$IR*4^de*#PFJ!iH*va&f1oL1c zPQ@pj6Tw-31oQc8J~oxcE~$-#?v zo|J}eEf&uKodS*AL4R|{Rnq>II}W~Zs;a-m-oAP&B-F@Udh(q*8Us}I{h-)fv$*#$ zXP@yu^hQ&i&miMrZvOH0D-ZJrNpRGZB%CEH7gLK`tBCoK_GRpjqE}6)Jz$^slgWF& z2>~a+-Yx{uMomYqk*OH=u*kOqqvFRe-^L!2!TeVipP~Se!Uh2Th5lcEwc@`o zRbtG)cbx-4k8ss}4k}EN$wN$cx`H@|%J#Hz09cT+BmmR_gQ%zgEkv4<98Bp4gCXRK zkotK%N`Mi*mk7m`VjzbDmmjDl$?@S2GiM|CJLs9g-|*1l0YcC4aONj^A*PbRWwl@A z4IKuIR(!bm563BY6;2271d7jFz`e8B@ECuMn~N&`_UA&dj_&~f|Np_qt4NxeH0up2 zHEU<4OgW{C@BskY2c4|j8|xLkXRTYGez)-TkR`9n%ej%o?K+<+F+sC|wZ-q8imvAMij=$=HRU$Z z1_q*wrHiF}S&Mv702YkfDmG0_R^7?f2evhxXubn>zqlqe#z<5z3YE?Jkl3Vp5fa6( zW1%E~`B3KUE`ru$!=im&;$hqm}~YBCs=5`O(?EdLnR zhqB6CThq+%(!dY8;{&kJb+i2}rGCm(`~9E#aE1^P)I@X#+foiWtJWvqD(Eof)D|li z+q3${v3N4vUu37WGPsD;uj$Sx`7F+WM&N*dU(KbQS({RWO-v_|J!FO0!o~bs0=mOX z#|QS$H>2tZS|63g6qBX#hfN+7@t1$$3-QWTNlpUAPssra_mkO29_1@1LLT&Tc3H}D zLs&fOR#(<@o0jfFso4%!A7`Jm4}Du?yuVOnRp%2$O*zRW@V%y7>*c_8>bXud#)d^^Lt({oi&th>eq zwid`rt8sskXrs;^Yr7Ku8Fe-^938-?UeZdj(aWrKc&%Xb$~%g~>rYaA&voUSo#Brv zn2PsPY$ql)pZb@J7QX?9zy^i-K%w0#oi{l-04#oT_k}07u!6RbPY|7wrCD e&luT)MgTrLa-u5TD&+EX>r%$6n9IZ1qu|G;=wC86e;fR6qgiQ+}$-;aVahn z`o7SY zp8oms=lJ5}nR`}gnPTU%S3o0}UO8|&-qYinyrByx3ib@>3fw70mpyR@+VdwzRv zW@l+~b7pK~Y$K0h@wGupk>|8t>dYHDh7a&lr~VtjmjY;0_FbhK}>e`I8&W2~orq&F}d zaeueA%(k@5v^38)w+yw{%^Wvlk_4Rdi zb+xs%-@kvauCA`Cs;aE4tf;6cFE1}ED=RH6EiNuDDk>@{D9F#x&&$ip&CSip$;ryf z%E-t_OG`^lO^vLL3aZKUuL$!g_OUO?buDzU&2>mgNl8vlPD)BjOiZ-Rva`&zgk^;o zr8yX;m}@7QYbKg%C2GdU$H&IT#>B)#MMXtMMuvxnhlPcG`SRuS=g*%$ebR{y6^{8V z5cM%6BqT5}(BI$R&(F`t$H&Xd%frLN-QC^I&CSKd#o5`}(b3Vt!NK0%-p*4Fm@ z`}bB>R+g5Q=H}*a-@bkG=8c(|nW?EM3P*qh`R#sM0 zQc_e@R8UZmlarH`m6ef^k(QR0l9G~?l$4N=5EmC06B82^6%`Q?5f&B}5)vw#uFU`d zEKTI4B{V^4K42`A@U#c(;J9Ny=#*%A_8MNF$PJ>{+ooSK4B@2J*Pa@cPL`oBd1VL6_pW1!_u0vFez8M^3c@1WJV0yw>5 zw9xy?iyzPOPdwzp@7#|CuhnDe$i&C1XG9smPR91cL;ATa92 zqXyvpKlv$868L|57iUYkZV5e{&^iNxniNbaDyC{&ZK=5uj~6RU@_xq8rTxsT!|e_u z;>@4b@isjo?g$6bh-2V=T+ueUsaT;pA+hR}kpJ|zcj$SUxW!v+EhM%s=CcY()KWvk zF6|`J)5>#(o+!1qPQ?8HyLXZb=gX>XeQ{CO*Ua8|9~L%?4#oh2LX6o4^gdMuj~v+H zp+JxL#ip`H8i4-iLsS6e=Qkzy6f~;>Y!GpM3|TMN$4NB=Z!EKB(}Aagfhrh{X}TB-BF{KMkNbuY-5L z=$&!+*EEhZaZ5!E3F6@ciR4=imLKfZv%tfu}e))lbds2zR|2Cjx;BNx}_0@d?HR>zS zNhV4~liWXKLG8QeLM|Yid|hdA#5liClRWopj~Z=$-H3P+AA|dM3tq%a!BzhJ_E9-A zR(YukXI$`h`C!aV#KH{Aw&apTevgJku|G=uN%=rc z+Zn%FQG`pUHezGb{#BbFtjW{3*8TC-$-Vjgt?_NjdkRK9f*oFerKd-&kvzL7=VfO8N#YzE_cFnfsoHtJ zw-+e8()*(ZyeQSHkvyh@K^sCX0ph6W~bO+}#0Kq^Gbd8KjxS6qM^!4?d62G;Vz} zkBHgrYs;$VQ$g(YpZmW|IJ-siVh=4}m&xgQeDt|a+-v7m7i!6h zy-C$j{Bke4WPX5+MH;%k4QPW3B~QBnq-B3kRwwS6t)g|?HRw^=5hH?P?aw;J1lF8U z!Jpg8x4m(n*cz)UjSHA=Q+e+GTz;Rb^gP>Ba97>q^a-h2CH*V9?U?q%DgK-xjFzb{ z;u1CBEF9cKd%8b#Am++&Wm-{enVY7Kdfya#9?-4i-ZB4SS&Ac8x*?jVgqrowznj$< z{$>B@jQnF-Iz2aRpvnE%QqOj;iKH$KQiIWEI`9gQ7kiy!7=NkED23XQL(X7hWzRF# zqoPOye9tIayrt+yw9vs(9FMVMl`H#$RX{vbe`xhm9n;inPLzvNB;0`}BLOeQu|G@m zUF@C4d3HKefE%c$0N>xyo`T-*)l-PBQm;cCQ3jU%t8#%7%fj&LdL6ttFthl^d8;Lc z>U*?o`WC`g?Qd6`>SY_LS6oI+rnolDHE$`oD-vp2e{zzd^ic~y=lT`i9@~2Iw1Rtj zNgZQJFEM)AOk9tK+ZS+#dwB}AZ^oUgk5R+#0u#(A3JmYec=bQtuO8jeKXkbGB^LWC zGR3)|k;%7Z)@Tc|;2v?_n@QN{3;aiy$k8+Oc`J4F%%=UAh8}V9ET%KA^G=rVUbz$3 z6>O)e9&6!KVB8EqUF@ke=0DBv=f8*h#&rU3rMPep0-HF3e*o@Rxyc(k#M=fk99Hh% z+*?Tx`5~P1YJz@F?a~yP27W!*=HkXt`Prf1R6cSe+2C%R;-0?JkSX;^c^8Z!yU3Qf zZ;f|y^B*Ama&=}<6*tAhcDKsRxpdQTMhOMaxgQ;f6PB>e!2BFXd=>Ym-Lsu5=*99w zUWg>eMMflHqM=os`2Nd$ZSPwPvR2KuX`jzQIdPsJ6P^k2BDKFop+f$tfx z0?PjL>+4+ba`79M=g9&uh4Nz;eesEw%$bSq$47!K*(&T^9~V2{tkerJocn9@isQMF zV3b%H(4O%XMMl%0w1JE|Tzd~Q>t)#YKs>Vp>QV*!hcDqlQCCS?3ZL%x0WG8Wm*Y+< z=R7|PzdX)Blu08xJOOwbwtnOWDiF-v&sYN3P-GtzB*Fb#59_6fsfLLy?;F+ZQXSp%cedJa8eu4iTMC!*M}qQK(9TT<^U;l!PD3$DKU8H%}Ox zqFb~?;(yKIY7F^1hJPEoV{)bbZM+@P{CA`my5H`(fCmay305HdccgCncjW(edQ2bo zAFp4{UjA#O_23kO39Ej%TY?*+5>NgbWFJU^RXCN`qMxYpZ*D#|$wNb3&ldO8>T*MV4R?p~eYVqpsvtBHI^SJiuLpJ)$e;&hWCX=^!+^eH80%GvGE+Sk>`aWZQEyMB#pF?O+0jdb59M<$2@SThu1F3!cVTOHRV)h7fol+hG#Ycu67igAs>u((Jolh z0k!;%3SKe~_p0{Yhivv5P1p^sz?+G!)3$f4MNemUy_>=O=PdPe5wh^rcHYO>e-+Vl z4utp4YDA@;7q~9OYQv!hooA4142~v?dq4o&cdE5ZnNfsDvq+YJdf$6BA_dE90Y(?2 z^RB})`vJ7F9`OJb!pea@TEsy=YQNp{dKGU;uF+eZ8hD!HGIrBQjC-;Rett$Kdw2Gn zhH6X^epf67A48nhx(e@&Le*uu9&^P5+WAO8e`j+@Bkr^qbcHPa{EP}HNVYQYfFONW z>gz*CNy7Ath(_eA$YFh;xe*=m=;Bx_&`?0^DL*jSjvf40)sn>nc5lI558AF>B8>23 zLja7;*DpNjO8g^_{lHB1Gk_~}f+cGOzN%EfyPLD9oU7d{s-ZZ5T_XVlp+6z)d>!S_ zpfvdq9;mMx!obB34A;ISO+6)Ay4!V^c|OX{0W76KcBt0V?S5I@Fk^iG?bus9`(^nO?ZEP`-G@FMypZ~~y}aI|;0WxKUkn5v?cA}2$) z?@IFk?fn0eS>_#DANGu|2Z%f$qkLa1(NB05kd^^5T|JQL@y7GKMb2Uwy2kz9|6L(U zgLUw(7SJD|(Yb5V(B3j6bcc?7m2jg-HAb|w@dN8WCzbFjvJZAcV*etrCF|;P`Uue# zJjE z=>@BPc)2u4+O;=~ra_2dq#OS-N4y>OBH-A>OXU+)M?KzOb-_KtkLXLkCV2onWli7I z*0LDExricJqWjiQ+Kkh_75vT*O#0t{J0`x_2fHRQDTAC6FFkt4iPCup8D?<~wBJ`8 zEfC9?%D=AhE1(tjW~cA#4;=Q`t)wEMDs2+?0gxpp(1Ua+?d~ZfB7+c1+ipSKnAb_N z#Q~g9D&VG(6MJv4$}2F3-XfIl8l~H~^ayz=9qXnWZ4Kk_tq~>J%1{5kj#Ydd4!mZ} z4Q}1haR}7kKPVarUc>6)we`LsHJEu5=m;x39TN(6Am{$ODLM$#Z4iBk#_W*qPv(4& z9YR)@9z?t_*_Thk6(mRHqF@l$%_Z-Z`Vpmj#TupuAA={V^_2weCaj(}42W(w+Boxv zf6aNkJrWw(aj&dw#z3Jg>u9*LFVW|fDfou{UsFj@>}oPo{na(33=EV`HfLg$rK7x^ zhyK!N6nifUSpP9*&$4ao`Fo;4JCT-7{59X74*<&^u5$k4{jBQ4nPoZvS{D5&_gXdr$57lVkyc)YFAC3+2J2!C*5w^`Y=wN z@?$v}m+0PeLVO@zdeRv+AhA1TUS^imjTe&4*bo0}$tTkA!_9u+I>?J{CYXOTqa+%5 z{ZGW&Q35caa0GM2cy(5U%kXc$Q}_MH+BEC!PxVxs>36!)Vxt=}xcp<1C*pm=&35@+ z?Hmx#Th5AaalFUK+61uwI&O#$L`$sUTjZWef_COHZ+K439CF#z?>Q)rQJ(7TK)#-! z%f05}9*tOK#_<|^pY4c`S}RNwY+0eN_=L5Qyz$&M9zyyvbwW}Rd8?n2vvzNWvz{W_ zqGdt@RN$Y15s+HD*T^UAIa`0fp%%wtyU}9{`%@hvXuKSnAP3>6`FMkgMVpVP7}337 zMidF`wb?`(6TAJ?2dOv#@*g-7uWQ3Gj2iURalxd*?Ro2@OH2()DJXwG89=KS#RVWE zpHtCH;HAW>L9Z$Q`6RL3nDH&I6_DK^m23bx5Ovn(>BW}DI&XAosMwM|DNh9M>P&ci z^F$Y3`d>33(tMk{4c`ENUcJ*9640Y{x{`~lp+gNs;0PC!Q+h#mKaZa~gf}gggR1#i9VFb)Ja3muXnslyY}V1f z$jg49_f!LF%Ta<)BW@>3LnW&Kr^R@@XY6rn#5f3vY2*@o0ve;VM8n{Wz^k12PB)wr zj>CdLjv+5G%2h9D3_e`Sv)Q^kc1nv_PL|50L=(ITlcTRQ;WvR!T7u7+FX;S1(CWzMy|@I*_Kmy5P%ZhJnK@r;)PHzkcJBDu1MkkI zTv{4Vn2qm1i*Q{xA1Lb<*qv*W?^kx(Pm7L67Ns+!^eH!i^P!nriO50TX64K7h8L3` za!7cnimqRvxlZE4B(H3S%K*v(CC<1*%G$w=xh2YZ*14Va9_T{t*fioRHg!qjPYmH{ zQ7YTC;%hp6Jb3mwmoXb;B9=t;0opPmOtITbytbqj^3AIfaINv)S`!B3x>k!OgZD9RH^H69=4v;=)|(LSNg}%HAR!=*5NDt}u8LzqpA4tZ^#hNhW#a!VxX}V8PqCCW z`$%u!Zu#icgA*(VPA&hu+Ro#CX1<<#E}yI68eIz*y>xjI#2~)sHx!5G{|uFkl5D`m z$6t~uP!`6Bj4YB4W}C9wvP<$2>+KOUDj>J5H2Ky=mPy6Yqc3PI$z0wSfXotu}U=}KJZ0d~Q+;{6`zW2^Bj&+K>{tcW$kKj1 z>r>a_JH8O1x$|@s8mz@svbE{y6O!+8-AB_btPqRZ zzhVqMhezTVZC z-VotXJsNTO7zhvw`4dDfL%cNo=F%ZDvQ&~xGJI&iq%7tP;&=NqcQokqJMz)&wqd0T zpL83~5yh1=-iRJiI>V;2`e+2Zb9(EiPbW@IJ6dIL<`b_x-qy}Ro37#)KsKjUBaf4f z*Bm%)f$Vuy?|60|RiiUi#g93|-h1i1(|eVK8}>}2?2A|FH`pMj6o!3|-gh#j=TY|y zR4B#~MU_YYJtObXkI9ynr_(>&+uxf&v0*g2y>{;I2FP`@cC>$tK)o zk|o$Xt7MD=`uf9&NC$uWM8ix5f@pO@$TD|5lN-QGzQtiThX_U`IZ;?KstL66U!a>r z-V8(^?_}u_3FN00N7su1Yfgw^zLFh1U(mb5z+%k^lW2~nhpNiU)z^Br%W7rLhBuwR zCEodqptK4iF$ua==Il2$(FK}&74i9fwp&bvX}o^hZ-fQ31lX$7^~_Z^ua?{b^i8W0 zpgh^7R}(~>Qk4&|elWUkl)s)kG$>y=!u|YY;Mano>&Hk@cAz=SZuH~H8@EDncm*wj zc_i`!0Zf#J5d5082tiKDVAmp7*kXR2U;SkZBl7lOphBeOt3lrz)KZc`*9qMp9fP2% z9D4LlRArBD%r=C^;QQRi1WOE(u`5h$m(EAD2ri`JK3eR>r=~px<)rXh0MC!q*THy8 zmD-bQ4Vza;NA>z=sNZ1ajIJS z(X(_6@Z!{ZT}cHT@jc)gGaBO+e;=6&aETemhmA_FxmQvC{vbX$R~xPWc4xs+at1<> zehPT&<61bxNMVQK!(X{@F%`X9)OKv-@_dw?mGG*I_w9DPl0k{x5W&0-GMg#aea*l#XQ{Mmq2rQX}B!w@16jD&%)SF=a&^dnA4GkV_|e3 zdk{zyW*a~z6t!jHgGFfRzGd#jue!a7X{5%UZoZ|71bj!&e_T56(!*5d+yu#oo?>%- z1pF%No?L-UbTMM77C-g;T0)X=`g0Vyiu=9T|J#QEFMg>X7d3jjEPC)+D6^{0+bv90 zvMdg9HS(HWERU$7Btu0I7BZPSnXdM#DyUjnSr~l&iG@ohZ?>?{ zd`*BN13E&KZd}O@3?CJSR$fsqr_O(4DUbGSBZg8sL_l_7 zOwq<4CYo?!$qruilp;)3!faOY<~KyZntYm&mliW;53)HVB#Tepe6*yd_1cap zty^rQ1bzCm2C`-@E#7$9V?YYEZ_+P#FH{$*sTU&vJkRxkJ_;?_cZ*70nmJ$(_E3=F zi?i202In|Oc{wiw8gAAXu1c=i4IF$2Q-29dIC&QK;oQc?@tb+DfBFWnkh@t?fw#Hx zMz;n>_Ofjj;+*vUVQGlmr9o6UM|>-NwUtbpeTsRNQE&ArRiXhjrl|cMe(fJgRthEZ zNKs`B5LotkG?nPtqZ2rH>$l$Ax9S{gSpwie&!-+Ia11MTAEdJ!J;YCEnBr3MOvhmm z=XFjjub)5>s!@hLf*^*~y2}@df35lPNc?dHR`Z$?4}F;6K6~OjZRS-#1ioWs*p!b@ z!N4R*I)e-=LMpq*hTvV;)!ff)Z88jZAsbNgVpV}XUl{-md@(#C^?TO_uNH8plx4gG zy-Yby3!p#OsBE~!Vf*|IFeyjzq!D1(3o53MP7f_H8*hME*i~#a$JVEy`}R|Ug+{xZ zNlL)CA-02#46kPtdmr=Mm1xRbr5s^;1YBoh9&lY8SFX@3z8UY!Gi0C1}sz(RxxswaQ`^KMPZSBWq7Y4XVBhr0@p{f zwwDOf>nzj=g_i*&Clg5_FmA z`CNg&&3>n)AdS2BR;r{zUO!I#l6Vu-tT6<|w2jEVoleyV<9$Dy_13?2ZWhNn9*=Y8 z4#@EEkRNT)`5NLGc+t(G59(9PL%WU^siCQS&3QEMalkhwTDxG!C@3UVBhbju5@jb~ zBocj~`^V&n(jdlhiDi6BK;9PZT7F^6?5I8;`#=auq@h?-$s-l(0GFpy`}6k8O66To zt;(GXV@MY*qBC~8gAsv{xYV~|$2is%P{nIFgxbF~@Y8|2Va|Vks}1Hr2>5fFKtJn~ z!E&o#g{lDkf{MR7MvgG*aqc zv)Te5V2+HBm}+^ke#3G*g4&0p3X7%^o89wJ$^It(o)l^UbyTk3R2lw2wiU3c1OIib z6Bm1c$!Q;18b|yobHu{2b|_F0{^jK|-`OEFvgee>7I^w7aD@rWKAHQzBn#s|yn9s# zXvS_`*$1PTp!fwoa`#tT%9+14EJOl0HPx&ZyR!FCb007?UV5#UU==zTER zzSUZiSpkv5a=L3LJYgytaKt=#ZgF*L7_Q;ynq2KoqYvWNk}J7Sb_AEHy(<#Cd;Aja z1X*TJrSVqWd-RQCnTXn&$Hs@`Y6FJa*?W%y0~dL7p0|F9191Ht=uVw%94zMBVgmGG$BFOOIk_{<6b?A@kjy<`RC^`Y-IhS1P z*I=6Vc3N=@1sABQKtQ?_SqXq6rff}{^5WOawIeK!EP8R@uS*X|U>avs1@8kPb(u-u zhUb6%NE;#i?Mwl6%HqNu(xl0efIs=xCFZf=b^iDr4bfAvp*jocDKP(2QXubE57CSz z9n;*fBjCI#TYFrTAMt?y$CI>bJTQwqxI)#Hy&E= zK9r@`&-J~RyRN1|-yJ$kHqH|`rb%TAn){7EfgCRiyuMCzr9|gnHsI}D&zKOE)zM<} zHk1-|%*nF?g$e5|1{ zfk7wZo>-s9wlRrS-oY%@r&9)m3MAa4ngWo`Of6&2!C$YY(fNf`9Vd8eR|- z`sBT6>@9kw=ut7iI{Jvd5OTMEiD@c%nzwv zb)kC`ba+X96leemmp<`LdX_Oe`Nqs7{?36?E!mrAl8t$zq&ULOvhrBFn=k^O+7ikrvxK--^8;*Z;x1^Ut|Ro=(WY@=Jcd4P8Vj4v@bgCPkF zS_vz%aGuH(Q5v4zKyxwH=B6zzCFg40F@?y*qP`U)f3fhsgdpjCEGo*1RPE39A#`N-uM}*v| zT%(n;x#wlPC|f08(41l1#NOK#ulSMe5-ygqXhr$YfQQ4H1T+X;V%UCpE5TG3Nb}M2 zpvdl>d16)mEiDG~&o@GCW|Za^NhK8zBOAMgx)65E?GOb8?3 zX_;fx`DNUwNUteFGGd+JrgR^~Z_&}{vCEHlJ@!(t67&cf8F^|gn0@;@i&fmJ7vE+- z;7GwE0%k^y+wIv1u7i8GsMxyUYYdot2w+QQB$2Loi6cA_cX zDjXOQ&XT+sNf>Iz!0OP*SCSns^&bm13y(`tJpmd!v{)Z`YI{$#EJbH1vy}tZIQ3Np z&Un@gBzXnSW_xBzaj{3`2NmJpmWq(}Fkr*N&ppE5P1MkMONzQ_t##L)pQ9V43w8K! zfw&py%)SEBwh4wJ6(*H#2kXOPBnAo3T1kyYHH5-&c1MFpSkD;P`su&hmY9Hqvs$j% zjv1!+JeFtQta;0RtCq!o(d+U7eY$AXQt+r~eMC%{%MWVLMPq_aDv1gd{Q>ccdZ@L4 zC2K|%?7mmJHW^M?d4J|fS>!h#A%Z=*$>5je_bp`~Jyx0rlyCYMcW(q?y zJ7iM|@;P=e50NWA4I+UUW||ZG#0}I({f3s!cAQ0o^u&TTfC`OPT!E%%v z-2qt{B20I)a>2AGqv6VBaX#h$`GdpPSkYGb^wmFquHDQVNMV>hfAA1`&xPZ3CgrQ${|a{4=0A8LO|hA77lVIE4Xf3Dr5JXnGaZccIfe zL_Miq2KLblJuPD#K<(!x&)LgwXHg|DsWN!NIZr(|m!7xhC9itSCNtto8lgI6Gyu!p z_Z)?ptUy6pP#M`a7DUF#*aw0oHh0m&hq@g0sMG);mUwbX!}|9Q@Pv`Oy&ys*mLO^c zPOG59`W^e~geaYt#{?LDObpAL{oU?ZWhlzR_$FGtOL!wCH3Xoi@NLN~dt#@IM3+@O zO|=%ls+S?}v%W7}pB^WiV~H90*}ZNi(oJs+6O}l)@JXFWQ0j6n8@dgc?n;b}KvJSq z-fg@W-F~t|OgAeW&{;VUxfR$YhNlPbjdkG8d^dA~s|n{>Klzf~;LC&p2OYK724>Qm zq3fZ_30yh1hjikO8EKJq@m(J2R3R}z1B+2)X2{o_vop}<)@at`&!V`|g|DEm(6dcw z<3pgPsNElv&M5xg${1v$CWZTD;k7K(p&IW+P1JA0jboed$kx?wImKT)sjWwyFozOR zmM8Ctql28}1T%py+#|ylXg-Fg6`J?1q|#_Ie(Px260>|2=WV27k~LC_1NhCZN=qsF z!d8Ah+F((Xjwhu_a;qeitvKVC%tPQSXXrtG;V2(c#RxdjaEen?kk9q8 zd0JLbvX7*{9N_2}0?`cSDfE0Dp3q2~R-tJbo7NP~jmD5dL(*rtl&VjbxidPqN{X`* zq&Q3%^8mABk+j_mTJYV?5}VirLp`Zmvm;t@_3uqC+k8j|xO-r7+Kh)Fnc;je&d-AB z=;X>Jg8EHzjOL)OQ8s&wA$`;3ofo=Wm%p6clnx*zHgM|OZPk2kfnaNfK*#5)U|p?_ zRO?FxpE@19#cRJm_3S!5+Ib0&O66?U;Z;X5Py27Bbly}<@Yly@E>3DH*Dk17EL!XR zQKh`*8~9qsz_VOfH7fo1!-tex_2zaZPv7j|8@rrNAFL^jI;2v#iicG;EB$+W0g;oW zJk~B39m$@@mdB$|?{SLCt6KGHU^|{3+gD zQtE+*X0??z`$Nw*N_G;8a8%#y`7U12by@wx{4SmowL%48#F**!B0w=!61(2=Kls;{xE^%ZGz_! zQA1>6`gChMXa5OD?rnWHaC9;|m!`nCX2Cf-@ur!O`_EZIvq+cfYr`vc%?R zk8ii<(ed7-o`bEQU?eJ^aa5w@(^VR0qa{nz&;e|b7*KAM8@<(EsQ-iC;PmJ4ZD8^1 zLJ{|{xQAk|19DB&$miFeUesen0N4hoe1|9isgTq*JX37SpY9aTC_75Tdb4*v5K@1{ zr0FjocF<(>9enFb9=$#f9eFLyDwaVZ>oS%*YHFFfVObVSbF-a*#$_gLy)ijoe?3wL$&-n|gFYBn1lT*Rl=6u>f)kNM_xGUsOZsBnGA@%g^y) zAAH*mWnSxE!K<=S;V~*5!3~jPbM14jf>J*iT)XDxS;2Vyp=`;R=7+8&dK0^0TtCu=) z;`G5iBv29_%;=){_QgLy1@c1s3)*g&K9b~k9y*Nfx>%O+Ne{ap4i0=P#B{psj&*oI3R9p z4gn8TNVnPn?;wVGpgRc<(aaBCY)CueVS~HAwBz&9iyJgKL&)^t1&0}8k8f&y9?1pJ zh!0VNLJ85H=)u?dGXoYNa^W^O_Yh??40~ZPDUIWM{cCQ%?9LcK|5gLf(%Mt-M;7~b z6c7>H5(aeT?DWLvY~z8UXo5|LsN2MNUJhu7eSM2U{e8=A{EPZq(I%60nw}D>yLLfA zO{m3(V4zTRG+tYvk0ORZK_d$DS4qDDGE{b=x$*B6yZmP?)G|3?W+Y3AS=Mu3Zt_&p zihV?!Pt-NR=c~h6(*rB8X+`Uf#GCap9W+W1u)~#zzrwrq6W9B<)_mHw^SA4M?VaIN zq6e2XY-E$qI1&VXEH|=)MQIFD-blhL*bskGzfch#1z0a1=VKfsA6qZTYj4t~DIdi9 zo>(LBU_Zf3=Ii0L@8^8F@Dlw_nL+c`xLMCDyVeSK3ENBw z2tOsr<{4Azv4P;MUvjXNC%KL0?l5+X-PzH5nMv9&vtr=Q}y_xy@i_(BFv9hvF_>)(y*@B zuQx{gj>6GMMw(@QLk}JmgaCLh9vYtWt*!2xAH#zNgf!@aJd1 zot5u4o6uV^r(T28)+!gzoiBasMy`xkl-b+FEQ=(Um_yo%J{U&uZ`Wxx`xe`jwX^-} zVhu;Ncm0gM5iI43ZTk>rgiV1G%CAR3F=JTXUhEo)RVaRZpxF2Qy#;}AjflMIit1A<)IqWs(lZF zJb|ayw64Xp%D~BN#|YeT>ezuY84s|56KT9$i8r`qR0~g)pbQVEyD(!$BF#JSVP?Fr z9SnP_tMs*!77x%|C!I9pJaqmRn`a0Sh1LY--(nC*`kpST1&g@$2G@1o>a0;W9Zh1` z6B1gxxJQCQB~iPz*n+5TdWo&i$J((?DDoHg8$y>Q8iU~1V3d?`e+03#1&Cp{*#h;CUGA4R#{-%DVAt|QbQEH?%zvGF7A$qmv7 zKfU&nCp6BnD&ZuPhKEhT!<69bEm&t2uRc=f=>u(Pkf#^N)&2&aw{p}#$~)DZ7u-OP zwf#}3E8MC%k`-FS-RyB_W`~hJP}{4sPQ2G| zkphzrVWCr`gi>0=j*96k5+#78^MQDCZLt5jcOcl)qb7>pXPXeVX=q zB{pEJDp3XxX2t_^EfP<(=UGHxT27gqb+vn)51$^zakd~K_Nvr{|Tx@ zk%M?iP`~i{!&UbaNn8jmVvOkowY!o}T$|{8*VS3y4}5%;n!7djy_XP&TAU0_s)lCn zSPjIjp4~-(CATpmZEN>4cvP=85JPJ*5eM>!vwtog-1ILjNQkem#k7@8A`dA^U=-4$}gG7M%g&;5w%4&I!qoIg~MQZgKOC|iY*greDyuL8INyha#&@_zEY zj}=56Ta!wyD^v-1lk!X;e2p&wKvs75MaZZp;-|=gnj{u$rC!TJf41l@Xw(BEl*Oe}K$iJr51`42X(U-O9HC08M2!<(_bgZ%caUny87s)}Cf~XEt5@ zDIkm);e7U~?CYgCTn0JiSBmq^cjk5HR6bUDRO^$v3~>GvPT00p-DkMoYVSjjrY{HL z7e5zdN`Y=sJ<5ly2wN3VJyTUzfd$(GTK>|;+wST4r}T)!r(jY6vQmmSB_ zeXV42+AA1-*`v=J=v#c&01miba!dsyrZcK32PTM<`2973N09N=O|adSnrrKB0#uv_cenCisdky8$1DC3} z*y7Mvs!VxfH@}v)O5cpI6@$n*B;n6@THlA8nQa$7ZQbIxEOH%Z4#I-+ftyZ8Wgek6S)SrdB3Iby8u0ButYt z7;Ig453Um|#ausUElANLN)Tc~YOt&jzzPh(*hK&?8pPDE>R|__gvUAR#;)YtBUFMp zl2#;TAk7}pDgoIJ7c8E91E}4QQm4{wx~j^jL0<*>ghn#DNPrV6!|JNH%0I(1_3g+{ zbCvw8JiiGm`#IF!HD4n6IcpYib}~U3;7c2dHiss(L`(La6+6^!%HHD@9sH0fR;(15SVfJ6@zv$ny87y(ErL-|<0Z;Fwy{Kwo9_S1itUpGxesI53Ev<+y^Yh2J{B9zEwjFs0_rSGAp$R5 z0<5b`5ObhnIDlQp8Y-(wI+JFa$*uAC^egHBK=sf_+BiXgMK$8b{3o7)WsKP`AF!~b zG-3KVu~6XU_aK*{r#|-uU;`uJJd57O{VU&J*IG;NBA%ihF{9C`ui{YUWv!PY`ZYUh z)tI2rCIFV1rf+85kLTfcEc|Vol&;$t%Ohbi#3=RJ(i_+Jju|7u0kb@uI_3KpeHPiH zq+d-S!x2Ngy$$^IahI7d{=`cfnFPZp%=d@Au<=J=lhQRQJ{{VVTfc8P>R zMsYn0Lr}8RF;g700jHeA$Wujam}5(p1B0{jzv6oXIZ%LH4CH+nJNI=d7PEj5yxI8{ z8t3j*57E_$w0%BM*z*oohp6tH-4-ZHhw()~NMcVdSB~iqmmW8mR0c@QBK8JLW%BF4 zC#erj&{^&1KS*nC{P@fU)Hh*bc8}G8yFA#!P;Js+j}T$NxNE0JNceN2&em$y{7MEr z^Zv~|abEkG2uy?M!bIVF9r}?*D^?=Nh~-}9-xAl8KiZfPW1lyhvDg_r{ixPZwRYn4 zm@CL@N|hlm3CqR=4LIs_?Q&|IL`2CF<%46Ah6;2rsUDD})wI+P&N`kZytpY*)J0MK z;CI%2JT^_O;Bv!KCOO7b-L)g0X+h8;Mly|U)-9G%%)|sC zDKXwdX}X?15oOBWMld3(A8dkx0XN*6^K2M*5f-Fx#<3V8aZOTUZ0 zt+}rbi|Xszo*8Cf=ng>%k(LsqkrL^U?oeqEkdl&-Mih|lPz0o;Q(zE9Iur>>mG16% z_u%h&zxR8u=b!Joo$)yR0i5C*jMBBvH&9+&l zQK^F;(nSl91obUhdgS){$bLdFhT68oTofSoaF3m-KsR1AW=VniRQ1qXYdUlboZ zp}Me~s@O*=pUMx2_P)Js?Ttn;_7K*<*`=^*?R9zckpT55<3|ou-J@j!E&|ES8*#+1 zsjn0-MALRe#AROC=}pexab+lR#gV+G$9wRO6VtQy>u5haIWo8{9NM=flFSxZ0t;hB z$Fh;d`;pCKOA@*0dM&hid=&wv%aMFml|u@_kQK6-htKFW@FhFE=1ii4ykoUdD(eFd zJ@}fARa4!&Bg4~G0zOUXqVrFw7r}`dma;?GlrypQ#5?1koMWW8xoL;igb${i=e)*V zocQkFB(jNFUxKF&B&ndtX=j=0lF2R5iS?uDWGznz-#oa;&y~Wq*0o#WRE?O<{$CYM z_LP?YR5T%hku&iDzeEXGPx$%WLlVX*To^Qz70p6?k!UJ>2Z~MfZRFcqLG-Ofvj71j zY?rY&tV~Eg3(bgUyk<|~hsBo}B01D^u%`kZ>n8sksImbSE`W>6RU%A`D=T~_sl<_M z6CeC93tD;3wmU~+k*G5WyX1Emkj|JAbDvYzLa-1^_IBl*&6K?%;zuTVyR%IseT+>% zplrK@W~k1UcR3h1gbz+b2fLZsQjr_1k9r>DUR|X~k#HxjF@)8G$M_~*OMNuh2jEL3 zL?SuPo8Wve5xOMp(5N(_|5ZVw_J1m9KEjHbJ2b*CaQ%a*EanrjQ?N;3cPVLLFL9w$ z3kz!m=YjNAaSoe!Wu^agL=TmB%kB-B$uW>D0(q1MhU~Tr7ttqK|9$0K?W}sv5t$iu z_)2cA*i3M9E1pY%P9_1=2RBBaUn7+E^IFB&AYQD-`}pqx??^1(lFyuq2L~TX$Q*RO zwH84b*u*?$Q_Kc^p|DuN<4_5P0Ir@mye*hQFl|Lme-9t;SNscb85}Ak1g)_7zOV`J z)n?TP`UaCS(DV1p8jEzf5NbsMa0VNrCS}Xz*=0WRvrO7jCQGpoX)hB&+w1>#{Y*7w zaQ%)M(p(c2P}^ePh^IFf1(=ExGV+Zs|~%oxdMumjOLpD zQR?iRg^es_RRxXOHo1CF z5({>iKjqQx#kMAs{P%CFJaJvIn4f6PQF>F;O}B#?sUB`-$CL&&L(~x8js-DS zW^W-3I!@Yn37Epa&`5y8Et?mOt0f6G_aLIv_|aYCM4+l41r%Xfjf1#W7J8YaWHNorLd;mvG(7|3gDg$3U- z50ib@d0#F`+3qFg4g-oJyZHbr~IXHKV$e)5Ow}{`EMGUEnF6>gd06lp-qza#Aq0HYs1UGzXYZ0f1)IvXR(x+5p@SFB)b_+^`!n{Y8dN?VSq zPuAf4_NBg1jk{r2z<;p}njxj{Dj72B?gIi91R8kw_RQz~n>fr^kbGu1O8B-cbV*$! z3HULc5-Z4Y|5AzIcN9<6ahlWOHU|Yz{2?LzmZ$POK|PB=cinb z?>1DUi3uf>ALV1m_$0ab6Z_y`NTJB6cu)UO4IYE$8rg3-56&ve4eiQ3l`&>%Q+J81 zAI3>O?U^;~9!V4*E6Z~VW&f1dC6OU!^vva_p5DoAFt##-umE0O|pL zGl8iJ=bg4wv(GhGcjrYdQ9J60VR8__&*RfUB{}`9vP+!`jc{+XU!OgWHfN+h9ln_? zaXpEv0_$IwQH(UR1g8&;yM#Zk>xk2ue*Qh)Xd~6|&vA&$4NNho%n;(~{37k%NlZo3 z@JlyJ!syI-Qj3;|3!j6@$vFq>s9yXnMa+5(EWmeZI_BP(@JTvk$NaYx%?6y z-hhQkFR%IGKYy>oCZAEb`%9K53li32@KsF0dOZ(_DPSIlpB)WbzVmfk*qN*%K@N46 zH&9{jJr>_;Er97QNGhDJe1bA3ox3gl+5RMeuTT-4PklZpVev~K8lc1e z(G;O4BH!WLitDl%NH{mQVol`1qYdp!w|GN$6t#UOS|4CAS!Mi;VD^Z7J8|K1ZSdg@ zod2A@*iW6j^HTvOPNntd%p=;L+O+zTfUmN)FX;p8G1Hgt2$hCS90q;*k;U01EFoT4 z>l>+!+Gu_#WW#?^exXjFS^Kdq(SY(ubm4LICMAM&zL9s6O)*CO1kS+^~Zqo|%IU&so@mjwi z_8rZa)}JB{`^Dgj-Ov8v=F6t|?atN)50w(JqjP}x;7EVZ!DKd`=FwuKwjDfPe=VNw z%(L6{dVl2yiu&-&bq~t!=B3tS#bxfTcm<}j&h9{9R~yb&KC~R~_JlD!JCsp}K<}^% zBQrG-hhZ6PCX>wK)BYnG%ou4YbRFAws^p#-_+jb579jqMQD|^6P#2A6Z-?w8O4TW3`c);A8G_G zeH+pcU7JBznI0W;_`?Wa zdcMNS?W5a_aiN+ z4$-m=A&-54k2vQ0LG#R1D)oZ^f%PVk#k5&TUU;GV-0;YmZN-AVS25bNmYC)U!YT(LVVvQ!$m?K3Ti660ExU(Ig?i*mX(L4ZoQ^^{nwZZy zNik_%bQaX(lsbW9%U6So*L=9&F%)x#K!xI=d#BVyP<2jrcAB@fmLijUy^ia(AN|@s z7kpGD!aV$daCYg%n@yvc@|AA=g*428B8?)nk@mlkH$gSwcXiwB^UDFII8dAFLp?jC zwu4&p@|p{?+HYuwVTk4K1dIIvzn=2@K%R7WjqFCIUTi*a2Pfk-tmD0`WO^m$J#%fd zMDp7gDc>rb^C(IS_S&N#G_y!Q)t5eNds~ zpzV4Ev$wZ1zs*&1a-sbD_mu=K8xsWP>0Aw=W~^#obWy-QP10_hP!1H>1kqS*jbT^o zKmUH2;8=&mJocaHT%k90_m%_kFQuD^PNX=6#&WwTOpuqh!qwh58ctH`!!Q<_{vUMq z_`Nvu@RSN2r%^bX1~lS$7$A-Dg|YwM*B1f&1yb)w`D$~FiIkOZVmk5ga{xk&>tVt5 ze5*Ra=GN$(vd6K(QgztV$ z(<qT$xvsRWvj8_&F{dXy?tK(viG~zp1^AYXcoH4EaNM_RC(< zr1KiN(Lkic5F1-*GMRh|38O6qOwjZVOhRYGY%R!#i-vM$6toi9et+>w)L4F!hoqV< z*#TMBL09$deMC&)i#oUgt&h6Nhz#Kq2U-}s{3iN+u%Bva9oK8SGqIH2W^uJqg-Q&I zS_+@J)&-!AR0}+GZ8dZ<(s?Pjg&<-+_soo=$0h;NhTX3PjEZD zKfs=)jt?*Y2969W+ZDMfD4M0v0rRli_NtOF@DOQRIq6xpKU(_!#K`31GkcFc-Q%Xh zhSh}b;0cM@)z6d0rgDmEd!(#rC;Bw9={n_(eg=>24)?_c!6lV6z%(z{exSSe^N$qi zlOtXJlem>&6GJv1mdd7Mzx^a(Tv4feswIVaO1c;6R}fIDP!b(>5Fc})-)Oo4BuW~U zeILnphCRlb$zl`#ZmwF#Qit8f*tVr8@u$io`%doqWG`JqiELI6X+w#2p~>A*_u!au z!JMLXz0Y^_6C|VR5#avU&kBRZODlSiDRT)uX|wycy~9@4v>Xyl$G7lfPGl^A*p?pu zP_~vjG%++)TX6)ewpX$!%G{bb_SdQV_P#SeIy;Z@alMsxOsjSD2& zZ#<)gaqI67@?TIeeHeO+*K?`8_@F?Bcbm*!9iVAQ5kL&$67KL zfwzg}@jON2G}eT?+E){rSpLm{P+SP?GQicfh4runSC{##HYZW@#;NpJa~tK`w{XEu z)k$Ly3pu6hi@a_zk)Q3ty3@9iW7#}CI$kHj_3;JCYsRjL!`X)I>ZD)~U^7uv&&RI~DhC%&-rhG+sv+%{rMwiC7*1zG_$6FzJ(X zx-PF^oq|Tw>$;A;!cwseL%FxbMG+#QF}SO40!$@Uz9NW2hQGb-fT=bsKNC|ImG4mU zmLEe5zjbl_IN~Lbs_ig)28sfB%=B?a>P9B?;)YiNPqLT(Z%>Z#T~ds>MvU2uLY+?D zBu=E}os}Xt@kBrIqSt~cdNei1A>__6#6NELfm;J6X(dL=Qx=td4m%Auk-RAviE@xH zpR^EtaFuDpp}7cln(EiiE4^&6(I&ES)#Fd0se>n=kXjS}?PL>Tv^?~x9z%FzkBO|V zKmxZZu+%1`5LFgFoPx=Ev@AG9#9%J-bihP4GbeO=^`jn<>O&Uh!FFT|bA9=7nBW67qHuyVubv^x$MI_ougr=`+@({M6Wc8D7*p zl3te&QUW1<%~{FuzgdsCU0Jpy(U2^%gzP+xExgTs!DU3$U*2ONMCKvo48mgXsvQExQ8tk6;QvagD0L&J7}l51rM1G_SBWVX7z1)!J4t4`qPcg zAL_H7LpcL)sK|@X(srNSM7nggwOEb3(g3L5ZuKrZVHrU~()mUC3?^H#Lp)v;uYrn8 zb-{B1wOF)GkoVa&zAwX@JACBNyWw7WSp{d!($~J2Y+-ry;(YBOJZ?(tATJ@b z{qGVBjQ2m{YpAq5qWpI%qJh*Fys6!i^71XY3{7>HlA;_KE@6uSwi7CQ%QJ8>=9b`x zkSVW(;#Q8|C$oVqi&SzuyR3B^A~$-)(>@kAc;R_Q^Sl*v`GLYhZkC2oUA!Q4qszth8h zknvmiaFYY1@n$fprDXE&`ez^K;3`lazRx%KGtH?-GE4d|#nDv`KVSpwf`F=UAN>5$O#yumw>IZA~hyJzK3?(MWZ|WtDZE75_R~S-m8c0 z`4k`aYd{D1V7YS@7r)4W%HN0eRo)YdFbD%>a3)JSz`4%x?N4Bs$dT>4dS;93ub$-5 z0rS@3tAnGLvZ0i2xFDNBd_o;%$@dTKa3&)#W^+7GFn<~&RrFHyNzLOu<5Pi`f5kz0 zL4HwE55bE*navSOhxrwhSh;q-5cNWS^20bV{A_60AAA>5ZtLD(eiTu<&&lgTTYJdi z`@<^g&_V*T;4qBa)_xuP1B|!1d)kc=c*^lwST6uvi`#33QTP0b_X*GnH}PCZ9qwQP zP?|Vw!6$4Tv5k9kWVSQ}A^sKgFLY(_Ht+Wb5EJA0Dsv^?bdA!l!i>tx`!B@_@{*}K zZ*tYaJK8U*-HF19lu&MglJCM2aCDXDSE#jsYZwjdN#(DXxscph_;6w54(k6d@yrK( zOJ%b*GkPVUQN4;rVGT z72xv?DO~dTKw)eV#a16q#|W;LUp}LI+R11CKo_>WHrN&u(8_t#GOnc!DuuFd1QK$w zJu*6kFXkghXJC%Y=gifFMyR3&@rMm9Ahne!k<&Mvz(@TDBIAbyo=rrH+QS4d)*l>b zh!Xso(Axg1iA`M1iPSc3bYg>gp&aTNShqtHX9~+ye!QE7EoJjkIdj^l0BF`U#1pFZ$vSzeG||KD-4d34;lG z^r`G~p#dAMbT49l^{y1F%F;;RL%FP|7vslIdnQ(i_7~Lpiwz1?P*X?Pw0J>YfioG5 z5Lj{0P@%o7;$DBs5RdN%vL`F6H%4lj{u1UaVLeC7tV|0DVb95@v&GL(@3T$c`0Qch zO!~yb81Jm1>G*dl*D3=2;D|-GG|R};UzdFKN_(=Q>12X@M*sP@j2}L-sEZLsdu&7B^Xv?rY+YaWrxrDH7ig zo#!H!4F{fIVg6i9`^3uL{@iXZ%q{)Fud)cYKK)XUk`WmMiH^0ma*eHI2ZvQyc;rYE+*V9Y->mVe3^UqzwW$pV zzy+<4SX2n$7=pQ#$!h;;0#>zszFq=|A|NJE7CqCa1)iHJ#&c7KK4z}&qCwx16~iW* z@s!20Wr|Ig238c$@7k?@$J=z+PBBLPoN0hRP4t@u zHU*C)j>=!8<0_#NHJ=?OYMM}KX+~?pZ6iK$0LPvmco*}u<$!--phDN5bfE=R-vyvR zO+#Ct--jEYHxj7xzu%hG^BTA>yKSJq&Zdg`X>q&f17w=DdaTsU!fDY=mda80B*kMe zi%{n1$VhI0jL--Z*JyIIT*!7u@ZQ4(t^hOn43n0XP-k0abZ&&9P3NnvQZ*<0j@OUk zhLwNw%c|FqjytpcI5JZ@O^Xp0+Z(&bm9H?tx$=*nqSX#qK0o+cV1gqtk;=9S`s^i; zEYi3>L;-vSA4721xaHC*V4&B)O{xVnYZVJb6I^g8IoIMrKqUxEmqxx{Vy-z(jTx6B z(Q2G{IDYAOsGyws1~W9w8W#SHuZ7~piW z?ef<8Ay1+31G@k&{y#GYIfyNtKwl8P0ZPTOVHIoiZvt={R_ zLsngz*fc4rk6m{-9!vjyU7u33lInTpJH9PrJxWjPhzAI@+WDY|v!PyP0;=!Fy0Frl zDt@YlcaA$P9O%W+bl17f>xkODz&X`e7QDND%8{Cp?=B$fN{V_bmQs~wM9{19BVtkHhMH6a(c4?@p8d4x*PA~GlGq2Cik`4=Nr`GU zpLY)W^M)7U=^N18RmrZ_JaHpt?GR_J%6{{v!5F3z=`$q72Fm|mMSx-jkjW2sqO%h4 z@hrU?0+T91@o$j}v4-#uB4EHh#y9e#>3>knHNupfmJ&ott#$)-X0?Gkd|=)_TQgMa`=oW zs7(4dPAN*MXVRTL3fwfGvo18D*nPJc36Q@_&Lg)kKiOcj#oJAA0oB0LLewZ2GlpXw zRd;oToui_#dXFH2o;_s@|Ecdw{QqocMx|)$ikSm;G!6fCr5zSX>naum(thLnaO=2T z8{3$XT{E1_g5(4OkuF98r4F%-;oHc1@AbHt*ibG!2p`N)J9bQAIiBf``A=^opKs6Z z`-~-F*Tr4Cwm5f0@-6H3AfWbvlZ!>V4b2s>b(34Ic>`{<+`7zIgFtsuOX z=cr|O%Uf~kkuh7ezmcSP(=?y)1*@3&chfwg%*Wj>PGn9st^Ggmsb;-wA%!r?R@Hde zSyoneR8;RA#jY};nQ&z@OG08E)3GA!D`-KqI5@08a_noM&4IWhKKwAtvBn#Z8*;op zu{vh=CT8GMMwD$gd7e52Hua1%91>2_>*#&WsV3?S|85p9E z;=5VOT<>L5opc(D;Ri{%2mx^qj^yhN+IjDILDbk7KlSTOxAgUV zfFB)C4z{?o#2rWdX#ZQGudcM9bUi1X@E;ZMxO8v9de|nLJ3tdQ^kIrPizj}d7 zwzhXSx3;&ow)WQ7cb4WhHn-L{HdZ#)R@c^6R@awTRu`9+7nWA`7UmWf7Umb0<`$NA z=cYGjM>i*j*2a71<`?H@=5~jMmWO&adOMcd>t|alwwqceSLUW?=f`Gtr)K76W@e|R zrYEOoC#Gg6CML!vCP&66N5&>cM<>RI`Ue+g28YK7herB`M*9bc`uYcY`iJ`Z`Z^Ye z5pxK{Tyy8(P*?9@SMNY;?_|YTOIrW0?w*1EuJ(@Z{`RikwodS`r=z3qcYAl|@8PMY z;(kOeqOGg>cLxH|(%918+}zyMjA&?Vs%!45ZEUHjZ_aEl3u#WRt!w{Q=k=xWaHghU zxvZ$KvU0E}b~-O*K0Uc7J+Ld;r>eHGqPDTJy6#tXLs>;lNqJ30X+uj|cJZ&8{IdF- zqRQ-ovb=(loSfYB{KE9y;?&ICgtVN*l=Se_-*G9~F-e)LKjS+SyxL>kTB6-rA|025 zA{IS;n?tOde2o+0vVJC{|BO%j5u1_{++GmkRs+|rc2f(FO$&=o3X4h%iA)Ij5fc~@ z7aST95D*aP>+4XKY>@UED@beUoBU#y z8dJIg)%bh)VoAm%Ny5bUc=2M`aj!9B1Rq87BaQNjMe#wRc!6Pdfk9f1K`K_Gul~kn zmY?;FwR8;>4ZIYU)oGQISY(?%NXhXCh>!}Hu&}>EXE&v1Vt-Eif`XbMgN<(j037oq z-o93Hn%PT2lUGtnZ+?xxYCA(8=ub4Kt0XyOGDl5GOgQ$e{cY0Aj)&4GpADWN**@|8 zf?R-V0%2_<99B?J#~ZqM*^OZ}7~}oK-`QDJFEq;pO28T$bVsU}Oc#Hj@-=3EcD_2n zid)S?C(0(KT)R$W(BZ(|76R_a|F5rjF+{Nzy#VU)@a0zkn2FG;&z3tFf9*euj06Q{ z!nSI($pUJ$E+fHvy`J?h_RJ2*OJPu8D;f)--I$$$h63QFsbpsasI9Cgp%M~s)dz7ThDI~Q3T=9c83M}d`1h7j{qo_?YB5H=ps=kx9llheP&GOo>8--1lDhD{pyWGhMCF% zsk!N%(3>p6HPCFTXnuv5W!>#-sJV?iZn_a!48+sy z7e{}G?9rhb(u+zdD)sX1=-on%N4q3kL*{0+583HUp;2J(bew(tbHoI}Qpb1!PmlWQ z3}@x`h{j)D4j&Xnve`jL4xD)ew_pEI})U6Mdyhyi{?7X8oj zIR07PO@19X6%@r4(ejWW_O)qfo!iHKJ0=tY8Y%IV_Ey!(}{=%kqo;n3f z#DYL|b>NL14EhfAw_LEU#%fiy*@iy5k>2+dP7s}s^B7PIcZkRNv@r<}@qvdTT6oIc zxlhQKmGd1>(BV;n>qs{&Mth~G zDTJ+&W*+mGIx#udS+uKUIUwZgiGL z^vfG3$AFA6}+gsVi|a3}PRWN{5w9P9Dm zIA`nrelb}W(R)PCOU?zhO@&YzG~SRZ%r%liEeIijo6S+&T1KAc9=n}VJ;KSU=#-+p zn*@ixa{)DI_$#tRv)|lE4-DqKx2+E!X?oX4+H89p3dkkTJ+B7j-UhF-h}&wVVzHx* z6hjk>$RD5H1~U!XZTf{hxh;>eA%nn7S~Trr?7eJhgS<6Lv>P4s2ISbA@eRPe&0%{M zXK7Tw*q^-j-LC~emERqBHQMm5!tAL0NSlXkbs?aAqx!ey0Wt&%@K*w^Slaacnt!-h z%_oW?DZ*bAVQ5xq*e6>bFc^rSXSlw4j+lHd3W%Z*QtC93vbPjePuC$hO5_eX$+q_h zmvR*6=|*O)>v*&SVZat1)b3lf2pa`x*F@oMVKJ?gmk zn*s(5B|i!lo_;-5$pm;}gAM-(Y9a%5cuc}i zod=EJX9{o;`xL2{=B=*9>YaWb*W0s~2w*7clG=R1T~8dY8GdlLy@#cMUp6Q|SnMgm z?RLE_?+4rBw=S)yzCjt;GV1B_^9m3;S<=h(SqbiikS^J28mI@%Ez_D>~7b zG`1RE8iX3Crj`uc{hn8fKr~F){Ti(6(Rn$}!A_ZuG~DgLhxOBqu)Aj5{5@|0&a87< znE$p#SQ?Y>F-96{>0segwjgS6p_@~+7VKERM}VCf1bZHlBgpMPnq=*1=ACq4Ix{;I zW!C(|{&?}mPqRQS6a9s+qkGta`)~esAzDbF;+qxtmTPt|#}kU@K%FQggGVh1+98DzM&cqT zdbpOah~#)QGJ|$dOjIwp0Ee<*mjTQ*YQIqH1Au;dM;WLRYo}`4A62oPC&`)jzl!-S*H7j9Ln-n9{#bcOU_)GK~7mf|aw)FnBK-8$o zBk0g8SneE#1?lWd!qi^oVcZnVoqXt=uI=~P*@h+(ZvP8tb0Ox{Gvq17mrKNM!NAsw z8f^FJ@d33#HL?2fRXOeCaX-@|3hsd>cDv}t0uYoWMW5*%IG7N+-h$ACcT8ZR^vguN zCy_NK4BT{Y!mv{G;*o$MEw!>`ij%q>@ODIKbwS1Lf}@NK{`5y zZg*7w))1C-8`O;d@13p>_w5t`yYO8=)G>2uXZ#y?f9m8xXJgZ4h<}a!ET==ZwVc0t zlhZz|*{gVdpC17D$%9I?wdS}PFAhC~^lpmN@#`IJkKVEA@L!xEYkF@BIPS3umI(;C z6g!6P+mL~VhhVa#+3Nd5>;=g)aan>tn$;GG2@Y_=JA%%=IrrnP0sqB%hvi)W*qSQT zn7lq_dNI{B6|td(b5N_{NNC7>_9t)>0t_8(PnJBzceOnVP5*Y8y>aH$*-ul$a!%b@}V!qdPl^-;?BtkI< zto|ovrZ4o>Fuw3-Q-Ko~urT~i07?CwW@GgJLL-0<1MCR2gN4iH3(kHdgqOQQSYH6C zoJ(~T4DPzSbbOy32M%mMLjW@JlElP`lm#ldgcYf9<(E(BNz)?mGzdhCPI$;zeOp5 zRHR>bYu)(BmVf9c_v(ipf&KXad5QeKdaua5SYXsP3j!3i481bvt{|qD4YV-PpAr0? zty=ztL6{G)^H8qJCz7oQdfPbcjXuLNlptmlIsulsU(=9#@XW<9Jci{+r#el$q$i_m9132%i#h^ zwGakRALEjROA47^wr6H1+(SLDu%!u9iK;58l6Z#+`1tTTpO|9tw*Yq9zAut^QU1`U zaWBPhNE1|OXX0Cij}mXviTbAFgDqGAfjVo`56iG}nPa=yG}a`lADp(CAIyi)9;J>_ zIWFI~GOpFg77^KQKZ)SxB{O9JEn?2QYl0F7SvbjhM}}gruNMDn8hXOF#T;6%0a4?p zsgd`Q{4E2;$>cjD%hY_0lx}}zF7TIjjHdLmr2N9xDgc!?plNb}SlKDVNwgAUSwCG6 z3OLZ@So>=ufd+9K`I16*b>)wnm!RQL8MUQ}HjP^#00%%H47$?4Zc+3vgn)pRfLP)m zKl;~sLcKwsNG1m-;Tfp9^A}C1x*RP`W18SC$vX2i^X;7|)T|xJ`>?zBb08aVW=(tr z%FMrqlVn}&4>(A|%`=T(jl5!f=w=r)3?vO2vj47U>T6wu3MWk?INoo?f+JjiypWUPaoi~< zY-lsz(C={)J>+s;ABG{&$HVPLMPaYT_~>?QD&(ssyg8D;xxf+=*KBqrOuD9uf=O2j z?yg*@Gl~g0w^fESY2NrZSDaZW!i!lwLEyH<3sq80doD_SYhK$?!_&LXde{-7AXb`# z4<&sO`tyixeshOcwx|(7WUtqFi$Ar*3%wIiw?Q9_!>~VoIlasa`1h+AtnR+pWHW^XOBVDo zElz@{#&2Dj$gy*6j*@G@Q>Tt1}hQ`l#%p?WIAZ$$z05aXj2sSamML_l*e(;J#^jt>8 z=F;MhCh8AMx}&pcj|+$;YpqYP(d_0)U_u$7&X z0JltK*`uK`cSbrxdo0jwa;4-1g8tDl188>+ zC0}7PhZGZjXE>o9K(o=8Ba8{5l0~&?EC`YsjIreERd*&^^2HjE{lts5t%-#!9|uUV=F-A}ZS+{$NvuAvjB*j*=g&|3`{a-!k_<_Z3>Eud8a z*YRJA0~(tD<&V??RGWD0%lZuO1D!um@NW)BTT^hBi#{^u>wMLF0D^+p?f=sth_w>WgAcq8y1giX{L; zz0qIqUF5%wDpHQ9EOrM3gi>^0bw@{aTy#JH{uH47phPiAcm1QC=Y%wkklXL!Rj;){*n9l@IodIJEK`qlB9#uZb8xy#Ly2IK24?88NrY*8@yPg;6a zG!vweyuiACKI8tS@1)7joI4eQDr$THD=)ES@(6QH*_y}BN_JgYlW5*7Zhl1s*2ct8 z`jpT1i&#SIspBuQU$z$A&w*4$$L}h|rZQ|5jd8NcZud~l?;8{VA|CCXwq-&Ki5}A7 z8n31qAnK=Y>Q!vXx%IRinHQo$48|t@{4Z-PIsIoV8xGg(G)(|eaSJ4Z5X;svEqqn{ z@=gU2O=Gak;LS&GbB(Nd*U93An%`iU+l$bupPQjupA5p&v~>ra$Fs@Ybbs=qltR|K zE>%rUP{#OhU>;wcubVJKuI;QX3K_72W*-cg${?R>YX20*Re1^wNnE#JIBfP=W`)`u zY^5jZ+ekowBnhwjK)eQx zc~3AxI4!Q6F!^JB*jrcr=*IvcDB`g9%QpSuSc~4_-4$Q$w?X%#^Ka=z9s>q202o9$ zo_B29=q98uoORdRBnibv4Lt5GeLQFN9smwWKh(IqYH4~-Xu&2JQ7)ucm$O%uT5#jd zGqLxgf>FfpB^1Py?PrU{+IQ7-uC+yoh8it5rR}LbHisy%uKyR8s4>zY12}Jr zF1I(H4;K`(v^k4=SIt5~HZ98$LEk4{G?EM(6f4J~`s3s;P1%}9wYvR#txLJ9@ zIPmDaxx}+p>*Y@EX1P#t%>n?&{*B@OmK_TuIX%ECg9@#063=f_Q0ox?#bi2JotjcW z>U0T+{)+(sZ8;zc2YU`iFro>gt64GH8z96v9r^1SQeB^yAgwjPzbbO>7SGY9_0Kvu~I}spyL9j$lp@|BJ@~k;(vn^AB zjr{+5ZRMVBP1ieGgF|$Cx<6lTjPs%2_NK)huzTfl?ma^~N+HYyhxXTaR&6$xe7}3euK4ayO3&SzoqQDoEy0u*cEq6QKyqqKPQ&I6|p_tY%o?x%Ma zoybIoyZ8qa*M-tpm~$nx2*%%96BZ-`JmNaSTW`N5_((Y*=gRI4TYtQ)f})mkqT56^ z)$uX*-!Hq4hTd4Py@QJsPVkz2e|Y)FtUpZZS2Um~gOY>Jlk~w-bjhY3s+4p7fEn_S ztQdyPNH!89Ck?~}M$v__L6V`MkbgGL$jBHu_WZ%{%%a5c{ya3SVzZSy%P8q)XWHOg z;Gluizfb#a0A~>--Qp=y8r2slg$qKlG)BksN0l~wdY+S=9ZKFGsS7>*ut2){x=_K@LbZ?v@A$C( z@#PLUAm7p0*S)k$tZ|WfR|#gvRB%@Bbm9c<44w-W=PY`wc8tC6cm-6g74qI z>y$lN5;$;sXuZ&GD7a}AD4#wTNC&0^!i4qI6NC~f0b|aZ^9AQkY6*Mc^0*ygJ#m!$ zFg#B>k>s|;8o(Lj$aTBTlQ@(C`ozjQ;OemRx_bjE80#j^8}Fu}>prZ$Y$AUwv-_Ek z1ww~W&C^MWx8obW%)ueI0V#W$V|_|$g_3--*Uc576TMk>w@Do8ca ze1JY-rO%l-#3#tR8y`any*umXadROFXUqCjzhCqY$#&xcAWY+v zh8Nxls8%fO94vAS7+>D%#!s-5ASuaw%k2Q7GJc@ONi<$&4-j3XeNLi6Tu)97N@>0{ zgM=EflrgUTVvh1SbVjK9BUS(9z3?EjB!}S zj(AbIn7q7;4wAym2;E44>EtaP-w@Ow-PO42VTS-!{^AZtxQCGw!c9y?NhWOH`6>}mpzmGy!176BNnBZc@o`S% z;+M>=p63)NpXp%NdO8mI zemNtoiO{|}zQpZn!38tCa<|F&bInQ9L$W1jrmYzH*UIVP*NajTeRLbpU~Y9WT7=T_ zewvv5Hy^-n5}oJ5Q+%cO!@5Q@OYg#ZU5M?>1~#F&HZwgz!}&%8Xlkc?|z}v z(r;)*KbduZv$@hO(*67I+&HHV{qz;&Y?T!3atp&!hoFdqp3f5jKzS?dsR|C^e>qeI(yyaxD(0>Fs)D0&~dj z>u4?Amr-nAi_7A?CE+_`3UQ(4R{1bhdbFXR#LvS#F+So=-_Mq}|6@p7=P?8=e7EBm zN~Y>_zJ){F~*K{Zy7 z++_*HPiL{|cb754isF3n-Vq)K$21d|Sih2p1K7{tXh*F{HlPQM#Syc?bjHiiyLM~OXMdiPY&p_E(b%&8Ok=uoVffT0$RRE5U z>!cMrcQTCOs4@*#2YkrkDFpla{>Gulbke%4-+vt4T^g*dNm<2_r9&2IUOW_30v{rS zR8jZV{cc^0SuFtbQvXXr=|2I(f5SbA!c*;GHT02%_jA2pzTR)1bSFE`9$3$CNJ0SE zR6p$UL~iXQXO)F#(es+;_>`pStY0qJ`W*8MS7VCD`6Takwa$4(?h`O*EG>dc@<*N#02B2js5bWnZJq(+*@HW;4FZ}a;A`{~L?>6xd)fXI>ayx#a~B~**tmHEnJFj=Vi1N2ly9bPDOd7mt_ z*af}4-DY#WKW~=vJX%SR^K^N*OX2810Vl)@nRn5+ZzkoErsLtht*)gmC51Htc3HbY zv@|HEGfsr$rgNP5pg567TbJV0eE!u|+hBN9=P&@w!2c?EY&keaO$o|yt;>-+`p=`c8wu9Jgr7E;a4x!`Gy@nmVPh64UbH9O=o`_O_g-2Hvq^FEa1nTp{$2CiK+(I;eiw+zb*ZJc_rp$c%hhoY`~XEJyUu zeL*Pc!zrQ88|4Q*T2bpG?9pm z*^0^Y0Mdfj>x?%?#ba}>*ZrGrCnsRR)i#^R-6OY?r3(f@7QEBY4%=&9B&`N+ONBmhxu~T&by-g z;Ph>`LQYQJHv<*#%4|R^D}?qZ=P-YpnzS7hP?~P*AxFaj!JS z#{O4=BwO+dVo)R`^GcYLH1EdiN0^UEY+`i2HdxdN{8p-m+P$c>>L-nt#WRi73%y!7 zP-s^eq4(;j_5vCSST$9%X%W!6$;i_Syqn(kphWzoiWQ4a7?EUeg`C0D!S5h1)sb2g zA%pC!U%c8qZh|In*e>-Z7~dzsVvmOt!XKmVNEh8C@g+A*2(;V>vyY%_Zh5qbmyu1_ zqc)qcns5REI#E2m)exLcQzDR8XVvIbwP0&gC8sLpgSxT2QkzR8eqyJBijIy>W1u8I zWWS75C4?}#^?1$MeYn=&jns8W8R}=}fz<}0|4XlW8XBSJc#~7^mW8&7D)Qy z<8!VcIhiwl!8{5|TqTKm%oO;`T2+08^x=cr%TcO3H+)V#@zVaIh=$ES6iLZLQ!`vq&#Z|Tan+l~dF1l+|w}Glv^_lax&7f)L<~<}IxW2>So%fzQT#)217mPi+@ejI(bq=G zF&uW1kC+Yp+~yvItI!5lf6IqUFR?sG#3w>Fg%|g|zX){kC^8BpR|eGIrEk@KsnXbx z>so5PZ6j17&+5(eQ-f9{<}rsDec>5Ke-pUz}ZIfTL1s(bqN3hfB}1hgdYK#w7BvnyED<7c}Yp{{attm-=^4#1)XJPQH9G zHI?OH=~e?-UHFUmrWby4iXWhv#(33HBNlHQhVm^VZgM5y6-z~3Ur$SYfbv$h5mLGr zoZ{h6=YDPXj5A4D5pj^W|MebcXUz4>ct>{h^o{##3dQ@oi=*l`O&C zY<8McYVqXUsL(bdN{MPV(E;md=xNRK@@^0X`|$r9JO|)-3?_vTkbE?8+m|+=*=&+(m}|F zj|e{1`T(6}p3e*4@yID*VyHx$NWo1{SDP9b2!*Z|p6-l~5iR{#oldWN`6-Kw1Zl40 zx^=y;X1StIOIjz7B4wY|Kt`Muac@{y#FP8&y6j8gQ*k78jz_4Fs<&{NFbFw*m9*g) zYGfk85*bdx7%N)$N*@0zO&7tk80rw(#7K49XHj#=z~}y4c^(NdO}Oh-A4Ev5V+4KU z$pkhRI(rDt?MMDD1vtg1X(k+vJtUej!)^vDC|yp#(X+*cg4{(Mf{~$j@#{P{@27Gk zrJpGclO{xpS2^xDO4cHSHXTs&;|Xby2#b7N(I7%`nN4U9+UY4g$UyirLn-*Ho=eTt zQD|Yg>|XX^ybr)51`l1W;yy>6f9#sv@!mxGn?>UrQ|D;#)YE7zusK@dUkRXPC0D_= z2I_JvxOxY(fo6sGH@``rF3o)5aI4DysSKU#gsJ9c{wcMn2&YlqayrfOZih;AB-rA z5n)jmb|-BB<%&{JgioLP*ENj=B+)MG?^|53|Z@?h`v9V$&=<{M~J9 z7Px|ygkDCOp|S@@W3Qkv!&G0$au^IVYe0ju2;ZnyO{?t_K>P4!ohG1t>7Dj8slith zN|F)I6=Txyf~}{~zYdNn1A#bi@x+YnUqI)t4z?8FI(FlfHrYq8nwpCk%!xddmmQTY zOXz28iSm5^Y!L+GT|Zv$b@bVdVe32`_jJT2Yhaus)q9R0O1s}`k$SDS;Tv=g%attB z36Xc*`k~7L!XyOtKlEdj?NxD@`IW%*B6+V z+OAFH98-Wx{3IXXmn~ri50)hU`0<13R8v9%HcXcD>E?@+X+Vq*u$W#!nZr9L2`@y= zVt#49A1BEOZeXG0OgzdHwebb_^+54v-H%@+w~?*Y;Dte&16cw&fzfMj5`#`B0sFri z@4?fjgt{58R|0sI4A_G$A^@bQIGl;kWTg*Ph(g-yusLqD@INJl-mZENm*%aLphmKm zW9u%<3mj?DWcMHc)kDL36;2AVf2UQ8 zXPNi<_)f-A&){%?{ zXG9oM^ao2hQ)H(PXj$vEZt)!@;cWQcz%VlR;}_0DfdENof?mZr8L?QlY_t_+t=ZJN ziNc*~;d4%(T?Yju*|Zba@hRXWk@wBleecVgA15<%ABZyMRSuK4EJ-IY#xa+3+^zSQ z0wDVnTDlWspig66M;v`;W?CyCNBTpOdY4<+vig%G`K}We43v~UW{%SuCbDx?y>nP- z7EajE9a?@>7{Rj^?-IaeV!p!W9no_1Q`TJhPiw_#->p#_6Yp1_swwGELE1Di$hJKU z;&IVdha$L=qC)Wu)7CO#{+EuU0I{7ylDuok9SJr|B}Lh%ieP)1@_0gl`ics!if2cG zY7LJ;V{$1tbh+enYvgq9WIk)K*%mn{PElB^_!alweDQfi;)$Wpa8lVCvd*O#99Oqs ziTgL!3lK*ANd`l4QTSgbA6)j}`Q(4um?iB9nmJl0ptjBvYy zj4!}7uvRcwzPCG4^p{fD-$YW;znr-Otz?XnLB)BGKJBz%3Pq$UM+Ay3txl3ZCign8f9V2r>AZ5nVANw~eN!*P8ZW(9R`bvH>%K zZjK^1Ee^>|rVdg&U&~0tuXld_)VMaI>u6|bcw`PTL_BL*N;?#>gJ=iLFY5AXMZ;vO zPp?s&3B;G`&1T0=9)HAj-S+{kjX(QPQ?o*Jfn9=bu!d^c$jg6@*ZO=(_pW?S@f-%edqDXhfc zoM%`q!EOuhEfhe&sP?QdDNhm(;_t&+G}`O7MOC4}7vCTViPx9$bC>UAP?r z85rWh9F?Wj`byw5=Jlv?oS7YjM6jukFx9-tL7H)wJ0@(@q1C3QFTgJMV(fM-&>o;$ z4<)@hLz8p6guqXeBLSXml1Jf4*Eem_a8B#_x--#1kIY;i3HI6ChNC4fXTnPn5)ulM zWG-$q0h<~j2mvwX_P=9C4;ffetmABVo_A}kF)Hx_6^z^OQndaB=ON#sm@6fMT5x?3 zwB?eE1gam-Eja$2`Uh=Yzr)zI;T5hX&NYSvj~aYz5ax}dmOdrAX~XrA69myKc#>z| z56APB;BORi@FofRp}_a$Zb$t?ufNMORBNea;j#h=WLRc7ME|enb^acl2Uj(ag7R;M z>%Tj{^Lp2IZMoHNVsJCiNZe5{>xwYpN!cxILR*v?xCHlC?;A@BdK%| zuG@3wnVqcxR)njf?E|7H4WNp=N;AeqCbDklAix}tb-rjRjzFl+ZYHaj>Kw&liea#v26c4B3 z-S3U?J`;`SjhvyR9^=b)`keGtM}}*BmxgrHSmi9Eon>u*#z;WJ@M*2P1f86mlyq+B zCxC$|%WGM@JPoc%(N7b5jEFohubWrM{{e)bH8R*J?6l!Xa)#l2In)LyiP1;Ns@l3_ z6G9eFcNjF^#juTIKm9HlEDMBV=A? z+Su@CjQlSJ4e1DV54{?6%N7%U$C|Q;;?Tn54R?vSAKeHkFq2n{M5Bb3qffH&9w6w1 zho;zQRgL=$fZ6!ZjEL^n8NM{uq08H$*emy2gik(nnZM3ZP!yM$P81X+t&v_x6zmy! zv!P~=YBPFB#~Nca(fXYZ#R{7=yutZJSzKitpd%$iP|5R(VXGMTNt=`iC&Q;)!vw`b z7}4>ez$|NUmh}(Poeb2W%a{4MI<8Q`fhbcAm?>Ax-D&*d>@dPnc^Fxq^99%&! z6ty(KC1I$r{$$(c|p%lU-RAZ07 zXz8MuAE5mG z`?^}BVND;OmHiMDf1BmkJ7{MYHYbiFK0u!qq3^G=b{lS4$gxJA99`8T6OgA_ka8F*k* zuj&vNB-h)-r_MBT%>iho&)IlWnw4TR*VaF2VAxE#yW30lxHq<29Q{SG>d?fGSE41& zhQs;l@=8huEC{o^kfkNb`yUSWjK|YP=#i;efKP9C-YZQ4qyLfEB9c|`sT)Jwot>4$ zX>%c`z+_im&b$#=-J3{l9j?O`KF zA1ewI?^sWa{eBc5o_uYq(Qg~AO}9@sxq7Ppro*EhC+RFoU()$9aZ^BzUjp9IXrkUD z`F2qJkeSUlA1^F@GZV9MoitOqHnGb7?E&?z^p#sB5Q2R7E&AicwPD&?TT^Pz&l%s7 zCnne&>mNvSc`&rp+Z_h4f}Vxu5MIp|4gMJz{i^ufG6LSdp(Bf9-V%?Q)tl>*y>yJ1_8!qzC3P-z6dCVaTx>)TV7iTS+LY(Ug zn4XC9Za9fDw1FlxZd@JJhO3rN`g4DN-dZj~LziMAOFay7f8Mu1w3LZ-adv&<+#1k{ z^$g_~ww^GiflETS+)SVPW8Hk4kh??$&ji=#xyRS9UOn0>E4Vv`Wk2|F`#Y< z8Tk*WZxY3z`q5(u3B?eQ8f|^_?xPExtp;O1-5N{w(50Tsd%<}T=9qn~1UigxkEmz; z+(8+5Ql`bEihaK$*GW=7y>4xXXE&NiVx)7bYG=*<7#Ml;X{7^m{$K8ZabAPba@T+Q zRMTRtvw`kCBp$uzMKxQ9fV4!Pl7>iCrGna0s);>XhmEl z6+-`abY3v==O5pp6+CgGoF5vdaDTv5)e%REu$qwV!bH~R5~tFh8&bU-2!#nO>6Hxi zO%p0kb>t}ia03*ns4gh;`u70ChL8&*wK5k>_QdGgljYxG{|u3f3*`;3d|mh}K~tX> zwx4|S%eeGslplW$EjLRw<$8LG5pTrzD0j@E+m^LKbAm`|eM_`4V~cU)oc8A< z|7Uc^RocWS22X?rcRDKSQ1#(j^56*uq;V{iQ%>?Z`LRf24fsV==x3WzDCq!HCC7=E z0U=SH>D>=wh!NF*ukD9%Bl9k8g}u4!XAw&zq&(62eh=xj_U+5fF6YKi?Js-^ndr)J zf1}%rToYZXaLJx(OQ33yPK8i;7xwN4X}p0s9*uW0z4p&y^$L@ZWiQY22$r<-q8zvv zCiU=WA_+=)%POQXO=f}!Zv4|unVPuZ3XX~^*_h*09NCu7BC4mO+dGtpIo?C^(evX^ zp`Z<{H^`tiJ$RvpdBj!v%WDJjTSI?@}K`ybtMiO3f zNN&^WrSc~jVrF1T2U_<8n9~+g#4yW~)Y+LSYCG{i&cq~XsO$}AN4PjD` z!Iwv#j`;%4mfaw$B43ps7&@j={Ks}f%vLq>jz~(%UO^`|95WgWhma>BFQwL<1x?uV z=m)h4c?aLW*p4qpxDgF~Ay8EWApprE|F45a(8M(B!%{YclJJ2p3nJEF0i~I)YB&)$ zH8koxdd%c3_osv@zd0vlrf+5pS$Xl&2yf|0S_dD*g>g|wUACeVcuGrJHV^&zu2hBw z?3lzNt(xIaNB(gr^OIEz`$$;sA5&C$SxpUiM@11VR!Ry_?2f4qbTDI~K+dP(zQdzu z*l6-v*0sNGw$vrykGXgPbOKfzGWrBI<8XCVp6Jr1*yU~{o2kPSPO&&^NRLr?=|pX* zrXE9NM^1DZar%&XMH8))$G|+a*PD<~o(_=yV1kta6sRakPnN##=-v=YasJzVE;NPC znZdd{4Q3ec+Zq8)DY$;K@N%A3Y&c&9uK`OxcHERVP=1MMvV?@DjagXwWdZIhYDmAV ziFGtB@pQR`($%w!XUb1w8Es`C@go!dUAy+L!36N@JyiCDeSM7p8H}Oyg%PxBg}M)T zsmAZ#p|QOocxqk1n7aH|lO?)^OMXNS$r!Y-!G5=?X?cQW0wu|LccKWz<(%551m9U+ z%UQ>>*Nx!6Vt#&`ngQ@A#NT}P75frhB@p-htU90MvUi#+9-kFP+h{*I(Fe!pmMTuh|r@O-Viq$Z8v_6Dg*K7;<$=!q0cf z-t|JK$Qzev*)03AE4&X)Bl1nXnOE`qvcHJIwcf)yoy4r^9+uNQb)PI@IinW7b|!*; zxAzn}jtkvaQ7`;v`Y)6Tk-)V@)2?h%VD#Z4Y|QgwlGlJc?o5YGn!(aouN=rc7vMAq zDK|{^N@ZN{_*kPpr~r-VNg+~y2k@%A$w>WJ`q7_e7Su|=Ow%8;bP(C~QR-J9D|tW5 zsUbHOnELV0F8NRdCdcXy~_Z<+uccv0Rd5SI+sr9BeXL<{IknsuGkLmIwN48#M ze&bD#nt)V=kL{o&yrb>Yv-4)ru--v#_H4_iWwF|fMoIb;W}N6l{|<+AC00g7#TvR{ z$SWzxOo`)@taaBg`8qMR+5WmNz2_GrfphLECWU|9P_ZLhseZ%AF^WF2N#2)B%>MJq z%cwe3A?`iSd3X zux_@|_SQD|Y`I^e7xm=J!?sjDY$u|ATdz1eEp*Vv;$=u@7}JEE@z53zuuEuK8An%rdi$_?+r~)Dwn3@ftu*wt z$Hjt{sNqd{n6dell)kIku$Q+ z4ObajVVhgZ-3pc?@`L>k>P7(p9q6T>p17WE$cV9>^coZvGwLSsVq*uVXx!#K;`c8w8j0J8lWKA{-X{47~$VP^i+?SFZcaZ`cRrB(tr1r@ z$B5qZYL-&~;@hp-$Quhb0zy#%9*n@iz&~gBN&A8l!$$SN2-jG(7#I9aYFPk|Eltr z27`fbgHxycD=h#vPk(9h7yrvalG(XdGO$3(;||9AACB(dTOttOf2cPm;c1W(m@mWl z0}^a0=Kr*TfeHNguljtzfr5E*Fca`U(QeYKtVk*Xwg)l!yG6j1#HgIMj7h51v_7c6i1J(;m(1P{V@9UZ7@*3+GcP{liVZ4V*kK(@a zzqwCN`QM=bZ&G8oQ&mj5-GmhqN#@!dsHGYh>~d_4TaHdPHa234P-b@C<%(KgW2BTY zz`mK7Km-RO`}YtjBN$e4;JnmDoh5d^Nz zt;__6ebpeIWh)+B@yKK2{I(25l+~@2P^^>hS3ompo10}y4whi64qn7e`&LuYtGxkVQ}}V9yV8ov0`Jx(U~oOBES9@=-+d3^~KXWZZ0qYgbgfDs$1G zro}O3cGsY`vno!J*!C?{$DFPlR=1UuaPa!N)dL>Mdre?soQHMPJa4Q0TsJ)I2j=6) z@6H6mb&yabF!q2Bx4ZFsugjjIMizl8I8gqLyQ|SAJkn$?GY0L(`q`6&WK=SOfI@o( z9Q(VY#L<|HO)+|Q$xkNdwwqFcqFz!MiIj4HE zgZ<<2!=P8oDlh@J*rDhgmXqP0w#tl~@_P@i3_0y-{4J|~v3Jrle@gCMDSjZ5u7gcF zcG@EgyN(R^1t8g%%(jg^(Nj_Az7eLROYfJThk4{si5X2nKB)_}Y6(t#JPIU)q{mCB z*~`osqhYM`Jub&>$^b~|R|DYp;hbw@VJIB8>H(+a8K8LVD5~Xm8C~d1$3n$(unLo#g`$fpPU7uOr2PlvmdhtYK%^sOulFA@u1G$!ei=tAANa8 zDkzt6MB0?_=A4^O#YZ1C;dmiKIPxZ}PzQ%1Ee#EA>gcoJZrr!H4?OvW^tK$*L7rTE zReUH*#BcvgbHk$UDOY#;yLV2`V4SygbsEa;b*@+(+Tch%5O#j#J zMsOc*3Aen|ikcNc6A|1)OsqL-tQWAV(+<%U)7-K8lqCt_|#m_=?Sq8ve0$qY{CoBX|e^h=t1< zy*eToX9R9@c({f@s>X+WvAC%PuVTj?i1mJm{rJkoV+=zCIaDW9eVce={WHc$l*@a& zFOnu6tp0rF>`dm|6YfLj>_3aC4;0i~gP<(RDUyjawx>&f!wA)sWf9$99|)cD$uLRk z2I(V!ayBEpY||Eef^jCh=(lND9YXHB|DY27VpFxl;9X%P*}a1k$oSmr&E1C-!!=Pa zP8f&5?F+BydYpn^@XFb!^aE$3zp7iCUm3KHq%h@;;~ZBorgnyP*SaVjb%<_0yd6u5s3PHl>Q$>f}((Fn?}9u8%Ey>0~!F^_p=uMFkQ(QJW&O(08m-#(OcH zp6?VqF1)x)QfEZseUNu1O8$84`n1?JP#X>G=L^2SkE zC6-xGTC`wp&NfNYR1MpXE)n!S36CjDNWMy)H}eoZ6wig^58gB=k-XlK@~nt3xs6T(G32oU+Bnd5{1wrdmC8~SXy7d2SU;nM0Pe$- zzNrVfVF*_W@?^exMzzUTs~F!9GNGPuH`J+k?v42zb+BmXQ5 z$af3-Kk_}J?iPQAOU4+s@GVUW?iDMKx1d`)19&XrM1wqM%~HUBn{U^H2mzCyf*3iiA7g&lAd zZ6CwmmljGqH~T8_u%gs?5^~BXG-hn64(=*(C!?K|%){`A>U!VT1=78I7v2oANezfT z&s|dRR)Ce!Ki3;A6)XVU09Sk0y+4!&hDV&%hApY6Ee;osv1+3nvoKu`XW&vHXh=)k zqM-I)&3-77>yxaWR8C~S+(-mx^IU<9mt8LzlxV}g=un#D==S=dIK%;Fiuy>!Yyu+k z4QS4Rj;AXrJ%m*NG80RzuiUlB!Ac`6(s0nEz) zd3FWpgu8<8V+x6XA#235tikJt1kq9gc27&33(Nnh?cn%IaKnMwxN6)1$N}e_t&9F3 zl!qxgH02~|%$P2&$MGC3kidBmr|8D=RX#dujt_7;33@fCEI959emBOPPH$uH3uw~g z0(RY05i;uVa(0um?4$U);pnK9iV+h~(6IrR3RSQQojRKO$OvSd(Y9aA?=vI#C1O@3 zFUe8EV%>N+(Ww%+rwO69#fo&{9PQq325|ruWSx7PZ~V{4Prr2d?uQoMD$#X3yh2;Z z`1P}O{AuXFAV}H0=zU5&_>au4;#}N&ZaP@WVn!iV9gp2jVE3FN_R;DVOfY%%+n%3= z+x+|~Fu~c>*3fXAv!-ohlWGQbBK@cVtjGDutG=-;=ZKE6toD06SpQHY+%jIeMblBy!h3-i-)%KK02HB;!wtx?%sR1C_9|c|`Bqrwv-yBBu)SAt%SAppO$-%OV zOrQX+MBe>TmEyhsgN!JmZR^dX=JV{5yEjq*y$YTGL9e3F%J=`aS3!1~6T{k`9hJ|F zvNX?GFTWUSZv)FUwh-V7V7_<0N)oXwH!C>eng)7(vYP_LBHVs|T?`VQYvevkU9 zrZE9aUe*DFW}1SB8^?<4$zh+NgT6r|y-c^P%J!3(vfSaf0k-BC2z?rk{opzIlpi*( zbZpq3+YB&$;~!pXZ1X+X_T{raY{2DMC4pZ(U%?V`;I3j?V5QT(#F5oV7t48ai4Co_ zRq7pMyDiDan$A8FTL`q}>tL6(3Gzj#)9IrnB3D_b(r!-d3Gqg!m7{t9I)`^aEzO_0 zY2XmmFToIcXITy6(#I((ZU@=v=zdHrEd3mpCvNIYo)DM0iuLKBS}|!+O2RjNkPL3& zEJ5acbaA(5_M0zr``)MTgTHhqtE~5K=6_A)9tve#^c>q)#b2XkE1uKeb#1s^z7MnOi5LgCNc#$<@0X z0pz=**QW_QYhRpEM>B8uaCMyn4Bi0L{6T+$>CjA|>c)fMdP(rzD)n!7;DaD>>l}w; zgj3xL{#Rb|DpEAUe_9Tv+S)UO&moj$?_>o4jvbG7C(s6#RD(j6UsSXTud|oF4)~P( z5s0+{Jp(lG7RQ9tE$GqlU+-zwfSR3^^~}OzGwME zjpDhJFR2}|CVW1Lzo$cflwuUJr@Ru+ZG$h41;VW!SB?ys{n^9E#i)uen6HEM9o^a*X<}JBS`(#QymuUd@4y&*=M>}o94sYxWB3-p1}*Xy zlzrEr%spa)1&p)2j!&0SRmN(y{D!UG#BGbQ^*9cEbY+)$JsS-)p|;t2%1bd^d3pxO z>sqTo`j^ed1$v~lb^u6-blVxe6HV*ZrQ#o_M~UA!icWspO$U+At_u^xb$5{zRXpm& zuWrqYF|@qj^zQt3`B%{xAb9OS2PEiuTBei0rh<|K6NQ> zY${p<{L_|+!JCH!(N8ppiHA<&90z-qq+9SwX0m)!8CL0^h)8=5LEXP7zr@Cf`HcUA z3HMGO;KEbFb3nnb_^p`|U&g55Zqvm+_lGXCi*zCKvNA}165ION+gdJ@} zyPVec;8GH|sI{@pW5|A%eB3sObA!l4#dEuRuST-FK9*8KN%-~g+Ky}H6E4+ti^y<* z_bPVlT}3_4rk(f3r>c4S=vk`~`Vq#|rnKvr^_3|(+MaD@k$nN@sdtyg7O6&~1_@~` zD#X#j-&FR^lZXXAYH_KL^LqC3}l%q^C)7XEFZkIl_o!B|c-V!iru?ITs^9ds2 z;&|FUcJZEZF|rKdjZS_|Ed6XT3$N%jh(mSA#y_6Vi))s}q7IU|hRMhT)fn*iwP z`m>-XsJK*>li#tR!>?>dcN+z6p6L@H&z*KqZ^vkDIj~A8)zt+8K`KvdI()x zTGe%q7_)z4bZ7DVr$x6ox6B%JZ;N6rwH>st!-LT(VnOgyBfH+XeC6g>_)qD(0aF+% z@WP}6jCvg&f!1B|oNup(V|(&ef(3L^_9pw!dx8&gNS~QyD5)(#%IFc-%Ub zv2tkGCTMNZu2a;f1{8wF?TF+Zt$c#SBsuRtB=yTIi+*5@HpS@1f%q8lZornpLT&1d zDcaFf&zj9Ug=GxLHiyM|bNnq_IcJkf^jCV{B$&DDVr#<&1z)jo#Y|e(a(&M9$$V`& z`W`nbgQ&>p0huOtgg!92F%?0W6UYb3p zn!z#ZN8B=Qx!vf^z%d%UGb8z}F3NlqHCw!5Qaw1<)xy$qPsFxN#EixFMazEaB(TJD z%tTjw13$4t7;PyUH6?;|a|kBwA5;n`SF4J(RgR|dhU7DpCUet^4dvuA>+B8a`8wgz zsj@x*(zXE0?pkXtJ2~@&xgN74B7H_*t<-LS5%7r#Qx&8Q5@(D{e>0hJ_zhtpXv@e- zK#7hDb947FlwbSM?VrwK`np+6yH!8mvRck$*- z(1$-jvgfnW5(fW;;_Wfn(M-RXbz>U45Nl+>N>atAJG7FvdD^ zc~>`I%V`;H?U)mo+RJ&1-;}@IkYGNKe@bQwD-(Pbu$mb$TemdzIK89F>pHA!6oxk(Kw$)6-#s zRc5Qxp98D`ATv+w_+x&vo$qgWeCbc~G{l(ZyyXp4IJh(zVHY0w3K2xGVem$@K2)~w zGswte>P{4XikjeePGZW+9qw3{`bm5{L z-|2exA=jgK#f!4AyvRH?9`D1uwjMgL!uNz0miTTgAwvJW5m{KXgfqzxEsmF9=)7`4 z(RXo2%;~kiPBSM2Uyr9?S~X&{#{C|L1BG+gW#*|6yK(x~Q6c*W3__w)v-^mPny7Anerd&_7c_SN+-c$v$6E^&7F^;8_lu_Z7jE zEcvYo}oa$RU%?V+x_+F2r%HsJ)4K zezr3saPPWdPL{;tVeN9-z!`LHt9busCgc4U~kPMJq-L$|*rluf@G;O4o>YDzBUbFnR&a}bgH`bYds{ECArGxTh)>(px zb`$#$9;$=doC>V$lNuy_w#Y(W)q85%%L2JxY`}M{qp}o(;(9!v-kukKBl}v!vkK&u zhe#YaBkYNchu0q^x;LqitP^Z@%&%nH!1DG{9+xY-78qMj{B_CCgZQ-ldyiv+e0n^T z7KSChahD&4m2N)rO@Y#+yCw%He&+AXK zWvZm8HDeypfU8Hno^p+0XF63J-``;LBrZ0-VvHDIpAwo>cxV$bO`xBvZ7ns|&qm1H zb65FkQo9Srm(^;IINQ!RVv>yK#ejfYnn4r(w>-I;J$ZNA(wZNj{QQqM%)f?EVCGKG z(cD!BU+{!XL;1ZHw3gmH4=t!pWA7HON{chAxf10p=84B263v}+JFBgjcvjEub#mZqgEtx8O#kid3INYgo>8r*eFYr5TCE_!QE1` z7lTr^o#M(QSTBOle?#xS!iJKF%s7LslWAVHp3ZEv1d@eSYLwk9*J?25mg`pi{<-pF z#1MdXaUcmVPBurRg_c7O>KWsGyGfdtlnjlXRtBD)-ZmZ^hM!c=Qu>|kx8T7mH0&>% zwF|}_N;LkIy?(4<;fXKGW-OIJsR-t z_ju^Y8vFlC5?QK>ogA(84HzhP+bf#5)4rfo{r*H?z1fWoS}Zfe`K7jnTRv}r0yvxC zOt=raCF5JfuP$=lPY2>MLS1+zoHrl7lKzVQ0lh@E)4;^rMad+ygc!5w^rL%Jok=&* zcRgpM`~jxM^|f{0DyQr^FI7TrUN_;hdN4bqh%ur!`~JFbGy<q%{9$k zh{9`}Ym}AjeXd!$x#nKm1YO-^AL4yL<5k z#HT~Xl}YAvUDUwjV&I?fY10W*t^43qAJM)xNz$A0)Yk5_^}(ZXwlKewS-GQ{93%5- z@vOy}i2k8-pumRr18GoK4jGNaOn03~o6#*Mx-wvzm`~_3z@|NGpKC7s@`TV@Lt}shH)sXT?UYg>^pA*g%BkNnqaJXD=1DrOqzZ?$V??rR*hNVID7M2Y{ z^_p9>;o5w8_oA10l7qp*jYJHW2#f9AYLLxt9%J+s>!jFEc5-}8$MU`+q6KHZ?;Aqh zbz7d_gu0gT1=C1zmx*XGju+6s6M5yx2Cb<4vlo~`il~pvS9^s;u&ysZ7?(3VhJ?s# zay_C}8lHzr9r*^Qw}WVopZzrTJy3145M?bB$#q@Dzeov}WpAGps6Y;VxeN^?`RZ2b zx|+~6sOp()Y*j{^red8wG1H>LXPKQa0bOBD?pR!gsCD-33(mQP9$?kyAYw>X)6O~? zfiB~VO`nQ)y7B|>TdZ>%cvHLKtejzD4wjoH)z2i6g5+*exO+GmwnVjN{>J$)n0H+3 z56r88gn2pKpXo;8BvJ}6dtpe6N_$b#1-jr;OYlpz;-YOkc`5SaO=L$Q>E-hw(tkxxO~cacsJ`4VVDXm&l zv--B-_ERMxSb>Z-x#S zfJ$1G9$WSw6tJZXIc530&yb}|uwu~V?a5U)CZ^A(cU>D|gC_OOfv{q$&W-QIXRAzOP9Pj71U6H6<)d9_!Wf zO5fI$s#b0OmZ!HyQRH0S{W&Sdbpe-(^4=#Oxxqeznr19p1LqpZ?jFjbxIOBsOP!25 zdi^EB|Dg0g;;7N!(^RS9o56S!_gUGy7hZP;t5gSy!jhy9fAak`Y%;=ZWXT^Mh&VQERRMW5SdBp{u^cS;s^3XStfj5jAz?WsbL{IAaT zSNT7Z#{?BC-4|NwIi*-F%`x>Q`0^XDXVOWYJmuBTbW;@{bGBtK&?#@IRFQ*G>B62} zOyNf0HlbWl2pD#+^uDjiO{3L7Pd1T#R%b2;OB-;%vM&}6XzLV<{s*b`hPVJ{CUQL) zgfe3_zmuu3Zft3XxV&Jae)Ji&a8Qj}1O{1Gwg z(ba3!&g}ad59n<%^uLsGDqsZOY77%(Dw^@Ps-TW9t5OAdqGt7hnd4Tt1Jyip$1~*4woybNIs^$pW{ z##uiAVSEEy3Wa+^D23z(?f+REOdO~ki#lN8Dk5M!1($Q$ zv6T!`a&dE5gy_g*wPj?HOdl8OlU|s>hPdJrYf5Z3F))5%c8ojyZ}6?ew<^qu;4SaS zpP{No&g}7Vs@p0%2F+OGr+Qdg%3lHrHhB}9hIL8cK{_}E%2-CpM$oeHa>}x&8^H*J zIxptD!IR#>I(-Ze6t3-N3k9A%P8F-Tp}w3^Jg#$Bxn08`c@)Ht%Gn%Dz$;<~zbI#t zSx*TnH~2b{-U6te&q%s9m$`wiM{eDWj3xmXNZc|A%F|0iUVE!kFw>VaAx*}ZET}vG zi6xgaTfEYksT8Yj$ZSZqADF9Az4-Ozx=qx@j)=BV=z!)l<;q{G#VP}E%d`E%zE862$Xk2-)C z$@A^4^4LJ|;dE>XX}7h-qGuCh8uu|`;E_KKZ&oH_)Rkd2N?THGGgFT%eX$exWV&RE z-ocIF*SzN!u1%@|HRN{%jE&usa7C}z!hW-$Zmc`^Oxb`O;aDj!G(ZAx2gx~#(HQ%@ zmF=uXDeq51WzBjFD8OCXo=MgonPP>Z?y)V18gZ>afd8ion)PhZ#@(KqChS8Sjlu#n zXwEs3)>H5R{#`k_LpfsS+`Zv!;_+PBoDIzSuZ1|_xJ$ve!Is6m!jY^DqsT%qA%GFF zl>E^o(bb5LbR`!?-rM;SRBw}TUzl0mPX8qdi_@dqEQ#PIY-XiwG9)^k@8pP~XE{io zR+BxRL@D@-hX85$sgEg)B)|!iH;|#1)rI2+y! zOF*4CUy5t8h1s2yN$897P0i`Rtap%-wCdw=vzIkeq$*bVlnGQhw9^#9xRb{ina}tp zc2y;?24WvJ>SV9St|i#j6TvHe%492$6`>6H&Oe&$gG{#p1G?`>>wfl)-oK-#qO!5- zXK0W6*Hw4ycoUlFdL9Ll82vq_>LBlh`dyjDdbn9d(15#o!lgq9+%b}m97t8u&W|Fr zE~5_Wo+1EJ9ai~QC6$XxU-#J-zYgsqSF$z?nuTab#H8|c(hbEz6{lJ4sWu3S77b=9 zH<;239}ee*2jx#%bnw&yi0xMVX77b{@=2#6>t{Me4+F<0nK6M$GP`x(Gt#InNp?C0lj=gF_@Rp`emo)b#z^jX{BG zLz9+YL^YUcz=0C{CpYfwVDyqDN+9z+pnQSr7NS-VWohjYm0D7He+M>_hUUN-u5EKe z5XG+26gxzOThrI~8s`J_u$cRk!$hB48HMVHch5sziH7x@O;As=`Qfn;;OPekV}SKW zS@jb~ypYIrI;SHEm6WwJbu3YI$9loivm|r%;A=?!Y-P2sV4>qz7d`~3K)UFQ$n?or zyzVnXW9gLS05!NiO_JeN-r)3g|A26?sBU?Ns7jk!*+{e@MUrD5y zet97@CJ@oer_X|zz84UM*j?vk#Qip@2&#JXDRvk8c)Uw#w<1y{r$0goUG=TR2hCUq z_DH@$A`LdVbTXG*(STl*B@2CV{bIcgfG_Lq!=sjlI{BXMy?Q#DRX^;}fC%6ezPTzF zo5It|DDic43%$GA0n+a+Z#gGwn5bWH((jF=CrY`8TbG;;&UQBD;;X#LqD56YsPh(%AS2Z(CNjkVW0NknuSolGq z#wU4hEI@L~!r&_e=koS>k$>plztB{q%LEL(11uj9(hvd=*1uui|C2G-L`;`6qY;5K zX1Z?KlfUsOw*dM6Ee{ft?j20i_S;LXA0hMlGoCnG*1gVM=QjCN!88w1mcF6vq@>E)yND+b zS@5sn2hnP}{OU|i^-?V=N=@ZYNKPlZ(^w&AOY1MH!^V>Gpf&mw$aL6Kro9!LXgYKp zAtV0i<9t#+HxoPfB&+c_%XDW8!SrU!Kxs1|mt4%>h0*F+>qv%I}4-l%- z#Tl5l6&D3iO49)LW=c<_(X!rVvC8Ba>&*xrz4TX5IB{@S&`5uE_TXb~Q;abuW8Cb{ z@cWmW>!joacyAd##fykB3?;-8H3I3x$!sGeRY@U61B91>VXh(47E_j$d7km^dfvOc zcJ_EDup;`5D~aQ$cfo#wML&~&F5oU1^kFylmkf|5cjAQlI2jz{)LrnXa`mv@%_~7dxVsT`M)MjX3*%L_`PHLoIs+#Gt=@D@WP^)$Hwy12gO1kn{)8P)} zW))sv45D(&FcsY~NksDo%Kvarx=f{!mWui{7BKsAvlr9+Pu}k^{h=mLU>wzs{$T&R z0TeHQnP-#fyfb+5f{Cv0$9|Qr&JXX-L`)oeuAZ-7Epb)Bdo+5~<=9)0%~1EEDhK%NkC5An`6AupN`voby!{+hTboU7FC@>GF;#6a?~JOAgX2VRV%ekHu( z=0R%|ArSw@YmfZQ}lQo{tT*5R3 z0@ME?LKxoWU3e)g zdc~H!zJJ_WI|tH+#lEY_V(!9P$|f5Gy=?$7t$BVs7PdGFzQuk7k&qz*pK#%Jez^xZ z2&}eCWR$`#N7pK)&rMc?);r9U7)b>5Wo{nO9_7v`{c076meAJn##&8#6E_7HiD@z z{OIC8B6U%O1=vFv@hm^|xw;nMCB!=QcdCX@+YQ~jJkdRl(>*yo_8ZYn(jg4c4Mgel}7eClwD^@KG z^j5$;PRc=yFA;oS?-<99j_VVEcrChs&2w|a;+`X_Z?%Jo^&??DD)UHrW;F2A~Xb5 zu^|WV&fK`bZUj$7CD>2V@Me57X4f8?2BuK}?ZQ6MMP}$&lgvEitaBKuRkf3W*AfuK zRYdfXxw=OGoBF5ok0fw1U?~$#*exR&Dm+@YVk8zdh~hB%Is{_^v%RD`%viRn4F64n zCV3UAgLD=vl%(f;2bD(|7NphKFVPUt)O30i5GWVuN-y*I!EN~7==GJ!dZ|*JxrJE( zL*(=0$3hmT+c6+g5n*8|0SPA;wJ>>cK77GAp(MySs*>Ndj%HadG8}XXHznX&*_Uoh zFrZ{Zw4ky^=}=++Q=C8{*f!SUUZFhUeBaU(#@-oOrE46SLsQ-!VkR;Hs9upO(f;_M zBt0_+0Q04!jT7#Ngi>n)-(f2#R`Er+c}TZTA<^X1+2{4K$zYd_$G%+|pwm*YtN>Vn z+}6u7MPvN0Y69P;TR@%iA?NF3Tg&@|dTgX67IcRV+}7uBvnL+vZTIVs;I9X+$DUPF z8e$`)MC&4EE0c!C3S4#jO~0&T^Sn9>!ueH`nq)yN{X>5+Yt-ZFbb~3#FAHNjQ8Zl@ z=(&%p

k@esg|)l{w3|6`R87nPa&PXDNMM_SD&Y#Zd28%Y!^VN28e~quymaKR%Hx>7bI>&pmp&*$M zE#MVb`d7bD1n{Ij&2@mUC9XwERZ&=>fay^`-`#VRfp(=2jd-BG5EGdd$v5$j_HXmd$H5 z1YaW%+W0SAs)oYKSt}j^^Vq(qzG5JGSFX~ryh>5Yk9g1epWK7)| zB#Ub!E@||bevmuqyl)j9G_7#KvNR)k!sy>0SEL8B&A? zr|a1@%`O}_|Kdq6zKC*0@eq%=81po+SB5l8WZhIfG!a|RFI`vChhrV;jI_M8imYDM^GrF;w5| zcvbb`C>v1nO>c3Ub-5hRBJi;Ug@M*OomDmItJWwGDdX8Xm6QG}H@DshYVNTGh>!8; z!N|5z^}XjT2^qraxhXRRy|Dk{`I(=P z+fUxr9Xs;2r#$C%(QM;JU99!bdLP<{CK|V~@BZw46a@yEy&UlD{tz&sZUo~1gLeGd z{89y+;0}vb@HVT3O4m{|D7) Bxz7Lq literal 31418 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 Y6F@TpzqBxTj{HX%NyX=-;zn=(4@vT|m;e9( diff --git a/en/chapter_sorting/quick_sort.assets/pivot_division_step8.png b/en/chapter_sorting/quick_sort.assets/pivot_division_step8.png index bbdeaeb09be76236101854088727486fee02f60e..3ada3943eaa7705508fdf20bc2a32e74e5d992b7 100644 GIT binary patch literal 31675 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 VrhzI!yqt%FWTlm)N+pcn{|`|v($W9` literal 31620 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 delta 9684 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%0D#xIct4Yru#F+=zCq0stUxb+ZnuwiJqrB z5VV3WNMh}qbR<EQXbRZb#mbhBXXrGMqX z`-BJZz8Ky+p@M*+1sC)ds zs>9{I-YsEDY`{5Gv$8k+>Nuz{`7{+Z0`N!Ms6VA*7e@l9c@4xGC{8DoUGa@PSe#$5 ziE-xd+4SCY55#2Uqd4QaGx^H3rUqXd<360qU8i`~P*Y9!uf4n$J7c_FN?D;Nys6N> zakG{ntrN7LOxgobv|}yVoQ~T+ElyNxIr}cV0jJu3^@tj})biCZ0T{ewd=R~R zz^LBzEJnKJ#nJERC;O1u{)O_Oo`ud@Cuk3t)+HW_B5Vy2_HuhE-^2`5NeDRx22ZSN zG}VpJDuVg-2n*~}8xNOLq`7CQp;?jgBORJ`K?dGDL%8>Bs9DDF0V;kDrgAUI+JP@b zALwqF=Fqv8$nNwTW+u6#OB4DouvDl*(Hv3Td~CniV_#Rwt$lSK4l326_r)7jN9v(m z7aiiC^X->*f1g^C3)Bk>GLKeEl)J*wt85tog)@}WK~SQSH!rWtMD2{7X*c#6 z3ozjha9k Zn1RNt*NgS)-w5qH8D;7Jvvp1hO#s5L8)pCj delta 17024 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 diff --git a/en/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png b/en/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png index c7870e8b9a94287a4ea6418b6afd07b118d9d1ff..ffc99032b66accda71014519c886d96f0759e1e3 100644 GIT binary patch literal 18783 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 tJhC>x$%0sk;pyt>>5jZ**s literal 18493 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 diff --git a/en/chapter_tree/avl_tree.assets/avltree_degradation_from_removing_node.png b/en/chapter_tree/avl_tree.assets/avltree_degradation_from_removing_node.png index f18234bc53f31ccf6ebbd35ab2f2b645da646f70..bbf8284a8da91aa174c1708e6e97ba47a63f2b93 100644 GIT binary patch delta 17536 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 delta 18768 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

ZW>mWitP&JPhrnp%adn-3@!Xk0;$p8#H8N{; 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 diff --git a/en/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png b/en/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png index 51feeb995f61b09200b44581c73ddbd87b1bbf49..c3afd8c1b7635a1b96d7f6375f53499f605808c4 100644 GIT binary patch delta 22762 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 diff --git a/en/chapter_tree/avl_tree.assets/avltree_rotation_cases.png b/en/chapter_tree/avl_tree.assets/avltree_rotation_cases.png index a40532dfea357b7950208bdf5a6b760d4ef2384c..da4dfce6dc1fae426698ee94e1a11235d09c59f1 100644 GIT binary patch literal 24063 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 a=NJ&^^w&%UU&zkkOMN{f-7;;v@c#p8&c*!z literal 23631 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 diff --git a/en/chapter_tree/binary_search_tree.assets/bst_degradation.png b/en/chapter_tree/binary_search_tree.assets/bst_degradation.png index b8a7327528fa2c232908e84291b3fb55eee733bf..e56933ca582eee128132a74bdc013057a9ce8d86 100644 GIT binary patch literal 19981 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 T+VAg|Mmo69$*y8=K+1mrB}wo` literal 19516 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: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 A@Bjb+ literal 35151 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

p>`aC2A#uO_g)C8zH7d%WApYfQ}a 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 batY$)XFUlxN+3eX0YFhs^=Z))WZ?e-PuaN< literal 26525 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 Al>h($ diff --git a/en/chapter_tree/binary_search_tree.assets/bst_remove_case1.png b/en/chapter_tree/binary_search_tree.assets/bst_remove_case1.png index dd8b68a1cbc679aa74a68e7277a92323ef90e093..4942367251ce4a397176d1841947d1a91c258564 100644 GIT binary patch literal 28023 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 b?YJi}2@fUD3JVcKN`51y__{>WIN-kkl0ka> literal 27783 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

Je;J66hzHw#_t>O{Vp{Mu*Rw9B=5f= z_w#6G@J|4n00#q57O+3MA8Q~wTO0MjBqHFhTIa$wE0_w1l<_B4%Cz;c@RQ;ues57e zSMuG&g%X|6N-g_Y?qrHur;x+XHXHDN{@7b5;G_2i0}7Kw&X~WkxZE7#MI&(?%R#l6 z(F6CB9tP8%mF{8H4p6`cEJws>f#sM_7W72qP87QTqMNZbVtaer5LlE2 zSvgxKecDpjU%z0}Wp7fb6(J z2GiRY5+{MX915#baReN^`!}C%GeuWZS+-k^olcgHenjjpS=cK4N-gQrO?_eOp=>gk z9hH`*eqz^SJ&3aCr`fv7{vOK8=Zk5EEh74&Xi3vk|g|U{$N((Z~N)_yZ2-G7J}?m>f@+^QusBA-&U*AjUi!$c(l058{&$MmV+DfjJRcE{$X-0(x)}NG}y4bYyy>!nPuNIBJ zscUvveXAluVYBL^7PDV3FdWV$C+jP6xx{WTHQ?(fJQz^dcJllKxC?~oL8W>6JM_` z)JbJuX$+oq6cS35=+oKP)%?-y!v7g1l>GPejmu^qizDC83nWQcXy`V9K3eYSo)|l| zr!!Tks7J$gQnbh1ETKKA_3rfp{5#WgR)+d`ar&A+9oLL80UvFyVyvv}h)hfKXLFK+ z$SXG+gQ*h7bB-1IRui?7G&M8Drq=xu^d(>c{_d6`o`YZP6i#V0H8a+X*mLT=U9W7) zB<6bF;bhXP@X?CG@~zeFF)v310RO)Dq#=*3*jicHGeIQkEQ4QEuom<&7*s{IWBjzm z3c>NAPJLYHq{`jty1y`0>V*MpqipTO&Wa$znmh773p%s_w2A)r*c z>#cJhR9<(n0n6G{ukJEOH^cxwEtsN82YR=}G~6)$L?^E^qhW$NzGPN)GNv6zeWGul z6-rWHEH|?=Zi__+e|y54uL>!1kqoK(NEUfGq9lL$`u}+D{$X*6L`ylnUXj*htV7{` NEw3V1CS&^fe*oJJJPiN< diff --git a/en/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png b/en/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png index 8fce7e6139325baf2a47d9bd36f4668397c64d81..7f7bd2416f82822d977edaed9054ab692ee68a5e 100644 GIT binary patch literal 29060 zcmd41WmsEH)Hb>k2wJ3gi$jZ)V#OVb7c1^kDDLi%8cvbo-r!Q)rBK}6-QC@D!t;LL zvA^ffnQLD=JCm7NI+Jy;wSzw@N@HQX!~g&QOIAig1ppw3NANHj65``Jlle0MAORoc z)g<9?_~YZ_1LAr>To3n%>;C@s{{HUn?)LWK_V)JX?&hgoKedaS>#M7)%gf7)tNZhd z`-_W<^Yinwv$NBSo72TS?d`3ttkYrrGur#{e`vd>vcq1L$s&cDx$4CwW00X>D|S# z&Bgw;rRA0NrRDYI<>jTNrQzj?#l^*ig@yU~`N{c}nl@@%YSTwAQhSOb+nd9hLrdyb8yg!N8XD^B>+9<3YHDh# ztE;Q3swyig%FD~k%F0ShOG`>hii?Yjii!#g3kzy?^Q!kVt9G&qTJ!Vs18M?t@^a#H zCUbLhb8>RBv$M0ZvNAI>f5Y;A|Nfnkk&&97`nCSc*P1U5jmNH4%Q^+CqS{fdr`j*5zkjEszki1_*Q zXLxvcSXfwSXlO`CNN{kl{jW}rsF5FmQ2_w~-@kwV`t>Um3ib2z^Y!)h@%Hxe^78cb z^ziU-b8~Zbb#-=jc0x2qM+XN7dwY9ZTiZ{blh!tlAFW5Mt*t*>`CD3Ael~Y8GczOq z(NFlL&(ze^#Kgqd*x1O($k5PGUteEOPftK+NLN=^M@L6nTU$#@OI=-EO-+sU;{dbb zfQpKWva+(0l9HmLqJn~gyu7@eoZN>GA7o`^Wn^TerKP2$q$DLJB_t%o#l_#he=jB` zCMqf_A|fIzEG#4>Bq%5-ARu53^RWg1I}uq4F*T3bgCR?{HDArG@DPc|* zB#5%E5Kb)7fl5>Vxy%6yQlkigHj0B~{oqaR>aLoun$6LNS(HmdNo5UtW&Ym84f-Gz zIdOqVs$1vT#4^mcOw?y+K#(<@Z`XINv<=aHeE`2bOScm3M?=h|20i4`1+h^9RM_~UsD(J+ z7qpMse}jQ`LvS}42(m3fPXgfnT36H1*u0hnknWV+zBZ}0pfgR1EEO(HczxGonp;94 zjEyDK_uU6;-~r1p-9H~B6$3-d51MW~KWV*Dmy@Uxo;>OQ30V=b6Dc7mg)1Adgj>5; z`L$i8E!%&y4<3|ScKBWs4FEL+GFy6o{+LLHZ~fR0uLb_#w?M{nCXnkfEbjEGInK!j zCJQx7?5Hu>d;&Auz~iIn#!SvsP`f6HOf8xl3s~24RJYu{$rvm2V-9rRtSbD3 z_5T=8w0wY1&mxPYc&Me#>htKPsP$$;2^uG~{Hb3TdXeV4Z0?z_J7;}43?cd31_FU` z#XuD6>84%R@wU6={VO^6HB&}2Jc^WQ#jLUvA7gf#r( zEm@D^s^BXqF&h);RJc?Y%H)wBdmAynl6cC|P+Q}eyx#iuhOe|)36x{$twYAhC^`c8 z2hwIv*9uR3ObTBAB0g5MrbQgd-Iyx|wahVA0FS$~#qNyY0(kOJ8*cb%-SxXQWVoAc zeCa}dPR_%S{;T@3*l>Y~)+wBr-Px)3yJ+*x(~_;^q+$#)-?4EQAyWrc)v-bwM)*;; z_<#g)XP>J79hbo@rg?JG%zA|JS6w)zUzL#xPqicIh z_-Am)>T#Ic%dlQ@LqjQob^|Y?p;IG}79Ljph<`QdEwTz<`AL}#$82Y`9j%_*c-~bG zbYfe`MZEUb7##<$uyg9Yd61zJ_{(M&mCV-TL+MSkFWfXAX6UlH0<%NP#^aI;sOe7N z#hL=~m{{h5N<1=;Myx?YokU6?t88xbq)-#A)w60k(PTdz)ib~!>@qveX)X%-Dd74e z-eqOnPamma`k8V`@~Vh=gDeQoay6=#|IdY_QY!JyNPc*M?s!hqu4C3Sunit+L0Rs` z%5;|q3%RZ8L-CZjgrBbM-I)>hcj6pc$((KQTjf2Ff)1+rPhrt*7C{! zWT5`K( z+GK0uz!%*i$-yuP+{n1un&t4xr(HzyrMDS^}Te$C>%UyszN&d)9J;tHB^PO-D~J#pI`nwy4NoD<1ed zyr0ucZB!0wC83%~gax8nL7wK;6^Kt7N)z%HGm}gLG|wna!%X`yUDI(Fa0QCvQ#IJ< zYTO!UX`RzgeyQ1}nwglgtTVS{CT(mch2rllW8^4(d%nsEoasrN(~H!_J322#`4E$CP0`e9%KA^4DIuP2XqiPa>v zYa!(up;av+s+aGSmbgejNxhX%rwtbx&ANkLU&zad{I}Hv%Ucqf9X~^}o2T9U;?nSF z!{We2!zk~3F^APsw!>JQ(Lc&8XX(TaAv%WRa>enNk%czus0v;d00Yv!Z(A@|jdaL< zj+3r>ZC0%54uC&TIU+VK~CC5X*<=vdPT(we8R$C`){2&%@Sd@~nDn4R3{F;?9Vm_Z-P>;pR&=-QKiKDRoM3WERlo+rF-=_gR4$;MKReGKBdh;-grDwpz!@sO>v9R8JUL!+2V%tZSF-=OMeMq-j@@i?Xac#fX=4ByJLb=lkjxr zxG2aw+8o-t@}dM?m~VVOGRYALtl8!Gr#|YDnj}2yDW=gw(j^U&YuEcQW9rwT0`)@D z6G-@k!juvegiEkO;>gz)Mm9~1 zQ7DwS29G1uclDa&ndNp|Mdu40SNQ%QFZMOjvQiWF&b^lyp5BteWfs~h66Zp^ zXutOoUc{B?92CUo*Y4vSJx@)}>dBk)ikj4$xAzIE7^}yzxp6Z(D`a;iw)_(fd(Jb- zO+gT>6w4hmo2Q6P5PU#;n}!t8!ww@n9ek!a7AF1SM?B&fH*~YDi)f3g{!-EezeGK4 z&HYUQY*9XenO&hDi z-=ZYOC@!r-Hdjfy8$Kd++UHb+*sLu$F4`r-FO3SkmqnZa(QTjM%0~CY(3&8fcWr7g z)xQ@!=g4d!Ju^e_FD-~@`=ryk*jnT0N1=>&(}udJ65JE}iv+uIeQ2#RHh^n*ey4Yq z9!*yL?pr-Zw=n~V;7V-iZHplhu=+F06qSXOd`X?Olcw$g?Dn-oRn=sZgghrl+#`w< zpxRa}rOkkom5pVPHI`!mxNm;~Cn^ApU)7FLC#1R5PrdP`uI6V4*)>V5M2??O&~sSak}eyF{*ft14NQwtYcSVuFV|m zK2Q%+0#xj!0{uK4e7{8i(f8S34q4dtQU8AnwEjOcCc)v>Ft$@vQsT}}j!lMz5P7C# zF$fZW)xpUOZVRW1L9GZ(=5duC`)Gt%;Qe*UA~ALusQ3xVJ#X0LB|(5c z2VSIWC9Vv7R15$&kle@|fCrxs1@}E+Iq_E>7hg)x{N7;`0#t{1qS7tMrD^oRG9VD( zm;lTo0Gk4c9UBY;H6Raj%q3r5uZ^V;F;XETAR!OP>lO6O)~SQ@hyWMq9{}au19|I# zT!dRF$hhDBD1)RiQU!iZRsNXz^7t}N&K|swduupUu{Cp`T!dnUXJAja43UWC--&T~{{eV(NP|~n6 z3_$_f69J)OkZ_*C11TNqH%Balj%2|5Jt)BuhGnQisA6n5xB#xELq1pP10<|GtS`<010HU;no(SM4eri-$mjsk`w`nomW`oD zC((w?$D!WCI!j(PgmGKB-6~)V-iC$lY}OF|I=I1HTg?nVHF_W>fGbVF?NG&t^+V4O zyP@razwys7TL18A8~x|lBmkAccGG(g+cVx|GW6%N8Ex@;3Pi_)yX&hfW8CGoYyj-F!Y*!?eUONT> z#_^A=n7?dEOv`$QA=L?Yf=*4-Wp-59)BqLtPML(3&0Wm8+kP_Vj_r)|VQ?Ell|m}! zhwCVF6%3iFce(1pW%%-82!oSVW3ZoS-zXem$3#`=5tO+$Vg=#@xZ(tV-_Q%=92l`f z5=gLsAa26m}lBb`-}lyyzC6AQ?p;?CCS?JLWC~6P)=R^_T3-Pa4>!;Wt@zrh1ZP zn2T#q>^(NZV5R zWXuU0Tb!oAxbH3;fJ3%|kR#va1oJ*k7gmv)5zgbz1!y?s0WY5ifva-yT~+2ElsGHH$EPg4$Fo8JD+OS>iu zdiEr5C64c^v)!|r-!&;DP5-S)9c4(5@T7G_gN{yENh!E(^0m@TF}J-^KV6Niv6Pt+XwbsyWs8>n*v>y`M7XGa zmnO%8$8|VogKK1>dXPjJbZ8qDzZJdMDCGiQmr#hK$$UwY|fA35)5;~f8I(ts1tkuko=ezvNWw<;5_%2np8PJrh z!J0}Mp}#Eb99O(pscF5jU5lTg$WsHTPmyO2y%2c)*w&xfB2n1h^$Lbw6l2k-SNkK$ z)+Xms4kOY$Ue-#CzEX%1@9SE+_;{a>2DpfON(n!MFN~!{N+{ShP+O^Hy;apk%I6i& zC{d^I=*y8kiV1eN@4}`wz=+_Jncj*A6zMly;`rY;!>@+mOK=v}?L>m9@T!aM^b3*4 z`z`XP|8#!xpS*a>2b!-6e+fda*~v}!QEbm%wJR)Q?G zbkc8-XL75xQI7`>KA3_R)NT( z{F{krP&$>qFtNRethFmy*eT*!b(vn1fD%ms3t)L_t7E1X+wm-x6b7eCtnpqwu)O=y zXBcyAJdp0xh48ISM7klVO$(hZS%#GVCgmqv+>E@O$6zkolaw)!S?2-IUeIv-+qF8W z;7_}t&o-~Y+?zQ-)GS_DTN-&IcXPBT_(87URb_AIYZrF|V+aCPIp1R6sGc|TYzo^Q zgE<4)(TB-8-yzv#UF@=KeZQOr@sBrzyD$B*LKAhk)fM>O!@>ryuC7m#MeWQ7XFsO6 zML~M)VTeKqi7tjsJfJj6?+4-4B{eik-a+j&+iw0$d|gRm&h{IT3F;uVZ)9&z#YG`P z7_Sb~2E&B0MOBB^Yw_0_CCBz7lS@x$5rT{;Ty_F$q`u{4>leoY(FV2Dg?R`Ob{IRP zS`ONf_Xp}34sL)X%oY8-Gh4u8>9JJ~RPB-j9cE6doG^LU?cJ7gW8Bv#-3EU@4o@$o zHoPIEQkoEKO@JVF3}ef|?#JqcF$Q7P;uGN`x)Oa5T7cF6uGSFxqqubcEz$NbKl`~$tEzsZCRN=E60wZ{Xi)T4=-F;Ys zQYOt7$nPSS8|QdywNG<*UxX6eZ}r=jk$dRLaIIPxY+FPR9|u)5Du=tA&=N6~xnPo5 zAhh*nE2f8zLeP)(qH|(z6c_Yk8m`%|gc*(a>wmXWsZc;>Wb{@KQF#iAQTzVE_A@lx z#O_}Ohng4cUe)WZ&tAFO=A3Cd_3yjS;w*tbr{i-q@4e`JC8|my2P*$DAi;A3SIX-9 zVJeZ^=g=iIADymL8vyON&=kGtf(Cp2gAs$zdqTFgO_WkVBwx~+8aw)pAsl@=C;+4D&)g-AB_tw2LLp!5ehzZ3GJ~0?Hbw%lyDeHJ}zu2Nq zaTY4-garWC7ls#+e{MRT)GP~*d8kFW3rJJ_rXDX_bSav;5 zQ$jCu@6#QbUh5}#JspYqK%AzbGd@5Q_9B!mO*e)px5il$c=llE|EP*ZBEkVCw~8ii zfx6vy094P>wneza!bp)&&eM~q5P0vE1Xyd}5jTk18eYn6hxdOL-VCt-JZjMA2@s@~ z+mHX>#YO+~k5ELi9V8Qp%vK8jOwTKpFdPs)r zYXsnxqc+BAqeotSF)@U8QXH4m9&v&u*)DnE9?@ktox*I$Xrim=$JBD5PD#pXh8D|j zo6Vdugv(8OjA$55d z`dIig`Eqtc*B|Ky2OXhBu?xxv(n$Is|DvCnm;452_M&N2e^KC|NUCS^5Ah-zcihX7 z)c*H|sjE-b)lg%o^&e4s zC2TmE;Q<7=&QVjo><;yr(745S{#m+-6J&p9Yd*U zR2BHReoAfg8`hXepn2fh-Q!0={wY_VrRIMKCS))OynCTa$Us)B(I0Bi5I3hZ7`d7L z);SOs7Ey8e0fK?b-_dB1`|E%D9VZL`sJ%)JL$Aw)brt`HX;AH!dpGXIV`SAXR?8Tn zshm|~)zoiA&$3W&zXP|6N8DVY!C6e;xJ_PirYL<^ykLN*Q*jik0Yrm?^rzoho} zOGJJmXwjQ6n>UYHj=1oHhFvFxSdvquy=D!(?(x4cEx0a--`48WldQ^8K1<>p(Iug0$5V5 z=9JFjR+p&9T*zA3bDjy0d^p%c=f^VzlX=A;Yi>elTPU}AkYCSFl z{5S5E7a`gM&B3fCXG))1a<8{cn(;{+O=MnA9j6@#F)RBWj{Cy)3OAZ2wUb|Z?&Rjw ztJDh&?5dg()|=J#mp*!6R*^AkK(sv0DMn`4jXTQdI+$Bt69>P%vW)}V*yywax(_Py3)*oZc*NU6|2Jc?d9f+_7x-8b0 z_ENRTsY_74K;}h+($1tKJjQ=NG>1Boz!V6L9=VF2Jvs+AG}+&)n*;>{l%vQD57$#X z^Wa8$xvcPl*`Qh@%lK~2h!a-kd$>WHqWO;V)YW=~r|q={GvRxvi*B5&^sA`c9sPKK zR3=k7fWQG{M{BjwV89fESwgxC5*5AOSC3hlEG)pLEIuupa*&*vqhFle3$(C1l8E;0 zk*-}H#R7k(%o|mPOmE@oCr77DWEgm?1$}Qflx}(Q8+JOsw_+M`Cl0yW6L{C< zJ*)$LQ_}E%VIUs2XCwc9S3A-NVUT#od6ybW9gx@WoRla+M)0O0QYEkwg*5bX<$B&j z2m0<}_GxuYh?ZN3>IE6A)}eCHuDI~NPfWqwS+56dW3V_Tkf1Hse;MCe!dKevd==nY z*$hmpMNNLetCyR<p64uO=4}*Rh%Wsx3M+B zR9D$Ie|}uDRmElg0Dja~=zhNq1J5hGs_*UzhCcgK=|`Hlh6fjNoHg#JOb_i{+gy^JENn;n_~gTo>!``4ebmcRpV1bM35PJ;E_rQirZOZ|Gkyedk9Q-V%! z_{{RhlSJR+wv%Gz<;?P46j0je>~IG9#{jZ|*U^IKE_+^xV-Rt`?V3z@QMX+Db<-t*P^E4Zy0h=J=26R(Z}FnJ2{ubdH20*ir=9 zKJl|q5X=l(*SAt?^uP6Tt{^ZPguqCTSo_cOmi=hjGWtGPx#G<4g6|W4CP6&DReNF{ z^QEDO%%(?9Aqnk*p#D-!y@v+EEOF#`V8QjhUd@t)kazrPv!u{ztCBY@e(u{&)dWV| zQI}tbhHi%b2NKZ}&#G9~=Fb1nMn7g00arG4_0_wsG!jtl)ft9?d5*Z7w2f#-=-P&C zS*~uM8(}Das{wc#3YP%T*I^kiIc1-4=eI(QW_y!dfxeq^>LI5ZDr8kWxXKHQ{eJ9=|aniJO~5M5YS>PeYH%MW)Xr zr?I;G9EX3CbfUlZ06db_STp?8uT@~(^-7?zS4XF0ay-&RiY!#XCmZ#?P5tvUWm zxJ=DY2d|0(zolTLtH|<`U-!$=vLz+w98gay#L}70kv}-lh0<4XCm?sbGoQ>5qP9?4 z>Jpk3M7Y9_KJhWzbbU&H_?sV6&c$puOPYY#)M7$&?=T}bcr3y5#XmDb@?AQN3AC`U zf5wC7rT?7f%?%}>uoPi&xJTN^}gRqP*dIP&~V zV&lu7O7*#d)*8TFIhiETDIDAviKN5jKg99{5VPn%aaNu7*E>z`=<+u>rSv^uw!=-v z=Q+TVN9=Jq zl<7&@9Uq5y)W;2-Zm%>RTXA;9NrD$0|bmUWMA*H2>+jMX^ zx+8i9{Pn@*Gf(>Nv-`ONDOlg3C1;5>M{0BQRqKP|-SaF!dSUE{<0hu8(fOWW7DU=kl-V@W z4XV%cCH0FC{$(gdv6a>UFTM@?x|n`K8EBQ^Mn!=BW653P!t8n1QHjyW_zFTCv?OUPBY+;v%0 za#_;wnl5IX;y6tDit!e_?I8<}fuG;HwsF~=HUBv;Mg{zEd43SO=6#1H)KjyJ%&c;1#%gDz%l&p9+iJw{etm1_jox$7<=f zZL22zJbUrI+n!*f1Dogs2D?W=M3?Pk-v}jlrvAOVJ$Z-n6hmp5D0tgraNvpa1ijWl zgs6WRRbv)}1oS=(Erh59Ac896kaetsX2yP*SeT8B6kX}@UDPH+A~2+(BHG$J^Qdy2HQN?{y_M@%j)=Tdqhx;!$fGBeKq=A&#mBW zu@rB4uX;En^!8Fp&JlnPW<}CVM6eZ791E03m{(|{9T%owE0kiGlr)ilV8A??LW3r> zS4%0!X}yJ~-jcZx+JkNx9fM&-WgU9nb4o5X2v!2$QMM&0<-b@SqVz6eHECW3?~@h* z9aPrZ{Z%y&67EmhmtD+bI4jb4ro03wGvoh5)jw*-eh;-Vn9iATHTD(|<@|4<9$|Y^ z4{^cEtBaDy+o>h?8-o=0^#~*6glYw4x~?aJ|BZvsUpR6U`W(b39GyCErV)_D06$Et zvpaOW13-}i{Q7UI#AE8>iq{=4 z0*j!r3b`}&ZliUP{9$PDej;RHk`Eh~6qHGYy_G~LSy{?oQW-^Bu-AwpTLdv7h(&|3 zH$)Mw;=Qtg#MAHMpVaNS^^`9!cfM=+u45TD6=EQKQg&5<~Bz>$}A#XCA(I ztHD|A@?NS^5~rF3v723ln5tAOi#ZmJCo>g8tMUHp!qN$eo@X41u0k#X{nue1dgeUT zt{BSW7=d=p{lu`7%KAp>SH&=`QuXihPkUNlfz{8ccxNP^+Pi3l-TQY_OX!!_U;Ib* z?@di>+zxoN@o;K`C@}~&>IVIsC42EC8AZJX!cUm0i}QPrb@Y^(5>%6BR)96`085xV z5|^6=ynlk}t76p_?nVt0+Q=IZT04e0j(kj*;;d@Gr5m1jMD%j6;1D5YWT!W|FWWSZ ziy%L8ZH$H0I`Z@%-2}vq6iNT*!io$3o}n}1RRihV&Z@K8k|qsSu)Ej%?Ucb@bglld zK@*Z+;&z2C>fE+pemtTWl)~%y_s6!PL6 zLAtP>Z;)om`>VFbcOg#qfql#l`rqXk%WLZs_!|QwTAfa9?LbM^uy@m%+hNh1&4ld6 z-dPMC5rBf@Sm4&I5BjiHBZWu>?_52VkW*4TFpz9Yl&yuV)bZ@=@!pVS{7f*fnCX;! zTJlfDVGvGOZR&Mks!OhC)je#O%Mh$5^{T#07KwZX1k_ycz#I724vMqd} zpn%j*$UgDwb(3fK_G3>l3&^X8yEE10>r{zj;iE<&PqI#sPSPR~*vE6gv?=xQIvXZL zoNhje)jd1jt(l%=^|rfKTYs!9f2n$;Y3SAyCEexj11O7daZDvGmO|gCL43k^9o(n7 z#KaO>iHFBrj5FwU;j9nVljV%|w^_?s+uE#p-#K|!;^ed5>b=X`gZ?}CH&1ZVT+rX0 zA+6ZB4zdhNn|;nECXUR#-A>Y*2vGdGra|vZp+$bHrq{%aJtqwE=e}H7PjZqBb@afc zDbIXDw;^Q~MUBxphgI|Af4DT-)s!5Cph-cq8hdj|nxtzQC-qfm=9U4Ac|>)p1pY${ zikkQL*1Mn?>cu#h3_DScE8parQQ718#^U9p7 zyD)gcE~@*J%F(ddCLWb9KehLWsnx3ItT1fhsoEtE&f47Y{czbMnbSJ`zhT`QQ4@vA z#Uq8=oN*1u$Zb!15QQ!`OP4tGFeG7D`~NJNjZ|~};qI)`&)WN?5>f{@JU;}J&gOR= zd8Q4gYIO*=o7zg`Ik1MHWGG@jeg2+ zmPt>9S+pO#L%QTuGFNRx_F#Pd`nCD4Bh25KmY4hb=sC{0OrK**#*03wrdTk zz)qYhn8$6#s=11|yPD+VCCoXQE0Q;;f(#ld;J)<w7IM8}nFIL0+(++^u2*_Ejyx}9p>&6}^vP^%NK`_OTQOCi5-ze+37{{>Mwi9XNDi}3QD zD)kERq77Y$z!8-Ki-;f(r1mOWyY*?A%3wr@bpCY@_VFb&~&&c9ks@Af}J z^nX(+iDQ7Vg}Z7UPN=*2RjBgv=0g4N4T~g-->JGRlV8k0@dNj{@6KWA=MPmxS zWM=~PibW#rzDnSSCC0u%`oqy8rBia~@w2@s{ynT*f7i<%#6sJ9nhZ+9Z1|0?gE6dz zAKPH}>-$?#cOk=^Y62mo{t3vo!2zNB`7W)ki~k3<|Ehkoe^rZKQgtSo9W=od`KB=5 z*_w3&hNT$Ttx@s3?R77<`&|N>oaw-*_*22PQ5n_Y*mQS9Mt-64+nc>B&#(}0fWwr= zKX0bZS_;eR7UwNBLU`5F_x9wVo2`mg%~^l~mond%}D}9?`L}f#*w8}l+$D>4mSnP?AV9O32W7&b3 zN$|dJI(87{T6Z8Y@Z$i+%|4?^4&k1VFs07#S!wstw+t)GgB2H<|ntcsq|Zy$*I@-uUct^aQ@ zS8GuyY7DkyxX&zF9dBXccH5u)7ukZv=6_WkO9qiRCnZdmh4>S@PThO?{z>mVp1pW5 z%rb&(7jL1!YBv4d$kX|J%4T)7c`p0^<%xrr*8(|vWx137B;*G1VUOl$lOaWn`J;#%o|5XV#7 zA@i>P9ru&K)|eH9bT7Wr=~U_)ld#piHq-U_47K^hF{1DY$KNT2ZC&FT!6_?sDSgm} zGua&JyL}%NaZMCBHL9Km&&ez*m=;B!->H4Y&uB<{(RGt1a@ty$uwq~|Wu-dL1$);B z68T*B0iKc@a&(JJ<(+2l-4M0y6s3-I+Mdy=aDal_M73tNC*f^(Dt>J8Mfw=U_4XB- zKUnK*y@Vq5vQiyUSg|)c`rdtW{tM3BnxAVvpL-EE*-vR^eS~8)2+lb zYE0zRXQ&-4U+}foH0e!j5*Z;a#HG&?Aol$KM$ex%lePsNd~UM;XJ=a)@5IzqhT$A=%DU$1lU9Q zd_bJjQ2u7-W27U;V@Vs$U&*~PP})E9g$6Ey+g)BoR?whkU^|L-7Ig3!<&q%dEZ*m) zaxiQ!WinN$z*ikE>))93YwZL41&({d8cHBMu?#e zp|Fg?FIaxwko}TFU*hZq{w{gDiWNVXUDGowJfnmXE(yZ)k?gHdxti(_KOQKM`4QSi zvCSwl{q6Zds28R~LIG9ZN_=;FD!0X>+&9kWSSAamPIR{gsV_8LOJt$?qo{|kFoyD{ z$XTDY)S-f;Kr}O@KD<3t>S)jLqbe59elsl0WF+OL7YCODLTkG;UTSah0^A?c565fY zo%!C6NIa+N^ST(mNbZ`i6tIdrgHfLSbOku7db<;GXIdMjlBlnzxGbq@?S`# z#yWTf67KcW_{EE;UnZ5NK(4oud}P3+d7H7CYl2-&V!t}Ic8~2g99a^q&tpQnqvk!0>jIl zA=i}!X)lvE?voX9sqmW~lLm>F*Y@eT5QSI$Z$o0Zb}dPYO(@ru+>c2It|w)x#T_T- ztQ$LCzW@Q+L-6l~Pi^%TF`txHUn0h{wB+UvOtC2N38+K8wm2%Rk@L`(EVsY7OU+vz zGE)Qqplv6FR9+V5X5m*RzsaBDzkiU!>9wO0xk%sdudN5FE?*`uyl_k%d$pi_WqC%6 zhsZvVM%hdY9U53&K*y6WSv^796Ugx-n zRe_7BI`iv7(=w@ySxQ@oM*eAq=88{zF0>ACwbF|ZsvO+@HmLY>k6ASA3oz{JyPWh1 z=X9g_-ku2E$Rqvdswb1oz#3zitADxkn(!Ms(L(&wdgncn{r&UWU9IEHs1O8H&&GMH zwq8``!;wN;^xna%nYyNMb$7roUv5>ZvIzj1^*Jc%I+3 z)!5-uojF&k)Mq0<6%IWTAbF4gfLW;@C_y3G$`-==a`0u1AD4$_eDp%zPiLG0?-?XNOx3V0kW4%J9q22jGr zJ$KNIkORpbX{SA(hrH}RaIexPrVkk~qaG(@3(KPSyycu7EX8-XNj z89-GFuF*D1rSw}?$8p^z@@c}UpS90T=oScvvMJ~97sJ-qSU|(3BOYjKk!-`ZsYTb`n2hz4{G_qZEu&0UrqNARi7~~^$fvT!!~yNf zsRruecqQtVkc*B{YTA9W5=8&Vm4O4{KX|?$f1_LybTvJ$ei$^1LBqHibdCo0@ zHC_D?S!zSU%Z{rhfB1&~#Qs&s6yoWExb+L|-@C(xW;8zE6T}F3MRR6{R!t`zMdgki zD|O5JHiVvDbtMrzE_LS2a*5PNtR_zd9j2!+@L2q>lBh^|glFOwoi&(~V12fgV7lp? z?OM_26)vm&G~q`?GRS!1XDF0&o;Sl*u}_BamH z|BvdvG9b$D`FD2(DUt4!?nb0h38ia6Vx^?Ja|r{H7HJR=q`PYgB_*X{>F(~n&wjtZ z|Nnnq-8c8XxxC}qedf%}IcMg~oSDy(FcW^b_6|K-&kNsvLzmP_dfz?Ic)qztN`I|= znpq11Qa)kr*{AW;B=z4IeZwgmKq3Xwp4i|yt(IP%)2IHworK@I8j%&+Eawm-70oDQ zc|+vP#(F<5@8@6p_qDJFD37wFa#ZvH5pyWb+N@p=zh=N_sMtJE0?OI4$veVj!wh6X z+(qm+h6qcy?(VMlTb4VQ{a8uPTbjQ~H{a`D9H`y&wz$4Nijuw**Z=*}-X@k>qk4J| z+L=Qk$jQUjrZK}!-HF$2BiupCWqHff!)spvia_5qNPN&3&tYR-6-KARZ7(e&J*iym zNh7m-$g_OaI7l}CCyEg);C(ffq=2C!$^HGTyFi!imtcvZgV7JRRe}&v9gVjkJ#}0! zf|@8~v`v{?zq@s|fbzY)(_`SWw&YZkFA`X@B!*mSD5d~8v_v{`RQo#xQLhLrJGZp zJ+;~n_M2J*mlNsJ$M#Qa-%1DOEZ?%v7Ag+v$yEe9Gs^VKW-{(LgXf+kxAQMDh!Gvs4GDt>Ppf>=S{z~TB}HrjN+xTSrpRC z76dztPskJUG7(x|Q^to4Co{ zcqH968L&>*vMPOFc)(zEI*YjO5%^8v|=%IM?`H}`bO;+f6Y^CfqKWu(a07fX8SJmf03%LoOOQ7PqcFJY5%ezQJ zT|V!i@&Un8CdluSYE_Y}ul^(@Jw5xXll}HQZ@@Kg?0-|me%0LGe0jQmuDeIeU#a__ z9wGPb2sEn@D}Kz(QUT$9E}3%;E@nzzUHcyvDYj$E@O)yx`bGtLC4f|v8vp!sKuDZi z%bq#fG;ITx129MpB#w}GX_A6N=zFP;>)MttFZ4^r)ifv>@CV$pxsglq9AzR@t1Xvv z5b9DaWuk>&x=hQGYMW7;Y-S=>2K3-ahUE6NWxX!v0j%3l;&pT9=hokD)?2w+Q>q4_ zlfa$!yqfb@O1URprC)3{gJ<>r%_tCOiS86^v|}|Bh(=d~%u(xK-&6wz3tSSL=be-e zyE{loEghrfzpmfF?cFN_z9MT2?t$jy=wYhUb^zIn7rIJ9t<|BPZz_SVQWD}-5H^7tOR~rOKhB^7dUt+nynQ=`JQmW;+%%rp>ZOOsAVwf7~eSlc?`n!I_tW- z4#!$}cR;QC)|9x;+moZ01&)91Dz>B+xQ5%$U7lA0(D2(|Q>uT< zEyV)t1Cy>+n5~q)rXbBIc9JO)=CJ}KFkWN|PQBV5>mU5OB=SJW(aPqFoO?fn`bqow zr_i0VvpB|fqkFhG`o@@$61Z8}p55nRqHQ0l{8@->#VF9PYZoCN^Ao!)I?pa)Coe_c zQ6li_P*qGd!Qvpf=rc$>C;=z|+xZl!8B3NWwpPP7zm(DuMjU*9Y>$NlQ8J+X%c-}j!clhd1O@6CO)_W&bCp+!j zD&Gj4EFx6hp4nglzWcuIlm2w;`cpFQU3L@9*lffP+o|TMU7Kqa-AtjyhLSniq;_-w zn3my^jb0`22Gg#dA@XDWsSkHVmoLZAJ8wx0$PQW>G?v|j*R3IwD}1=_E0*0aP^Jqf zxLMIsuM9FHXOG_JOYHSN7X)NX)>rK&@~f4_!v;pIJ4*`9(A<%6Uf$v^M3*2 zXI{yTc!WW`U{YP419-bjVq=F&vAGm?B^@<`xarJD>Zk-@ZLd6$;Vx@F;rc!@{95wc zPYY+9FZusSlCuBgj?^;k=QO@?dr}cwSlinTO}QlUY-dKI$t|B1xV{B*>);C7$^zQ6 zj88nVQxEq=1|IxdV||>@nRCpp$CVqIe6myHNp)-g!ljc?6z`mEHb5%tK8y+d*#YhM zKC??dGJonb&EB5a(W!(Dh}rG_@amtMl_SBMSi#-ql#Mt;9WUjRN3IS-c&l9IayW3i zW0bIK@m{(UF9R7@BxLxHSFi6oCe2J~7v{qp4kq9aaGV5%AD4L-2|Vr31x@{TTE-GT z>BWf-DyO3vnDbr&Ef0M>p;>J-I;ExI)97J(D(P^JB&9*=#IP6Qaz0e>n_zC})VdzN z@lT2pw!*fzR^KxpMf@|39UAA z&pU+KRtlT)`VZf>s%0w1h*0N2-W4K4+HZ;WbB;!iBzTLHHi8qk4khMqJQ#;o8IJe7 zm#%J9P9GB2L_5O2-QUZK{qK^Nh(B+>Un1L)4w>0+5fBwRk~0QJlGPTk`2H)VVB~Sz z31g{#9RIiNfY*(9@^`-|aE|aZNZ%NVZKe5R{K?f%NLdpN`|c4M zxwQ{_&v+SGgNjDQzq^V5gFcMtF0!77MkO~TsYC_aoHU2uKo!R!`j&P=sNuhB(0jiF zrQ{$p`z>#sg0m1U5yNH6`FS16r9l$U%wdJL)lUjPN=I<2d-c>(S1ngXPt$|Kn`S;m zd_EfMJ?QG7(Wk>bn31$?d1h2v6r*J!9~!aOl9FY!Tk|ASVK#!wr>ecMp=AW^!r+d* zQo@_}z|-hvGuH-VQkd#s{+5RO^${zgR$|4S0zYBlTY2k|)A4J; z=516t{Cx0xWFHXiG{&on^#%lpFMdoNr87`*(wKH{?#62_dXo{oK5 z4x?wXYb0Uj?lZUG?1{9Bp!(W6o|+Rkha)|Kq40sZwEdVr#X4I~XV4X>rPwQHsvbSX zO!#?Iq1={yBGC5gqE++Uuyr(3qHva?mwVsLwUkX2uV4>luMbN~SX(aE(`)uy&pG$) zp%gDi{Jt4D9HM;}T3$TTind&sTa|>{S&#X&9q#EEralsJe~cR%L$}6&Lt?Hn+8H5h zY-_Wr7{6YD1yl~)4S?~5xwK--O?X@~Gr1y=bzd>mu`!r(< zoN}c?1te{jq2c#h=cC`hWE83`uINTidE5F?Gd z8cq;BEAk&Yq%sgJTp_|n zG|zikOf>I8xqrTFc>j`@oc4=e1+lsBv);;G?bvX(NUF2e13DSjXTehh?Sk4b=r_8G z-Jmm081fk88AQ}=Xvf4&_-v2Qf_z~lA~Qk!5J)tnlTYcrSELIj+HLo0NhsA`E6~`C z$rp^Zrb79o?Ac_3!#@Ph7+cH3`df5KeiM^F1P{qsv9YAP&5cJji4lVt+=mG~S-aD$3}HG2W6jbQPzLH_7` zPpg)TBKyf&b2)uDE`B(eqT9`CQ?n=0C=S)_fA(YYlu;Xg9<~|o(CQd zV9T-N8JL)ntbSsPqMB=!Lcb`MsGnmdte-c{d}+EUinJ$O=sgl@l&Q*l$-tHvn-C4O zXr0kt z*NF6Y8;_z=muyG9V)}fKICDrZMVXa26o9@a{TN?^KXusEPqk(?IijHC^x;9+F9kz$ zDP!h-X(>>mSygXK-&{@HFWjA~-Jhx56}cLSI|Rok{$5?hohXp>arwaursUk#V9WxA z<&t^d5>Pz-tY8`+iXW5fWT6YJ9zaW22WT_|xk}4TDo5+SZZG{}tN*e9&7rq>4v2{J z;1ns{T`k12HfJ?0*$1k|WZoV*h2(l=5fLMwLrU1X&x~)v`S(Ey*6~yusc4b>dOaFE zNyewWDc<3wO@_HRPR_2bA7Zz@TQoK9a{MW?|24Y?-9OSdoJ&4$ACk|swL!=6n4xb7 zu=sHhKFG)6nWF2^^jkz{w9vA$T+|IWEX$0PnAuS6=cPhR2Ue@;g{gt@f{K3;mKaa(ForVAx)48={+2YTf zCpf;Imyx40Li%}L+fYw)Nt>#y`cHY;-sx7O!CA$l3x^8tkkr72d{OU5I?MSjO@ivR6G2zpsdFC#UXI4n)?YBKY@m=hz zc>Dj}xSdY10auhtf4W|x(Q7B1^BVb=-V(Ae8eJsJ zudd#v1>7*JN!!HK?*X&FJ38%hNaWr&a+wU89-TM$w!uB=@fo+OZE$F@ip}_SqwsDH zCF3yaaIb96ysHuG0Bo5eU@O!L zlvjuYt_O~K{JWWWoaors=D4+&>&^L}dJR?&jw~|qdX6k%8RMIP?2w;XI10^Pamn7P zN4;)l&cC{A$2c?go%O;g>X#ykGdfBP10@!}A+JSLyp00bW7%9<0~U>%?@miEpBmkL zvm|@t_(hbOY+<#dqx!RV#6T%m!866G$wnNzydt@X6CS?#y_IC7zzE&fuC;?#I~B|u z>~3Hz>qr=2jV+ChAb#;yvDdnra$==#KOkjQ^DW&H2ew}uZq@D#CN=g!Dd-oO9#u1obsz)F5X86XZ9RVO?^aE< zAl$g>ysrj<^C7#+0kX6yFB!{~4n#E2-f6RW>Y?1g!!zbq;fF)3xKfJTu4APL9Q{3E zyyyYlqrH@PCLRWTh5-coQOs=aXIn{hFWtL5M&!Uq{QD(S;O1AHXFTd#+d%qXJoJKA zRa@KR0DSlYvnzNo>1vPO^pc_SUZRqhqz3<%#5r_S`%UmI;FigV*5PyvOh- zg3Y|<2^Rr91SV6WcSrY!+%j6v5hUYOU=Ir*QqK&suoP_r2B|1L0K67)r5+BM_pSZQ+!|w% zmXVrqesmPv*lRO3p}J;ie-{;Opivd0JgtxIBrR+!BGQ}P{M!r1iD}bpjTOWkY{63d=gZ772-8a$2=p$c#RSMK; z^f3>dhyOU-_eSz{19{?G-ey4=tvYpdD<~r#nDRbELgcf&X~F_s4t4bI4+;Bvz^w|F zr9a2tea_fooz>=$R2-i$1ay7xD@}8WL{c5o5v|@VcMQg@?`E&P;05ap;1l`dM1^c0 zHY~*t->SHY8qEc}Om3@2pN^h^VSUHM8P*0$V4jic{J$j9CR}JXU{gBa8@KJMV!xc^&F@-JAe*0+#y(aG~AliR6S(tr7=FiXBKkekE2yUI*$R~3_ zUA7Nmyui+?pT_?#3(3#prN>FE1^fUI>_t&OrPH*S>#NAAk%irZC`@B*9s1u^oGjiVAji~4! zm4NkCS;0i=oTkj3F=iPuvjjiud}ql5%`+o~SR9Yor?ST#J(lIvvk^(fUrKlecoTh9 zi~dgdt0E^W^a4BWxzX9ykULaqB8!h^3r~qUUj&+aZuHC`eh2G_#qh3!_b5gEHo4h> zz10tirI`0L@@Hr1I-ow70HWiT?y120C7>k4=?*RL@9g0vEnw+}x=E2DlTF_@qq@yp z-!KJZoy9ePlgN?co{bz17m#b>3?G`eago7wL8exfi_bwk;K+uT(!^^KH^F(k$%$XM z23B!o&-Vys3427dXHQIs7tor)vjQ{QKXA+avS1(Vo;0{7Y;0+tBgtU4Di9$DTkclV zw?X6E2oKJq8(<2I=M;y~?(RoS$-QUHn`o%GJx}p7fR(lHpPq1z_u}(CtRJTZK(cjx z764h%W2;s^$}94WIEo|^4%i^g0N6%|auK$nf}JvA?LxK@GkO%;qzjrh+zFQHuLG4f zJj$=XjdV9H*}OQ?{B~G4}9hB{}GhHJ=Fi=!!D&INOh?ZX>?Zg$f=b z4bYF4CZ6AJwd_qy1rXKR!JiJ4d3Y5r%D;R0I@lfu`6@WQ5UWh}J6ODq_RX(YKg;-+4uWpN%8C4x zc841cOdr*LaIpTe&%c`)WDtnH6e6{#r&mh3D%o|9FXbZKvmDi3g_1EAs7Wp(KFQ1s z4-KkY#Mvi>hM_~!V$g&hI)Vj~-eEMdN{N~L`RKFX)!9C$Zk}TbM1K%dIcPNxAE!R%(2%$m%H|UuvQ-G%YO;KM;&zKOcVWq zZk#vR$e(O*(|?pou%Otmc3PJEX;i3TJFU$#Ty-r76CBpg2Q;yW)Z_GQ7Sx&G?5G8z zug}!Z+JuX#`8IB$ai?YFowq|U@!j}796i5RCn^L2tdiC{v_z3jQhPye@;ec+A#>hN z;;4^4bZPHFLFk+>5y7M-N~pu5VGz`>iL`R7;SwshYR}qO^5BL5HYZM)7E0{JZJ|uG z#a4i4@mZ`62?SsylP#d*9?6DOP7Kdk3Vrpjcq(#{w9&7)1fR5fyGdbs`=CxKy2f!r zsrUHwOoY83eON!?y=eZG30Ol;pdVX%nEvY<7S1YPYdF0_d4I^4IumSaV`4PpM`-O2 z#b5X&hvFd*qvHVf(^`Q>a-UY`=T?Iw$IqQNqNcV1SBgdLMUK`QK>zR!;V@Ag{BI-% zw>h3#9@ClL#8ZdPolbf}{A-r!X0yTT%TFUHJ!@WT|;8 zzXQtEtoFxFe~te&s+|UeBbt=O%L7f^%Y?@ubTu@^lhN3LfG@lqSIL+c{Y-{3(fAKt zMT?h7Q|8J3hD>0lP`mPs6B+;wg~dsnjrbrJ4vi%GyIOJZ}ELQ(i@Rj%Z60l@mBAOLr)E#5;pM{sB$ z$sI;gyNr7B($^uEkG}wZt^*vBA~ArWaR+ObgY}7a5sfv4OCAycE}DbYAR||u2FLqGV!o~;H&w`n zzKaaVoAK-|QRnRfMEdvB*W1K#vwwDx((X|;0WUTGLy}q}<8oouW6vmeSDH_L$>SNo zbL5-MtBfYRS4p{hcXoa4=7a8BsHfdCEbzZ`x^kqwO|>~)$}^DgoK2G&uY5aIEZN_~-4>C)`~mR{V!@hG;v}6Gps==|>*EK-sN-M6?yaXeOTMV#j(Q z?><(Pv6Szx-x!fT^Urpg|MOwR11^^)0;%IR0{xhcEa{Cwi~@q4NuV()F7G8x(8;??0Iv@-vB z>l4;O2*DOj3)ri(=W80)(0gk!wTB1}i?7PuiDw&Sm%QlCa{aFJx#=DOrQQ`e@N235 ztb5z*v*Mu?7z(nYJ)3RyB}9@`O!6aNU(*)zV4>*%=z6^6gtPu;k#e8Y#{b-1b$ftz ztT$2mRgryHGf=pMjLn@Uny7|F?4xGxGdY-oV1=<1;nR~Q`TH`ez$wD}O<$wh##jn~ zHb~p%|7UXf^v6!)LV{@!OSy@(mhf04ydF-M_H+k4-o$bO-zMW5hehix`=Vy=a=(`G zz4uI5GQ{UG$u%Y6!XMz4%D+gmwRu)gZ7)ipAA(cIOExiR2pK)D`g;!F1V4R6o?4Fn zql=`mi8x~b6v(zS)uR;nOX7NN$sZL`rn(2Pt4ojD&Qp#h`xUajobp6wT=L=$qhA~d z<&JQ*8lM+?9|T?6FsD6| zZ7*ggm>H_cEq%{VyI~*ZJ;{A1>y4k|0@YhZ=7C%n33T2pK~iYX!kNdalmcBqOD5mG zia`T;xi@~%=2>?&M-^^=9+LqyPk2?C{vi-RmhF_OLOWo6E1D|Cu@GQ1cTN2>l2w9o ztJxoo{CD#JM#t6V?v!VA&9CL=b99g_-O|y#;2>Icel06dWzz3U&PWap71}zyRLkLW zgnLAS$huE~4Ghnfyz%N+!fBv-`7#hBD?KPd<80{a)$EweX<3Om zw(N$@}C<)nuzj}4J9Dj8^VlK45AsnvI(m%9V0(T--MgIiNt!d z!@2)%TT1!_HU0)1xaY*EW-Vzx<^yWc@B?Oza#}&nNVgmLS< z*m=B4y2RV^BoG{ed;8}LUr;(`zx10x3-q-mi~qh8Z;kKWJ(bEiPJ$bYGW~18z7h;t?KhoFXq+8xon(}B@^61+ z8$z-1Wa;%e{1%2D%lo*d*(`CI-Z)oXLXH?^Tq@7SUw8z;-(v1?&Z93acRcX`29l9- zLfO*Mv-b)YzM=<$jPe(09J@fJ*H=E#GJpXaSDB#}l9*$i46&QVeZn7Eb6thcM{6Hk zo<7gq1sq4`qq0)BdCWl^ID9qYH~bclu$L#jnlSYYbo=WcvlVx9mejnZB#^FQ&PE%{ z{8<5__U+6ZEf>~D;fxwN_Wb>6*X^cfa9)%m2`x3jK~Vl<(aZiUvyH0WRS%SJ`V?8F zd@7%3q`ixNna2gi`i-T^uQs{4@-$j7`1?QKAOZK#IvG`Ca2b&k?uZN0Y!Tx(@&(S8 z%<&QwJ^sfdxMjAmYTX9RXV4{da4#Hq4LM?py{bYjwB&~cNx&}q$RMq&zp_V&Ea&~d zM!Nm~l|W$FZ)jmGo5?uWjWYmi`4w8Iq&S@U(Yw$D0GwUtw|%QG#P3LQ_X@z#Tx}V% z9_rY7fx^Ee6aXtLaX!b!1Z^^pS;QIj470_-2~00JOqV*Vc<;8%gd zNK27*n;mi=+J4s13hE;2>m8;h-2ig#AN7;trcvfw92}fVIbSl24w^C7l{1A-2cPQdm&hW7TGvctK8oFOBINA zEM(r__Z_3rJr@dQ*aG}`k{LG6R~dDaq#+8wn*I%!piAX>%Vb!VaF48T`?A3?u?aDR z8L&#l8<0);UWSSdMff-3{rhfC#BBDuZ+&o(;RJmMdEeyUurN*XGIf##SHDZbyZYMC z=3g%L6Y4?7D8{*4tHAEb;9A@&{Dr4?X3EJH2&@87N6#FCVBa}wtE3+S4^1 zZopydT9N?r4O?xjaVB=Jk|i@n8c4DBu5kI9jCqt_5}|}cq63=c*YCs7CiTH8n|#KW z$;FT96k*hMYWPRj@jWo623PA1yH*Y{fN?VOkQe+|7|W^rd7x<_wsc#o=`}TKGMgZ& ziw*Z?8GJf5B{f)A#lM#{jjZt^lxsni9yZ6OeX&Jv%1tBt*yWrbp!hq%c6v53>TpS4 zgze25B6ZOCW?sf{tFV`No`tLbZ_Y1m8=~*r0tkU-H{ZxJb59nOp5B5jcJbRTB;EugX@!Q9z zpPz6|Gp*HK92j)A*RBk3;vBs41Ibk3s3SVfoHQIqI3)xyVoCAb@J!x4;-b!zoYRYh z&wMUm=HIb2ZcVkETx&Ma zdeqeRjf5v(1TsUD!f{;KwgnYp`V)&i{TIXYgYD&YPEGBGXPC}Ad3-jdPoV73Pj)@e zbg%(?$AbvL!Z7FE|wS zhMEUQz*eBAx-A=pD0bQ@#JztfmM`bV>-im$8f!qGJF4b<0`(RQ%YH^ik4BVmD4M8| zqjz_@_^S3-A?wtj%~x_p=%|rZ4|k^Im@C&v_5Dn^Y$b;8<=1SL^-sbRrV)(>a z%`oGYaO`Tm6&9IoQt3&pR}1I%{YW7){^Foy zp9sCp^3$4dQj-5WI=%dS2N$ZZyI^u0;G=w(r3zLwuC6~&dOeuA1qEz zFuxeKv=~FMRy<<%q!KT+xjOK^47PXa=~7AM6l>gzsK)2=?n^BwI7}*m{*jpS%X}Y^ zN;3~h6~PHW2Z!ir#z-bGS+Z;}9qpKohzk_Wu(tFIo z>PK7>DF7}3+A3b*clK?j&-!XZ^~iKg#w3`4onDgB^@#tAg`uMExXJido`&)3KU>fX zC9urz=-BTgl?G%JfUjj%d{bS3AHWQ_$^Vyse?@QZbxSgiOf1L8P;_6*smhkTFn<5P E0Dscg!TBxxCaTrHMqOG>jEJ-gy8OO!5uaP3+^Pi+v4t=CGT_I z=llQtIepE=F0(Dw)iphJ*IgZ|ASZ!|{sJ8U08GhGVoCsj1pf*iMMZ#rT;(zv0{{Y` zAfqDw`1ttn@Nf^m?%~({9sIhxyScl&y}iA;xxcx&xxT%ADpybC{QBzh^77*1;{5XN z?ELQh{QT_f?DX{XNzqhvsgTZ$8 zZ?<69ySuQRot^FN?X9h?&CSh?jg8gA?UjS&<%6Zgy~Wk7tM&EuIoQ^potcsCo3V|# z^)+~T`m+izD^F#4Wqo;hd2(%TacO;NX=!nBadu&6VPRo@etvFlZesR)`tRoG%<1gx z?BBnC|NQwgGcz+iJv}q^R3;}UCnhGw$0x?d#zsd+M@B}5hlhuThWb`EyBE8D&O@P3 zSI5B6#K6G7&w-!){r$gx|L*JS>+S9B>FMe2?(XX9`t|EqXJ=>apRM|tx{7gV@kmkL zU~bM}PR?L<`|sn@-_4oh=UK!1NqyUCeYx>nakcF$KY#v&LZKZU9c^uGt*xysEiKK> z%}q^Bjg5`<_4Rdib+xs%H8nNW)zwv1Rh3nZm6eqh6&2;><)x*iB_$xzns3JVL1^YaS|3Uc#v1DgE<8vLExj_g~HTCc*Yox60tEHu-p`r0!X_!%N zNL^iBRaI3*MMX(TNl{TzUS3{KPEJ-36B88` z6%i5n@Zp27u&|Jjkf5NTfPer$KR+KIA2K@Q901rHN{W3@ai869L$iObmU8IT|GIR_ zvf`WP8%)lg*ElwWK?ACg!;rDHI#e`I#8vdF-zg_Y-_&JC8_1ri2C7@LP_ryUNUwO; zk6$$+>J!!^4GA~}MZTNRt$zVyDxKg~z=bOizxw>_p zt%2D5JBRu~<7e^sTccUt z8N``d`|>#|uuXPTqm}&m0%Agx2(!ES*_hra^FcX@aR8i!htjjJn8=8LSly#_d^`&kkTqd&z9uvTNkRhwVwAr3 zH0!;}%b!3%P9=i1QGC2Frnv+SF@O_9RBK2=Zhu z_dz0_d5h)O3DinL5<4Cr<{2xXJ~s5lwZ(#bwcy%Rbo%G zmQ_Go!t^lsERHA8IDX>Ob7s-4Pfda~ps7_ZX{mjFNEm;jj zSf>urm9{bi`AX_7%M(NDF}`8Goh|W=Pb=lp=%ATY_O(wrr60iOY4_6I(Wp3Z)-32Y z0~;BZEk_thn6k8fx=k zAVBK8OEKocVK8{h6+)pBy=50Ysq@`6Ras39N(GuxclU=$3jBqluvoCS)BWd}7?Uz-8*=87 zg9jtcMw734BY9W=Pzi38r4efh#0d3*T%6#CWRC12{?1Mn8@h9;{^TZ{=5psmU_@XE z3nkB`C*(}0RZc75n&O|!)0?~;Iuo9WouC;d==p=(`z7M}vMoi%+|E}g{TQxYemk&o zC&PO%u0H0yxO&-6)HD0a;EQukj%C62(1Tr055%oG(v1t)->C73&veT-UeM^7Hkl^z zA9tMTgdRke5>fbWUnc`Ln z^0moT2ShuDAeh7Vl+!POg_-KCRV(hNmakny7IDg%u#l*;AJ003Wj)FU$Zr&!7Y@d- zHlI`Z2r{{>d@fllPl))~%$Y5{$jXMQkSMH23|so77PcmC`4URdDxHDzzA!=X{H<_H zP<-njFi7dXTGt~ublS_+|2&mH@N~b9Ss_|YtI=H5 zG%s|W%|jaejV46(^uCVSmqKK3UJMI$`5NG4(fe1iEWQ~0tn38RJW$|JCjEF{mqzVG zRZ3~Hpq7fNFdUGCZr{HBol{D>31hVG_Z#jdLD^P{{DO8SP;&{Mo|8fDi>;h_rPuWl zE9JruhoX$+j$&)&Y^;Ng;>N6E8V=bX8y%U(L`e4DR+-RqT;TrlY7oO8wKrZsqWwkU zD-g>I0Q^Wr4uWc&s=hJ5HVb$7UP9wn@1N(OA8U%o^__(F^hfX&FLw6ybG!*I{@R2{ zyY((Sw1@Sg%~Gy@kxEz%{=83}Mcz@-d_cx$oF11wVS?hVv?rh{r0epOi^Er~;rE+H zBd=`d2vJCLv!yrHL%h9p)!i$p)V#TecVpCxkZ@VK`Xq4!opn|>#9O6%q7X)bsuBJa zWymgK)x*qtdU9Y{9J00XW|djxwtN{`#|_;+uAn$yOwu~}N0vT?qL68mOpE%SY>6Y$ zvVBw0=2x;YHi9e}eTF^4eOEMlT)U|d@@w5F8xLH4k7r&5)dXPv;;5lyGzD8Ww1Ynx zGG{5Nz*KYf0jZo`NhwVm;2|A->5m1&kcc%U@?5-B^DzYtRHzu7)43_R?rbjUQohS9vK8da%6R^(yn`b%6 zlUK2TZA=?tr&Pm>ER;#Bld%53)4%dv08=5`&*mE2C8!!B2OC14I zWMv5TPx85@IMpOHmQ4noj6wREzf{6wFnO8BxvyRW-diMvdZ^Yc!0Z%Y?GcWWUIGuB=P`wr@T_UpQoHKJWdCRH~4i%Q#!4*`J9q= zgP4s*!u>uCB3=c}Ub#NKx&EyPF4Y{}jQ?4iyc)H-Ax1Ze?K|Q6cyqT`Fg@9GBQmqb z=Fveh$o-3*#F&J#*X!bN4Y}`1BPD#0m~?^MhQvKjsE^upOb4@fkWPnh&VXy6h)Lt0 zTGkkB;d@)S3*_{BEEgWRnJJh|M&

CY3TLxiP&4udqo!M0PBk&-pcbHI8?}lpFXt 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 AUH||9 literal 31524 zcmd42Wmp_R(>6N0KnM=Ol8^)m?h;%REChF#;DO-o3keq7-QC@7Ay{yC3+}Fqoh8rv zeDC>j{+&NxUvTZtPIqSJec{$%td1zD5NA07K%lhynm0!M}n>o+H3NuCo{n z0RRDzlTs3We0+R(c({MKzyJ4tcYl9(cL#(2-9Fsj-ojw_Fc|FS7It%Ua|ye?xqfOF z*LPP}R~J`zmzS647k3vI7w6~aXXkfkXJ^M37yB2Nr>CbUC#T29$45s;hlhvzN3fj( z*ulZU&i>8*{{G(H-p#_`7A!+rU=_IGV>ZEbDo@9rwR{e5aHD=W*(%ZtnFOG`_Oi;D{j3-c>i^9w6;b8}zmb6XWCKV`F2Zqoe)fdm|$wy~BsY z!^1;E!-Io^0|SHo{r!D?eSiM^>Fw?9>FMe2?(XX9>g?=nUz}`TfI=6bZ3}G;GrcwA zU4C@eWBDCpO(Ux9&vuBDY85fjp>lPqDw*8a;@zRQ-r%Rl^M zeSLj@{P6Yh@$vTd_Vo1h@bGYVcXxGlb#ZZVc6N4jbaZfVu(PwXg*O`;YinyOD=Ran zg74qIo12@PnVFfIni?A$8yXrK7#Qg5>+9+1>FVmf^&P`3Gmy?r|k&%&>mX?x|l9ZH`kdXNN`LnpVxR{uj zsHmujh={PT@TX6oK7RZtBqSs#C@3Hxz|YUm$H&LZ%R59KH3$Gs%Mv0Vm7M1eTF~tA zlv|J5<^vOO4Vn{@7di)ydwWSuvC<7U7zwBhKi6|VPkxTTicVrR^lhrkPY~PC=4+RT z2()KiCl+0Y)C<&Li(MZOj!Ba2uQjs=mzAtdi^f%dO#y%>?52d zU(2$Qh<$<&_1AqwxjA9C&W3-V25KuRS=*jfXW^g&0quw*W@mIlO{UcU4#i+H2`l`d z^CLlaq-x|>ALh+Rpt1gG5{j;CP6&{Z$lA}WrA}H&k{X)th$FSw+lBDOOZpLO4*$H_vyfYP7tY=2gblH~kilQAaFkp=07N-Imyp?9CA# zeFfN=>_3d=rz36GR67!^u)toobpX{85T>AMlcK=6nf{mroJ8$YTA?!nYr#!YC@Z&? z{tO4BzYG4#_J0T2@c8L|1?CuqRD`P4?`auytttgtCKNsOa?j`_%lMWV%8DOKH|>o> zyS7lfJ38lNK;0KR#9MVpcYJI(=@LXU607NqONjZp>jYYivTviet4h@y8aE1%{^Xvx z_(lz8kz@8vl*ElIdb|xUz)crOl!t^`!_rbU-vYoAVsGhq+-lA-q7}w;F?OD;_Wf9& z=G|}J@6gdE5zYzxwWSsb`^N$22S=~_urbTC-MyfhY8Xr)cyf}du>Q+Lz4m2s#Rj{G z(-l)`nZvUWrRj9RRr{#&DV5UrdJE5%7~8ItW35234`Wi0RErhG3si%>-C+!_+0RPs zeJ2-97t$iq7sSuoHy*lbdf#*D3gj00zHZxDqaQ4x<;T>fG852ASFs%&rG%BYwraWe z)hizD>wI3;=m|TT{gW!MBjA>n?^q(Y-3aTKv>cJWTkQP78DLo|9S(MHT20*RWsOx* z9S$mNo0djXwY=U*m;eDQ%8G80Swj#{ zcDLv)5e@d)&^#*UBvvNzUc|IO0C0@Aa{BY z7pg2n^15f{n?>US?=w)N3NwLYY-HzbdxHI*OLNMq(E|s$^u(0?vLtj4+_&PQT9O zLmn^*(!ZA-F180Cgdi1)pfJ_^L(O(+*dH3Gd}6K+#TTQE4j&&R5s&yBKgaTG4UH{E z=vP~XLFw5nBU+&bpNevgxt$j){d`3@ytW#Y@;ZoWFM3iL&3%Eed=EQga5NlD-q^f9 zW$0j~y}rg$L6?SB?{n~a!aFO3qa5=g@8f}fk(x9H8Qi1AOunnxhB?1yKLD#yF=N-2 z=I3&c<7@>808|lT4&O_K%0+F{$=YoGnE1{JO;IYd#sPH=mxe9V0??jUdspY;Qzs8Gd)aMEDM%!TtM)%G2m;*LN4^Ce>)B;o$IHJnVT2YxbI=flSzH)uQoOc* zrGt1)Ix6%)`e4ok{y?B2!Em2ofLAYD<;Xg0liJN!z~=EfQi52|8vJI95$*$`0;59b z`)CaqTo=%&{-~(4-{Ce=Jk92vh3!E%`=p(uv#W7%X6U;hCFc-x6Ff8Q*5Edhhwylm z2(-i{rwe~38akjyh~d7rn6Pg82FimRNkEhs_0vyBenO4Do<(D1?+mIZ>Qce`#@H=UNWtB@ z#Y14ek@p#T+MYDz^h@|{Ch<}b5aMfLUCbc!cy4#Mx2Mlo8^%#C3~?Mr9C?=x%yRPi z@~_nPveh?pWi^O4m3J6ouiI_K|E6vMTuQH07cC7{&+sk3)h&&RznaR|W_y2lwED(I z{kLF{xhf`kBARt^eJOblzRcA)8!rR^-n+~tYjO|DY6Ti{4@Q5s+WnKj#RU(6kLlK;V$Zi8g-mCg#A z{T*#y)2i_5W|I4STdD0qQ5{G5PSoFpR8(7)1*qAN?`f=;IhOB8lHA3$TK?AdzQ2A3 z+gtC~^2vkoNV2I=SWpRCUc_|SQdZUej2e?NzqpO?6yn-}B|2YG;}%|D5q75#NPq1a zV!qVESJk`F7)Ho@@rb`{3Sms%%QJBVK!B&jK>uZx*i;|x!0G_4aT2ycfVA!+RhoJDD%pN2G6+{34eem%h zl7kKVtsw&2?$4?_ya32cP7*fN^tTTPKxZ@Pz*vH0IxU{upbG~KbTWRj<0wi(V85UJ zD+mY;Poow8F=}JwcjUqbMkLOu4ovDa zO2&LSlCGa4fdL*6$2Y+>RSs(SNt7``|Az$_;0rF{;)7Eqna7|14iQQ?$l=uK|nt;l0E8UjLUCI6(KG@KNdWzUK0WV`sJYS zS8IY153{2f@NxViKB}8obXHVra`1DEpz0fGpx-$%01r;SexRgJwmnYZVXu(@ka$U8 zQA?GzTDL93F$xbG45wp>z~T#N0zrdbz6ol8w;muATmxBj1tj0;VF~b`f9+0nk_EA# zgMokw#F4`(aO$5K`chsrw>btR5u%p>_8!AZo_eygOZC24wt5T-qpqN(GYcDlK|<8D00~lA5SCrcamHhy0d!p!*9}%oI^Bb zbhro`(2(H(thps^OGM~7+z2~qJhD=xR0H8ZXc-f;d%DO4u_MV>@~2*08e zC58*NLn%jd(`r69z-mOpJ_F!gkm3@P0MR4eZ#z=Ct|Q06Qcuz()kOQJoEeVa??xg^ zE+7T)g28}3+VIzvNKb-pdf8|_Y`9@-@dG~@=@@8eF5H=4Xh7lESs}Q&vA#is+rte? z%!cG%b&8|GJDSgcB|#AYTtqlTLC9vD{tYc4lqUr`QIZ0Lq&gOjFVcWjRxUsYU7z8s zo}pR-;pH#_29wc746=HTz%{!2pt-$+0JsqM5~4b7fi!}@m>IJxe8^GZ|3SIxrU9p+1bL}go^ zvANbFSTyu!0Qrb|T%Y8a^$Gxt%G}xUippGlA)Hp_aOj<;HEvd$To0r29_rd*3c_%dmVve- z03z(ZM<_`xi#^vR^9LCRDr@^~I_8~Xntp4?ARset$qFsX;+=8j=V?Tagj=n0iSPBL zOqiqq3C~WYl-mApiIb8U4$BT?{k08ko0lM9RDAV(aY4^5HoMmL*3e-e5jP9|qo2_^ z2X|VII8om=qsj38OY`=>h=2%A!%=VGFv7f=l$TWSGeG230;|KkK<+_7l7YUx>>DLO z=)(%fNkd4!c3}KV3?Kkp9XQEdpjJ(wPoqlHBA`+Oqp;UCMaI}jy0LHu)GFFKK`^@ty+$)+p3BMfb^En$x{_| z-`YD(0U_kkcerWy-hrb4BsAU2aNzUQrY=?|79udBV{cU#IP8fl@1SqbO(})|%=uoX zT<>E&=~GQKhv23vGUQRf{3KpLWIaW~%|QPHK(cR&n-)Z7*@ODqhRPEFtZUfg`toq4 zB?6!xL1_U`)0AgOyX(9z7|xSYC+{)d)O#A$sU{}&fZJCSI6AEVbR3-zM?(x&5^uNB zxqa~j=kr&Ky7)S?ER2k&xXN(+vF=6yAcLf#UctU}P&V{ei*)k)M%pX-jwhp%0-FPe zAGS|_CBNjyd0GJ$!b#W3Z8XYWK=n&lg`A~_7I$mR|$_Wy_bea zYzH7k$nsfTS;`VKQ3;go6Yy%p;bu9>NO|bWbC8Q!@xLH=W3l;*4PS5kTgV%Zh6Ym3 z4n(d*Q#=_a>>YaL=$5mkkd7ym-cyOSamH==l!@3pBGxU3JhKDojC%A9=tWRLN4Z*r zezIu{xZ>nGdx;E8TFe-W7A^kFFZm7e6CPh}yI>L`4E&)rPQqqKp9&t>J=$liKJObJ zyprmboJL`0SpHqm_VAl6tnkS5p-A`sOE4pUr*7Al?%l3x+sdQB*=;*k{PU5QV(;_v zB;un#n$<2bOvlvZZMy9IW}X!Wd@}2{>2Pt=@+dp?4pyl=@>Q&4Cn)P|^u=<$Kr%&T zN55wpVRi^I950j$EQXC#19qb=ctBJC4IViTceS`hZ9gQOB+`dX;3~^bAgVe0L*2DbOBKDT?2jTcB8}U+&7E zE9IhEvQm3)TI%lw8lvd?`u#ooa%>ivQ`6be6mR$EUHgN1jf*0NRYeM~-#OEjD(>6L z?+L5(!2^GXRw;9|hol)4tb9za^8{T{kB7&?yoicRTSY^v=J|sS-(L}-fOda>kJPpG zwNf;!et*Hm3CSFnXsuy{1XLz(DH1!?hF>>w(+H$A z-PxsbDMZ!tkMfx9>(}}Nh=0)INTO3JsDyHH(-q#hfxmN+bH}ISu8_5oX9Z&Rb<*kD zBfMdIe*FCx7o+~cwVS|BdDR>|S zHL$ynsZQ~Sue6hUBzS$+C|P6Vn?=7aO8d!lyBTL%0-(!wm_{k|gw5U?iDJ3|%0`AZ zK1tY*YTGt+VgI*wjCe%XC^?m%Z-19v_Y#j~?I5wwY^5 zsZNbiY(3r_JziQhUB<@D9&l))qZ|+M{F&o&0=>(K3Z5L3u>!vl``{geo72lgh<)+3 zC}2z*-2BO58P&2c0=1nD^Edx7Iil>DYT4zOPdhf{BeFlnlV7i zD!~+?O`s+g3n|Pdj0z)qA9uoB@~^^Vtbv4r(I109+&eX^-VY+1wcEp zU#yN-+F5b6>gC+EUiQPH#;P=YFN#%?q}_vSKa{hB*I%uuq=DU&G$smUg90i=p2hFu z>1iRnP0eKe!;fH(a-0Bpl8>Fv68!C%nt0NLbfNF%3@OiCmM`b>;FJ32b*{`&(s~b; z7ahJ*Jj`PF)E6dozv$&!ai#TkpxX+1MTpLRt*10lZjoK-wz^T}?p$txKa|JZEJJ$G zQRM5SFu{lGR}NCnjzUjxad=~Vl|ph>DH53$<9=WXIV{V1jm8GQwC-TCg_h+NDD-b$ zW}#MpnN$yv*82;kR)ot}dkRDJtzZ^^Ba10{NCZM+z)JZIa_)W9PM26g z@+-6Z8F3TxE2JI%f+oZ6TZ#}qWjizjymZpw0zgp7zp|lg!@NU!Y13obKoJ0c&G>%% z`XY}ZW_79S@P3CSbIyXIjcG=m|CmW_&e0_XQpL#Sft)EcRSLdE4n zrFjUqh==d#VXy4menSjrz-z3SaqTTLhH9~9yuy-kcz8ilse~eiKh!Q~V&Fzz+vvLP zZhVmGLUu-z`bF!Jfae!a=M{>>)+3!4E*bTL9X)1P8Qy=KK1=mFqGfTI9+@85e_hJa zJT1!7Z;rE*P5~*BOx1gpH`RWuIWuObbbAhwePmeJO7Z<+&=2YGs%1TzDIVo~J)mZ6 zU1UOd-OwWnj}=V6M~DnM@1ojtS@^h0DE#bk;pT69`w!xCZD-rBI*}4D-&1~Fn5G_( z{kD+{Y|pi|-sQb!b~Hwun;;(!1C?BN0qJZj(_UsiFWH`*?+LPh{0RbW#zX8k=I z!tscqSAr9ahYeBlH*ur~9&K*B#87+Lc;UIN`ulJ&cmxF(%Bdr#{x+%wVu_-+Q>;GM zq%NGc&v_<#4nLcqc0dXxor@%W*8-^^5o*$bPzV!$mF;t45@3uI;FDZNdkz9)uQ}I3 z()7Kq^7U%xuPR2LP1Qis;>Hw_X2L3Z{7=2!*=#^e5fDahG@!TdjH+4&e+GJjb~T|3 zPFUt(`me>rUI}oX=t1-njF=vUaxCcCt#ihKO9`8Yx`Hr0^i_6n3jveBS{rqB8Ux|c zXV22d%U#oMrS$~#_iHAtiXX^1kW87_mJr2oSAy6~VhaOT;KU6gLoXz48&-NK1)gx$ zkVYgG0(g*94M;HmsPmyytAsi(n1Eg*_7Zi-ZpQ}3zzMS?MA-Abn~Io!jRk}95=rfp z*)1Cpt`QrW91-db#_g>PB{Wj$5_WE$fHJHyix>`tYQ5Q57f12u;ExStX^{1GPZT6r1Jvsj*Lt%JJN zhr{v=EVN~T;C1eg+-27ya4H2DtXVSqaU4gTzFw&$B(^S9PbKQqP!J$`dN!iCbWQo29b#XGroBPdDJHd zMLUVqkbw{ZE(K`&gCf+Ig#|G)2cq&wla3)w0@z35S=T(`g?D`cztm$Q5e7dOGLZn? zbNF;=D;ngqE_iwpwXc>ITn_^2RUdo^VHe9C@dahd0vFS1kKyoA6mGR^;#Q1a+|Ea} zm%XehpEM|DO#p8ctBiPju551+YiQ)0tR-0wpzLt%*B8Z5e}g*!*l(6q+gXZm=__20`E0)TKJ`@ z$fO_$vXLvWJ0V2p7@3a{lHy?1Xe`AaYJv`NnZe>7@3kOTFtL1~N$WjN>zOs$A``k0 z#4AIVR0vxp(vi9^I=vQ~Fn}VXHG)CN|B6fo5+g!(l_YiU0)T^YH-7*huj8|*HF2fl z?$!hots=^m<&8V_JX&x(F7UzG8#O0rJ`!m0!^uzyE^>puy6XnT9%`$QZtry2b|tAE42l>B;37MW zGT5Rpv-M=+>X~`dbCt?^c@X+~3IfN%FiX)_7OmS}_e@Ol!79;p#Nc53J`}2^H2_XZYFDC2CHK)3OY^Iw*1vXbGXj^3Zk=mp7Lt2 zi1#`}uKmwM)nD6PT*!z_a~_VHac7?`ZLq@$8Xm4k0qzP^Qv`!Sgs{^+Mu*+@Wu_>; z-jH-D`h!heQ7iGI^xCV3oiIwUlIjRbxqR$rO{E$fn|6hq-Vd@ToYHq*VPErTVcjB8XaG)1I@9*egJ#v5u$rAKv28GI!FAaq(3}?8Jfw zS~{tu-PuT-L9n%0Mu^&UufFc=%!)UH~QB*mL)F`cGkwZ z@S{b6a4|>I(#t^%m%+|+M!H&{MAC&}vJ(x&0ViQAw`yPU^p+_bIY=v3(iI_jDxrT2 zivl>PdIpQ4@Y(i}fd?AZXm%aep!=TCgDZ}E1Ly;F4=Le)FJTY=?K9yi*-Ip=TWs6Yzx+9ft*-;#{e5)`utf2`w9B{NYw)V|D=;?p#PI% zwwrI44YdEkSd>4@ZoP-Sg2VF-Pmkf?91otp#>I2<(zrx!gs;2SSEbZ3i_P}2Z}Gu= zyCqvinmL*1VL31uY2$7YYWcKwV=O6B{Kstml{2CT8#Z>fJV3EG@Uo=o?*Jm#yg$I; z@2pSNwrt&JmT&Yd z%~q_X80ehkApJVk(L$e`CdScTu0CDmk_A<&2I8?J6lY2AMw%)7fAA|3#NMFCa!$dS zLcm4SxqE3Zo9HygoEkPbt)Qqy0;gxPAQf!sX~#Au#OFQ+KAGCssDMxXX4rkUWAz7?^PLNvYctCsvUG^T3%aav4cC>IC6ArZQ@U9R~pQ~o;4hBQRgqWIKsa z>o@P|TrQyX^HK(NR0};F4`rV30ncX5BB#2%BYBUM$35X0e1D#?ic0%q*yUN&M%LJg9sk*T-A?2}fW&J$&ULte}7?W=H9o zzb{hrxgXKl$57TpHd+U(g*DBqoj@uIK`;GnL&5#w9*OK;!!!^$_5;e%S1p5aFxmcx zAmTThro51fZL@A78~dnH=_b%(Q14$fiT zVrUj7tQ;ek!8pvxRYnQ4GwYnR(fMB{*aCFneWFM)QjzlzfP0HHOF>?&=IgEeuS#Bo zix81yaPX~46J5vZvrNsq$MH;|)wcMO~i2ad&V6YSsrHcJar>Pn&$O^05P3PrSzc}&NU6awSJCvwv_aq|%% zpLDfC>OBUFnWajBM#g|WkqiEHY!af0&pjJSK2{A|hr~)&i1TY)k8*5V;*n7u{z0Og zZ4-jzdKsUuTW_yvZvJ}5)!(+dNdz3p+ktBHk?;%8jwqFEh_zojX>j*g4 zHu7pZNnd({3ei@1G(Gq~(+@a>02G8qyM!Aqe3$G0FV2QesT3BW?T}U}c8R`%CA-`K zSguBD>rMHORxu-Ou|1De{&i|h6y&TZuaeOUK=KVBnba+FYGO<}-N4gE%0h{{kIsT| z9bdFS2)+}O7mLVLa!a`b;hxTbhDHHca^wrMIMMqE^*Ye}X{P4D$R|dk@ z;t$`Bb0oJ2AE0d-2Mwd2MGN*{q+D3wkHYth5G);)XeYj{%{FU^ja4ft#Qf7l6ZKdp zyp4_gVk`KA;%Vpne)A0T{QB~!watDfD$g%D&LuSv81_0JZ6&45!BC2BQI}U+o_cWu zH~LyHW(Qwe%aPEledc@VM>bF?W@UXqnN>C(GGHoeJII8(#<1d18Ddfq|NMA$*qu_X zVH93qLlNC@%?>7^t$<_78g-;QjYxfhmmc;aj^>Lm#qRFBD_PUOo%u0q@SpkCt(*Q~ z&y%1wgME2Ms4gO{5KAu)+5hQv)M+IjePfK4x;o_ctHQSuD_pzT{#*HX0%Q^)4nf25 z{ke)(3zEpaCw3uH7RS23R_kWK&bdr<_uC~EtCdm!kqo+?@{5(_pTq|EyvtjqaY5?H zx=K{H@Tv!&{3tL2UV8b!(7I`n)qL^m47lCZl^2&-xAn)24?FTVe?y4tQIQ|9}`zt}ByJ)+{{$-2@hn0=cfDyFL4t5UTU!9m(-~yn)a1GqyD57c1WYiyz$=Bh{y~-vWXL&T!3z9~cVJE&TJODzYx#YGJEdPf|eS%Cz{g z7=N3orG^zm)vXHTXmOwV_l!%*bA-UR#IFusFc{Qj1}{xS)cx9hGWeQASANPuIhy+b z&oVUgyLKM+4czebwO2*dZg@uG?Xg#lzWge6SG9Qi;V0epu`mKh`zK-)pYfdI5Tj>& zbiqYN{?an~#5f%eNvKIdW<|?e*35%YJ;{GFSAF3XrJGx$G1jK7HZ6KWrl(3rQhs%w zLZdkrQX&qQ^>!F}^=^T!b#XOh`90VZ0(THkGUDvpskXQ8FPBL_b!RN&OygiM(k#hE%9c$}e;fBUR!X0T3mH?`MdF1iC$!O46bw6CGW}{P$YN5c3$D{(Z+z zi?C~^ z+PVpTUN*dnfT25Sld`PrNxqierimIT5-<|}azn+zO)h`9@+}Hj77h@7yc*XCDy~v;`v)rO5lt6xV?axv@(9Rp z7jXDvbzD#c5KRM;SgHG0r6I7@wQ8k_OO{HA5Z zX7|ci8Ye3&T<35RL|giT-7=0}D?ywnppYu1)G1f; ze=C<;n1?FqL>&4!lp&4$Hq0k07@0}t4J46AlT5hF!TDvxj6S8@b0VQlZnE$kn85a`=a^3&V`fzt$_x$YTFFT%c|ael21#-A7}={Y2Wo~ zRn!I2j;f}rm)WT=ff?UYKmYYl-sxLmjSPN<4fUNV#M(I}20x~9z6<`zKM-nb-$btGizmNYo1>$VeX#deP);qIJjl9#0Et@ii^*T-4)d$qK$ zu_+3X*vcmrHM6#}U1;VRRqaJmW8=2iC%k*pT+YS4M?Fg3?K(9wC~>m0XJn;6X7Pes zYE^r#I~kl^)?-B9Aa=ngJ1?u05L2;I`w=oBw^St*q5BHez$0mU?q{dZk3!(WEwjec zYSi~r|MqVYIzA+4vyFHuPEeyG+$?;N+a^sv?etBsh4ycK53PRu!j$mv;rqv26I?Y_ zS@FC7lFnFg6)OFPf0pWQW|MvYD(&aC*MeM}xp@~i(VZC|5QlH>#u<-Qp36!m6+Co! z82`$|sr!vSvmsvibI3L(2WOPZ(0lF5)H_8~cImfFS^c1pUxwJ_P2EWueUk^gK_d>%%oYW@6} zp#);nL5;i7C+!LJ-6y;iY% zll+Hu_7WZQ(#c$q>r38;v^M&*GbQTZ_b61T;l?0Nr-Q`o|b9fl?1S)IsCKne$rqh5AoZc;anXSGEg?e|^kXfp! ziDomif%-m%3-6M@EG^zqRDva%Kpd(i7RxmV;v_$0Drg_lKx0I91lWWOzSdMvQamlX z1-k@tQ&8jOnT47B?MFf!BW}cPjeQ)a>p5HodoKkNaIks$@44Ej0a}voMC1LIQW@^) z|0t25aj@{?huk^^hm9qSm+gSmDmm~;mG_ohY9pWg*ILk+^CT$k&n6m}X>-ARlDY+d zq_XBr1%&6zijMe@xMo?Vr<34?v?-$k5}?SnTsQpBqcq>A=mYxR^2D_jDQs1?Bt+zlUddul zTp<>x_v-~H!!$T`Z&wr9G9qN+FLQWv+xKG;;yn^;6rE+f2|=Fun3J}W1!YAdNsPa> zApD2pq$gj|U2xJX%D%jq{o*+Sd;pH6~WG{cHB$^JkKQvMK!NWvxU;BIo zJKe5=^ze%XUS8tR4kFi3(GwA#)-Z|gNl;!%bZrWt;M=hyfM1R87vpfr;5kaYs1*`& zm%zs}R`i0vL9ZWj=6Gb5+cf{7omxNau$V5f^^D&tcS&N=?$B5H?4AuG&D?Wnzy0%~ zFKIiV*_Ev7kBvt~9x$tu$?%G1+{y(PuC0KyeM2v+UKY`M}nsZfV=}p(p8qy!*8YK>PX7BwNO?Q&fYJ%kCYK3D4L7F4t{Zjn$0Ly|p2`)M-|H)70hJ6Jb$F8X> zdpdNMHYnBzixFjWc<^iPzs1)B^;DRtMXRXAD&nDWC{f9p^mz*AAK5p13wpZWjvi1+ z&U9XgPX=l4y(S=99pa@6zS|&C-HAF1k5Bkcy@c;opFcdvbQ`Zqat~o%ykI|R^f@m& zX~UGfem$56t4B^7b#@~;pLE=R2Tsnx4CI&JO#sgc6U}HtD8kN;{9|hj79umk%BgCY z+oFSRV`}ZR+S^Wlzb%D56U!aW;YU++w@OuuPkUjSzn+;&KR@kT+}%-$_QL&8;!A|x z@|x{04G*Hd;s`&@=4&2spl|4H9haF>{Fb?~t-ele8LDB({CYAn@*h2tGXP!&@ThwwT&12_p{?CtXroy(o!kB9)7E;0P zk^HCnTR0>@#LpdiC>1d?zWgh+zZcMV1|$@x=I?G!97Bo-SL9xK88>y~r-W7Yp@Y%C zX#qmv;OHOGi(lqcA;WB!y=O)_vb`+vq1Y>HeCKNv2MqAHB7feJ2mxebkQ|EPEAt~M zsllJlWTq@BUgMbHb#w*>3oFp2fgqDNJm>nd8PmraA-39_c!l2L?jkOet@J$%nEhR4 zC~Me+>2us1$A5o59#-z3mKrDkPXcQ}swRpmjajf*{8S+niLPUOV!Cspki=t2dxqo7 z0N#ljF-~~;7?W@%YCkS#H$i>ZMblJs=BJzrES(2OborTue|@P7L;)h~5NPGrS%Vdm zT`8`mis1i&5gvjjn=Nk~7C*ew-zi3%%ArpttL&TauSfEPiMnwb(|jAQ#{|XlLEkaa zq+FDj?p0~8@;vPF;pD<8qkBr6k!2Q1&f)|`Y&m9k;=|(^# zb#_{^AboU1NT@kN+x7X6yW5^LP6;kR_TSNBSPt*~ysZ6IA~;9=No1YhE2gOvVCe((A+>{RON6n^&uTK_@kN z=xJ`X$wS|zxjpivj;}4pqL<{IS>q?k`3(Je6ySVHUh$b|6UYLT1ED_;ln`ps4?IOwHWU0%1d|KgQ)F(E1=Rs|=wCpxHedbZ;{Yl?xHz8D#e_o-o7IjcuvUIw-6 z$b=Ew2cca0Tly=ny2uX7VOH_Jd@L2QH&*Z`)l5K>5c0-v>VGAa>#E#!+X#!V5wx*n zV37=jVVjsjL=qC%Bxg3&FCt%naaNRh@by7v-lRg~xZ}fF-d!%=FvRtW9_u+eG0=kY zIYQD1&_aKiNECt%$0w*lnh@3OG>qty78b&ZARJ=-c?yoMAXh<+p6xv$#B0JEkrp{r zIW%-oBD>H1OJ=RDoWU@h?<$=b25X{x4K~12wWU9xj&H&8{McwZZy;Exx*dt@HTc}7 zI&{232=QecuAxvHcmga8X(t+aUEAELVti?@XQD;7>KC$O&!qmm{O?HhwN(mOOW0|w z<@tyxob;CB^7pK2L)7n6-hQ=#v-Jl2DAwM+C~D;G(~)!U(p*gqPrsebSe-^H<=jo9 z-TuCv9gF1%q%WBQ(WB3Qv3r z34fe>Z3(t_PvW8;UugB4Ge;gdUhC_V4yFJVK0D78YGMyQU?tv-v3cz2v*x@1;Ii=; zFjD{M(cS0hy0E9aEqT+#n3}!!Lhp)F!<-TN?c&1YC7gs>LjQ6|Q2J6`Q?k=7aBTfr(C86NhL-^U>ijb8)X(PrKb4&fne(lCs`f>JJ%_C} zC#yH@w~X42=l8@DOwW#*oOi~$JUYDF+MG{TsXocvUMG>Zh7uS^I9%|V-nUqOf;4#9 zFpQ~6+ZO8lef(EG)3`Qn=pp7i&)$I1>#ju&64z@5DZ!3H8e4tvhYXQUDd2)~a@KHY6 z8vW3OuJ19hx4u^TFUt2*@zw~fyd+7;zWHQODmWSbD)EcB&3Rj;bxWs*Mc1B}fx-~Y ziLfSLfN1inQlcd)jae&%Q~O@Oi(w)9lja}#m~G{g$tts}zcXSE^Y8CG?r<^*{whT% zZ!Rbi?z37By^x83ef6H%f~RTS|N1Vm4rUtLqK?!b`Qa~`tyVM@F=@lRiDXIe|DWpK zDlD$1>lW>9AXo^l3BlbGJh&5rdvFpGym8lt1h)_@xVu~95`w$C1$TEni}(G$f1l@^ z=UknAv$<+|Ro9xUR>>SS=NNT4i@6gJ(iT8=%!5vROXYptJvD;!+FUu)fv~};tNOhG zm#1+DQZ|2ZOxveBSdqG_rRcj|b*d#G&2^k`?c*P!>FeT*SgDvhQ**Oh(R%Z@5hEF9a_+1vAn!@{oCqE`H1^)``~^&Bpxc* zyQF&;c6D%TaK)<)WXdQQwE=J5yruN?r#k^C4VcE7Iw4ZuoL%2Zfvs|K^fUH#`czxjXlFAI@Gwm7LK8ce zF3r>L{RbpFDeFfUanoz5r2<(N;~IWnI^`Gk`g`(}nC1ob9H4bOWF`&|iSPk?_w?ENpj%oiC^oo9!7zwCZCLMY3NO-g~zFP#e%AZL>dN+*G)1e z%&TYmdS`Pr7js^4h161(>B$CPZMUoDylJ;z)50d?(e)8@Rj1=?0>xpS52GrrdQLGE z*B?-O{+ZS~#yow8Cg5Y5L~jy*@u|S53D_3URsyyKtRMmksXh1_UgbJ?+)9l@ymuWR zFNpPmRK-)dEeAE87}6>LL)y(ar(^Vf~`38sg0+!7iNMhD4zdK5`;z)JU!zK z<>Q7snoSYy8+lm3luT!R>ZtSzrK+3Gr`%n`Bbgd)WgqJrpLbE&@tHGV0V|C6H&P@*Jg`U6U@IvuFXuEx z(aLkRYdvi^a_gM(C$W9AW2J?#_^<3H*$J%(@rW+WE;8Mm77{I8p7dURiva7~mURVV z5{SQJAYJ1w+ovWMLQQ`_s>X+35E#hr&YK?!z;0Ft{$YBjSQCANM8AlZ=U8N~)S7!& zRw=XfJSl@dCUzJTw5J@M6&U(5r!@ys#D#AdsSIPg<;}(ooJ6K>g_baVnB>>gRbvr) zTbnYvbP^~g%&6K?proaqTUiR;mh!qVN-Lu~M&ITsYKD+cTI^*|rC3oLcKwX4P>caL}!OcG&f z0!-(F)vpS|$o6w~Cu)q;V38e8lH0FO#M~KsCsD#)rnJ%?IT`uJgL1LIBGHSa@IW!% z!|)}>a`Vn6_S=rC>9n^VsB4}dr6~Ng$nSYa#!}+*!op9E-IDdC9mj<}-N>(}ApXuo z)>S{~KP$KtI9RCV@G`%f_DHxJd*zS}nhg>xFlKD6$(OtjV)-ddsri&pomNi11X+9O z)tyLXTL7{Tl2YsSuTQ_YLD=G5w9U;kCRvJ-$1>zUf@iD+G!B0PBAeekF%%7PX|c|^ zahKU=e&hWD4Gn98QEgJZ+O@LXMVmJo5t!q*NaH}HCTfFgCLR7Kz9@ZJJ%U%he{vEl z?*KZu&@qZKH-F*23XlMBpbG26$KZN9qn8OHYsxwYvqQ(7Qxh<}MrUcun$7i*cmv*( z4lPP)>V@RIYmSjO6c=qqa#3rV{)kI144Eqpq54$RWW;vf z$p!QwRGd~Wki_8t)2w*V(lHN)l=Gs7imdkrFp>xLV8C9=sa^Q#xORTBE9uHanrYtEow z{r73kr5AH!i~)pCM~+O}`rq9Xuh)idxchQtM2dQElNDu5;_=lEyRF=-h7Gzpa#^EJ zZ4^iE@$;LOs2N)S%OS^obD=U;@V)&VmqUE{;^o$?gzQ~6qgO96cPX`YT!)=vQ0%A6 zIR{5-S$gXXDuPr9XNhT1(B=WKJO(Bq*D5~uZ0wv?C6qk9oLU+EVQ@>h%w4c+WUG@^ znxF};7?9vs{kX(2{zi(9-EXTYG!}_p!YDm6Zf}@Ge-Wvr z`6F26THU)!+~xszHW}r#DGj@{BAYSfaf6Tk_i}6BybUek z+_JL~pswIP4ZC@Q?ZORpSpNLG0pVjkowT7fw<*)9-`!+M&Ez})Y9L*DN{|pesh*_H zsoP0?qqm>@c01v~OEtFqs-rtB={xrO_0Q za0yQ$XcUFJCyi}sERvfGs3|z>tt&KBv0uC6yhw$2-%6nbhJI1g+2-wmvdNLf+ zHOg)6&VPnlo!G126%}bbKF>N>XD#9{SR?_G-dE6y*=}pCQ@liyN~fl}890zWXWt?> z6lynQhHSwPZ~k@W#9)u{EzN@lkD?yO(X|9u0jGszDlc2TahA;D+FgaUe_oYdHNUVi z0N(OiQ6p*WF+Hv2%1x$u^-D>e_R7jtkFkVz!Ud_0NbjcJAUb*Rrw4mCzd5Ly#oK`X z)tSA=aHw`B6x^+CM=V!G zZbvn_FiqN%xA9MZJx%xdKz`^fJFs_~= zJaed7^%!jjzn?JYQvTnY$y z2Zng4D*H=X&f6efbZ(`FVlHlv*r8zASby_+ENX{_mN0#baQGk_MYEL)%9 zLDYM~+<;HR<-6)H0MrybgWoEs=1aajSL~oRuY?S6W#9VDOR}MyAT<5e2Mllo48W^o zhTYO5i?-J29^}=gKT)|qLtKAKVIkfPhlK~f+-VisT8B%^+A;u*DfJ07q=N1XBWsuh zY$KiKU$qG15#O4zhL|*8kjtUZHLqA^NDjVrs ztg)b^RpPd2D&vT2Xjf#YX;bo91tPf996(6d+&Pc3Jemj2ukQ+zbk2ON!aTbESeKNT zu96Oyj^-;oMIq!3YI5vQWl(`22Lq~aper}Shbd#%KNuUfRG14o+CS7u^ z^*abb?p07F>jhBm!1kDlMKy9swNJ~Hhl9c%+R@7b>xD3u@cbe3Q-EZ-^X*JTPPK%d zN?c>QGWf*&dlv@OkZcw^0=bYHr*7%XetwyHRR_7q^~Zjb!gV9!xu4LDGQc8>!LEIz z9$P+wG?277R{5ZZWc(PmpQGCR@Ux3fhx)jF16I=r#D@<8?n&ib4s;9Rup*dgC1Zuq zz2m*lHbPSv$!2$B*Qo5}Jh$TL3CA6}5=&2YNtPm;qxG};QT5kMzZHo{weIzxH{$|& zqlrJ_N^sL=a)jM?@>}dZZ*G6L96A259&tb5di&jo`Rk9_xe*qgkwnlr|1MnG4V*(j z?S2>7&j`v08xf^eOz$t@W3&SHv8`jg7!=}wT;nrKKda!l1No{+RoGsA{mHXMl4d~9 z%dHuD0}o12SUasboOq;fxv5Cm9SOAS~x`E}Tm zbXX2>TMm*WtpsxF%QeY(uX(;O3rT%77`^chXS{w z7XRdp|CcGcFUW+`S9+)+ne3XClINB|D-t2krr*eWi*YQl9PwIR@2b=F*k*aE<96xP zFBJv*aMjx1^qP#VIJ>#|y(X?_?f;7%%A%k`y7Xh`&=Hrhq;_Lgt47f6KbslK`CQV8 zdGq_yYsz4(7{oEpjX3g~sejwXBAWZ>-~PPOl!g0hwd4knb&r58ov>_&QH}le?G@GC z8o?&nkO+Ltkp+64P#)$%vqI ztS81PkA6rm(_)o$r%)D`y3LYRtjF;Ew{YoKp*G&xnrd@!MX~UYzA7I=d(k@^w~1~f zmI9C<&;8#~niApPLdVBbn`~yOUY$u1l8*qqf3IVJ&N-@%D_$!fUVrEEUhlYy`$Oz_ zhS$O1xS-8m(d}!fa@;;a3{Lb*Z;2Fqkh08&WrVzkp}b&orp$Zt_09Zvhk;BdV6ZM;8O zWX}#c-^}YHJiZo0uCAv^m%WT9g=%N#W*i92t29-HA8aGl3Q$nEF8jOHPeo~2jS*Lu z%Xw-6Y1hh{xqn|nqT}w4b+bZDU*oQu2JcRYW!Sn&J%3)LtjhB+;RW3$ivLYLIikOT zv#e5WFj~z@xNI`3&>h6JGz?7%Tg=R?xYwtv`pXq6{x7PpGnh}JYL7cakNm=wk01&F zYI$yaJ0Ru;kAlNXb3s%=VHEnN*- zJi|+~GLgUNrfIeREchp)`->x1GNKo@pMgJ;eT*cq9DFsjZY;nhmF1O^*T$r=_Pqc= zb!PD4pa_dhk_e}IlIw{-25~?O(JpH%-}NUTo_;WXRmCa&tXm;)-E*z%)Wkv3X#&tR zn^oz=huwm-`EG@k5Q%$&PFYHHoR|v$rClZL-Y{82f{7e&B`~Vf#9ZjjG zlGc3Bf{RD#aOKx#KGt)%j4nR&h!#-g@*bHwnDAF*o(h*?02K5V4wZqriiq|2y+jsFvJze_{2i8oDZ28gso4PuTNMb_5ADQ_LO-7_#6<4UyVk@5@x zbgZ0E^ncSqYYcdcV)H9$#{L^Te@TDY498kHrvcHlBA-^oN!jVtlaizPv_j?%`S^UP zuk-jipb>o-Ymfn;@3QD$GKx4py$N~PfBG8gofM;&E6p$de-`Rz7p$$?3+`@9$IadJ ztz24KTGDw8n$Q41G4*9_ePyp2tY{bf7HwWBehbe~8$nU&K@81^p`;>#RM!4l%c4%9 zB$3vfhIo<-e_5eGvxbPR<(!~X6-K;9bo$`0P&N=A^Bpw6&4o7n7ST?I^xn{1!DZVK z@Q*ufexnUrMgY58kJ$0WFEXM;!Al>8*hCjBO8*@KF6a|)r&~G5I<5hAJ?3Ok2l;#b z%2x;_waE=yUMm1_}qsFDsb9q8a1{#0BfGnj3%l^7`@c>v)o zviJws7WYv)ZZ>^?+XLEdUk*=8AcJ_l`k4&joEuk#-Ew|;c7n}B8$E}l5IRS@xp_MdEm z8FMNY!UHxtE+2WI-HsH)n}shfcUC;jxvzqp!6a=+3y9n^R6Kw@o5ZHJJ3d+b_FfyF=5XG16K$d(x8IUCZWTp*#>uB|v$5!THHnIWk2`-Mu??Mp9Uk|jSUpL90 zfc|G%#ciBbY;uJiU-Tj)`W!5zG{7b*Wc%cZvX*JC9E7;Gh2k%!qidP{q~<#3U7-+J z?97(5+e!U7$j+1}WFR+Zp&j#sH&;qmw5zhm$WLY{g|-PGn*1w4(WGT>U$sWC5txv zMKu%jwe#}N_33PXOD=2h#$oAo3!(QuAQNEI{I90kywl{Dh|xq-6JLw}%xc+)H}CaY zLNO2G8vyUv!KcYy}p*?j!4OR4f*k55j7@(GZr&K zt}Vo01Da_%vteIe0qMAWx#yxM4u}81&ncA@mWLQuG^Li3I*@9eaiaH%dkyRw#fVY_ z{!8;O!Q*4q`&#!YQ^L}2qvg8%L{PG(@7)ofkuZPhi)TYlx^$lbVF6wP$SbA`>Mp2> z;ANoaA8#~dT|iVYP)-ARr02OL!wVVF5WKJEcj-B__dwvM3RE0rrP@k+4h}2 zPAIgzc+}9XIR8qvFdA(<8gb7nJ6im5N{syug))AxSjnW7`X5lZDMvN-hLPojmiO~P znxz0i;QA$I!Res;t4%WVjk~;(m2%*jW`-88^s~HE1v0r{>unK9-`eDKpV#z!1e_`7 z?bz6>lwm#$_&f0q?~YxLR!2TMga=)p~VtdOrcO@B_)JZs9Pg`EWTs+HJ z{$@!%cP*noE#u+yk+rYDp1+OI7FUHdd5jEezwF5a)rkQZ3*$^B`ch0~_%?Wy1MR6t zmlj3;7a8u>lAYS7UWPqOtNaO|v{nAJBmnAEv^ED8j>|@tNruRp{ESw4klXZJohW-{WFaC!);`}QdypJ4;hF#+ z8=_#-lh?sm7P(ebRAf19`^8bFv+lXJXql#p%O~+N!jDgY4vBjQ^I0&ce%bPwXw>WZ z>MDJ#xak}z$$2cKNrd~~Fmm%5{P6{~#^K<^BB1;*qSOsxWE$ynUz*z6ZC486tGT@= z(19rRKp3y*!<#DlgBg7%yjS0}BPWCSVk8Sta=S zW*YYMjQF;+l!6W5d&{ROgZ2$ct105QU*xr$J8qw(k0R!t7Gl&;L@WmKK-85>#t)x$ z1k->mU;3bzKU=rJ-$A0GWirZcHRXYpk~3Ibw&K`C5I|k59c4Y3y&_Cfppd>)N`77m z@nR0?YENZ#v&Jr+76nU!@)ZB8f;8R;06?*)<9*#e9q)7a4^in1;#dFaX>pkOr2*yf zn5pn7p0*sk(Zi245lI>$r3^R9EnE2;c5g@vyY{hHY!BP2J9yYSprFFfu%Gbff z4d&|J!gTfzx4XB%R zgrx(>T`Y+dTwgU@&mSZzUD<>mwf(%x&R9>n1L|%l3~3}6%)%;OX0r%#3T7+JAEj!@ zy!~^RG(d$0sgkj6KtFosnY=&?CJ+bAFdbOOd*)w#FdG~mJa^IBj8vPnb9&WB%tw>x z=IEf-*evZF#=hG3(k%0IHLWMpK54-slWwyv(MBx%VRZ}jz6n*SChu_?wYeV4o{sPu z&+s>%^Zf~_{R@*NTOK#3$EACH!h@QYN2nnXE!;6|ZE4(~->rE(Q>;kyp46WhYVrK^ zw`ENPMvhpu;j4{M+*l9KT!9OgS%Xt@a4RSpKb23a39#q~Cv17%YY$<^kYzJU>s-DX zLOx_*r(mA$d)cK%bAxPPX8L2be%Hmm{@_#{qvrb79iz}mce5vRWlLgiVpw8)JPieG zHDmjyF7I)0PU3ti)JY;~c(_cVIp3VO^UL3H50T9W#CMveQ3>!?#v2g&Qw&L*iKPk4C)JHSfnR@BUnR;~W}X{S6?yKpjcm zwAQzo`zoIP!t3&QiFc`q+V65<>EYt7_ch(afb7a?>hyFZLtBtfb%ZSb&HInVee=s@TEZp7g_z0vPh3;fPT7a^RdD%Mv(<=~{&Tjf$(fLk#T!|=O&-V{l`ACU166O(7NQH2 zGor-es?E((0kxd8dYKTcYbe*S0CWU1j@9-a^`gge|Bhxq>iw$FU+dbUhjs%YyCvX3 zNZ33sd14~$`;o3p9R0j~K%yu_S@afBj6(eu6P-v6lQi&?7w)9^HBg^>G#lm-wW;@A z1(oAz+-#Ui)%sDwBk6nK>H-71lF?$CI@K1++34gZ|B$~kcj}G~{L&m_wZ=DQ+pYNq zKWRny>S~tb(mG%>moMwfyshs3*w zrWYTj=isZI6f+}r=BhjxN|x_hAdUMA{b&?(vxRWbT~u|k<5Vn&68Wz52?O2=8f@M! z)gM;qq@N7mX=Qn@keLbKg3a#;Ac)Xx>yA-5$(gqwlw)hmZ#D6=P2(~g^x!4VYVA;a z!xo6{hc%+vY1^1hZp~c&Gga#?`YfcGnbc9}2qLLMRcg!g!c4ZWD;jyUGPs-^$JA#2 zSbq#S!5SDUT_0&(fP_f;&63&Xjrc|0u5|_$>e*KH_Qcx5hmS0sHhn>hocPPe8S5FP z<$glWF8L|Vk0JM{c5W&zKU1eHLMl|pE$%6gOZm6@odNjT=cFh3re#+Wt>J=sVOFz6c zaEW@)16`xnTYnsk!O(k~;U+)L%;uezWN=BLxO}s@$!xTpKZ)h>Gt83=Dc_1GXDsF|(gUr1pM&h)+dlG{rK`^de}8qH^O zq*KbabFYAS4AXYPDO#;r2#!m3KAc z5|@Au6Mx@4BJVfTAVP4jB%oP-#T39}H^n~*z>+@|JR_v zW5s&{i!8kaq_tFkqFCbDDy4Cg40Zs67C;BJt66A%Hzn1sm34|y2SHg1^%u~ z7+gZt%k|=Na>KOAYmk^>W`gzi-tYnQ(L+9PlB|_qKqBEV`{)mU<{wLLT=h zL@vcJh{+LAW_`XEU~0R6i@x63kj?@kEX*^=LT}`K zup9Uw+h5lN_XHB-efvWGyp`{fNo=1>6AbFAsHEY{3O~w!sU`mZxW~U@)cx0 zFIL4t9Oa0^JT`L*>5!N8fM_C5A&;T9kYG<7=8Z>8&a-SSTz|zcjo`B6YU2K}=E+WJ zAMeC_Htij{4S|*)_j3_|w8iUAG}1k@eZ7^a%isZNY2|tDXBTuLT@t1xEHrHV&bdaN zCk#^(TRzT7hv+0*Hr&>+`XA?oy^E7bJbsw&=IsTUNQP)}js2pn=VLQz+gy`}A<0*H zi-gZ*AV>tDRY+TAK1&8)D~#YBZ!l#fXVNt;G1D#QeTv1p|9T_xmP;uVe`+i&``!Jf z`WRu!p!}>by}K?x7wZv~$UC%?e_)sJ2RqoJ(K7f*K2*m?)48C2DL1VfJ~oVlyz1M=9DguOwPy6W+&UA zvSfmdA}7?~SMmB?&YK5<884%fqw23uj8nwm(I&UJ%ZIQ2kPF`hJxcNdSgWsb*fVYc zE#@x7sN}S(0>4=Q;+PZ>rA>k@MQ*_Qd=lM-dxE221^yNoGtFWHc5Mb;Uz3T<7P1$o z42c(doQrII4_=H91nNg6>#?%-XXC1HBN?DT7d%Q^_9&yMhz@NeIZ5xMNv>}RMoeQk zwsfb4nmyv$Uzx9F%ztQBKlO9Q;CG%$|4So$LN3fIB(0hBNy?jw?Y&UJpnS@yrY-4$ z?Sfzq@*V-p7E|H4V$DR5Kn?_N3KDW=y@WnfFS{%>!sA=5=ftG8o+?C8e|suxzN@2u zb!+lT5(VqK9}=`q@WZFwucN?3NidxXs$}~i&X>6v=JZvd!E>>L!MXn6#hc8HFo%YT zo?5fI8H2ogC*w8wR7i*kXd!ccwfOGKKGcY9c-es~YyX*Dpth?M7-_WLq8zY|`kq@or z)xG`Q#<*nAX>OZFLBiTv;CPaT;`RO`c+$8mrk-h|ho#Wo2AKe1t?KdgZsj_1~fh{%3#k$o3WTFyt5$C70T=oP!r&JRe3vY2&-0 z7;B+0#x;p2mV^KgJ6eU9j`RC7Fn>$pX76esqn8 z2;Vv2RLn%g(?|ePW++alQlCub2%bsYAX8S{9+rztCP3NoEKirn$4UGy6k4FI`^&6b zXnRW6Uq!u>3y_b_VI^0dmfc1v#NUN5Q6~|JNSK3XR~pv|MfWp97vPotLNkX329^`>>~QlqcoQKY z1nrX%&4cQ2J9Ab$VTMPARoi7{WdE zgJq+p$1n>M%sb%o%@LTMH{gr+W=C_efvWmiR8<0gwK49!%BwIqO)lF@d}?6$M;y(-0%2qU`bSs}5#%WN7`B>eq ze8WUJjoHaWeicVo8gXS^g8<6-81t$|LBu_NTVDACv!!XgFola{AE7XtzUs`_Z>wFr zNbS(3>bc%x6Zq%3bmq!0lc(8$gxW|fxT2NJYb^!Q4SQLM;PUekgn2|eHNxEi0#5|V zrXIGvrZ?+=&n_#rr~vu+rfs%|o1o?G)YP|F@>If?-G9fG!Ao-|lbg6ZE@CZ)HRlwq z)wcif(c3JV;}S+G20^Z}GsUQuPiHiJp(ShtM9xPD?k&1d%8IhS zY_L^_cQ3CN82#n|%4f*HN((VXG39)G&cK75ywpcRBCKg%Eme0XW=2d^$;hG~nCtI2 zx}kj^9KQ)~As~{YxiBx&r3!P;t-^=@4H~FdJQ=-!3{S4vzMe&O4#^uOO&^M5? z3h4H?y-2NW8pWM+QXAcp0cqnV)5A7qnx}U~E%FYNw(OH(#0XAQgSg<30G()JIO;D; zrqVC&Uo?*9ZmC&Jh~J`xK5s1iM92E-efZ!kO(5BG5BT( z6!2y&v2%J|)kY^O(6RYx2+m_&EP%N07qvIO@}-U-=ZHg+p+I?R_Al^@d07LDuWS(t zn0Y+m@pKaZTtK8eaCrPxsxNZAY1Cr6Epq+W zuRg~p{yyJCcnJrjJuI1A0!srBhF-I`->R7}A2^j+A=6`Y=Vs+qcU$V<-i z{f4Ew|B95BolE;8rnNCL%_CI%aVVbsW5blbh*eO==Lk_rV`cxpV;AL+?G+TV) z&h%7+xcJ8$H}P?vf(uBadTasWU&MxAbe1*tFT08VIQ>&11oRdC>TNX=GZ_)i76%7( z2M??84Q!%7pA9?j#Xl2jcl&XY-1%b{q*;%k1~#xSvnjfjRtW{BrD0B`fji@&7gAn> zRoxTRRiAbK|DUGte`*bMb=FPU5-1$T%UxiQsq~_@j?#};6#WM12oTV01o3GURnWEd zUug&+-~L!EAI?0vu@V3QZAGIR+S!3sL_i|^>C}LRBnah=n9`9rp!p7b27w_U5OAsh z2pEzq~_$1&#O@Oi`f`?+m!!tpCY)tN5$wcEhk-!ymx6ok0t2(ZJ!=_bZ z(UpKCxE4TjciUWQS?qBcBVa9gv48+rmLUpDtji||-2a2ifG%tBzw($%-4*3T_A&GRx)E(iGhcytcz80=I4v2 zCNhBa3~BJ4G%@eL{6pSN^7j3FScnSI8%_M>zPsD6caGMCQ766EzHMKgj)y>k$Q@KF za4Zit(?aHZghM|}hVm%jr+u6j|Kk5HB|B`{fKAaKI9x&*h=TP43<}O=I5Q^r0&7Y0 zU@efRgB48MV#24D)5k3doX!Cpu^|xxii%PV=;O304*;E>f1~VWPX;kvC2k6!Y4^4) zlsjyzj2L=ZY`=NBc^#xbp3_Xlt0FU~;kP&p0Ry62fSdNwqDtDe;rT8b47hJ3Q>)qF zuJ8?-(O2Ga?m^r9vaKDay^P2W9K#zcsD5Z96zECh+K9aG9gcfmehQ1#^bK^j&aX=e z-rCWLqg@Phr%_LQMpc64s(@0`AnjVnogbLZ&n^G`-?|+}j2GU~30n`cny}K}9AEU4 zs=X1Vwo(1wyGWYIQ=+S^k&_20N@BMu_$5#|*s$~l1vnhU1x$-M#iO;}Vbw#GoZ3K5 zms>Q!GQ^>e%Kqx91u8*Nbo)+dQ2$KQ!j{S6fK&hcn9Q)awx*=#PyIw2))OC6Bij_i z&$d7Ck-YRpzK3cuA+MEqwrI+e0A`O}wb51p*^QMN$qWP{fx{E| zovqja&n3^ebq(+MCwE=h%+)AIe!FjpCiEA#qgq8iNVQ8Ym7QHi(_tkqpCjja z$W-Z=(fnCmM+YFW&vYsn&uR48%eOMgrI||Aj#gnPTnX%t2Gkm!X>E(yH(hS4)#3Nr z+HD8%qdud}E)}uARvq+z`4`#9{mOt7}!(W@hg*Yu6GYwlwijH3FK#)WHsFc)MOO9NTVoyUHs^zw}rjTg)G54hr?nXzQ zhSTW4@$Yi_bly05l0Rrq<9YfQUx8uoxbNGc_{L+r<)hCs%|Re(Lb^Ax8Umr&7*W*a z?F=2KbOU4PWhTed{d+5v3%v>zA?}6NuR@+CrfFBFm0IPY@MM9uwXj^!Y4Gjka#lP_ zSst$zXP%?X!qG}2;zg1^Y){K-sK?Bh>5_R+d5M?cX{sxW5;jrL{~hXDM{7+ao61Qc z!`8|?b2HI6HE=|$nPpSgQIc-NUBVlrMXNYc9L3p^CtJ`_TR}is=aN((V}uQK5ETBV zkdVq7Ji<#(S1Ku%;L3A|+%ExZm(n(d#>igw;M4&UL)#{q6rN1Qi}@bZlAp+Ugcq;0 z1lT&N724)qhXnb3

Ekh6lQmbqVMl>5)E7bG}gtee$SyuF~N(QL#=)K;?6z0cAK93+Fhey*gQA9 zM?q{{E3p!F5`K^1?$N z6wPCx>728P`j3LzLINg^Ir5@r*OCI#?P-6GiebULdSZU_hG8eTEE~>tOE*t`{Ip-1s3GOt+lIjZwqM6{6jU;zYEA z`iW*_OWDyASOA)Tm*L%vhY`68^+zFcxBUTdiCLZ|1|l}EbXE$x zY$q+efJabW924uAhE7-R8>Nfv%6~F-x(yk=N`))ljSZZqh2FVXA=jd##5JQrfCoj8 z)OfF&K9EWp%l788Rz_P^>)dwuHpfif!(8X{L$_BX19=9hAWmBSdjL_GAD^{V^T2CQn~C!i zAr~G{P~Uxd;bo|$yLGRgcZqByt_?-Rm(Wl8vID>X{udcPBVcmJ$FERx5;>&g`N8IU z>FnzF9{#BU%0OI+Xu!>Zg+sExU8`oTiq5P5!HhY(PUp(JgW`xtwR7BCiv8>g7NoN% z)K&d&dEpal_dc&J<;Y1EQtCEu!~P!%@ybkNGq5ft0KEu6^gzTx*C@+(e4$l{--d3HgMNwPE$JGvWtkZ~r zS_z%}*9SH~B1dIj{iwh~5_kAifld}E+&jX5QI(gzmPGmkXSS1+FU5xQ|6?ZoSs}jA zH+St8%9QRL@Bf3%C<%@W*bMvPfsDs$^#9=(JjI1$}La)sTvT#c0i;9!n0?L0*N_-MYQ;AMO^Su*nH-_dhyc z{wFMccyTKF&@Jps?sFBtTI-$9H>~s1a$AqwEv{L!%w5!HT-zpYyC+*<^KyS7J|4hB zB^2F>4N*KKd6uJ#=A}?p^+xm|B*JAqOOh9}b#3n^GPIX*twE>P< z6}R9GPiPrOnkqylQ-D?8f3+)frMIRZ=~ByN+x)q=VVI#fq<&X@#Lg}ZM$xkb62Ws#QfT|}Qwgq}v&g-~|5Mx^0Jlgv@{x)jO!={-8_9=+I{dFg zVKhUN$^R735-z?u(3DWTHB=7izYCE1-<-gmU*-^APpsMr_T)GktYPtL!nse%*nbLt zud4&TZ|~*fQ=gSp`+TzE-&e4W!#WrvV53Fc^jydj;f!jM@bg@Pg}$lCi%Wx>Q>=xU zyNah9PP)uv?Tm6eRTV1F$Y&yGHM_olz#aEXO5B$x)>b7}OQbJsv%2B-k-jkizH;D4 zdjFu60Fzo1hdJ<|)szt7Z@WiwJJ}T~!;cmu^Ohs!E6-iMjJL`9v`%NpGctw^_D z$q>agE-Rb-@O632%lJnjy~wD&kwVH~GSm6Xm!8a7EoKj~83GMw?py=D7%kO5arxIj zNO7$9wo(pM@ouA-OCXbyr#XYYC1v`R(KyY5)2RS!#zM`4rJ=#Rx9=Boas9@E4~iM8 z8=Yj`ky_4~T*@<&em=q%kB$??&b%xKLS1(kdf9c?QSFlZx=`1@Vxd|H-zf{)nM^rtv zN;c)(Kd{l8{v1N1C?|`i+0H)lf|DVytTFOSZC)hA8a0#a?F@W#QJg=aoIS0Ehv=>a@>F3VnWdK=eK9lR2}meNq&P@Fv(GUJq#?eDe>kta7hZ(o5fm@KtVN-mNEE3)LNKn4ZJVY$$wCepSFzWghVIPotP7D_v) zu+0p1MgHoAK{@+&gYmYvd7<~CzoOgYOk2vn4mK5}Z{8r(@iYH2jx!R&Tu78u?(qC7 z*5X}(hkJCBCvT)5m$qQjU+178#CJg9LlM)}JQAbG;T#!=RbR{m7CYs3Wch6wue(Lq zF4&|!Ca){J%GL^n05tPUA`+k1Y@_KZmU8&Lb6c$|yPgl=lF)ELB+XRE+vE(3Dts|P zJGPstnBbk`Y~0xz9^l_c0Q&8qo;YXDSa-=W!~Kqb4pM?vCs@p(*Csfkg@|-!RLeP~E3iX1D zUl`|8^A3s@KGK@@FqZC^q8&dWIYmMA=OG$g*@1&%9mzckj^3bICk_fHpz~Z4E3wa83sfSB}$hrWgFF=t=kJ~NYjv3}%Y-O+l4J85!_dMy-u^tXZ6A@j4jL03^RnNSQ2SwhNUcpN;(r)x z_Sr$~eJN(^zU(VEn!hX;FJ`Or?9jZ8Oj+xsE0)tP z*ikvHIe+m#=zc%ekpZm}6vPt9jw{H{H;^4;P)^+7wO%X@AoT?LYg7YB))KOD!7tq% ziM$*!lyx2`C1509iNlNtqwK}#N+%LRv1}ho98xR#l#!lT6d0ray?w{(4?kk5uUVNf zVY`XOeY2WstC+8ET+R4!F(Iz=6w52gQHb8~OpZ(&V_i@-7bL6&5`GLSh*-l{0aOrU zS+S%E8-hF)*|EJWfw~jOy&gwO{yjD3&#KVinw8$plFxJ16Sj{0)*K6Nxnt9_W2UMB zC9^UP?kXjt%?}_0kGTSUWoYaSRQZ|f9LFz82U)SsRo}O)=wttK+G!BN82Q59V~Iag zTM$u`Ut8d5cr?v#WLPpi=4_ZVJ?7Pl38sC(x|hpvul6cd@QUE*4dM1)Lv)Ri)fyhA zU4m4Y+xDRnhuFKBxIbYaZMk=(Tw{V(oMY<@2!pXQ^31)kUgoc;KjTLkv6rqo>C_Jg zChplDGTIlvrJ_Q5?b>}VPoI9CIT5hCm2{;4Gb7)wU&psm9XOjJM*3qy3%$SLUZtj< zs1jW7$G+)d?$euGkI`+#V%Ob>*?)awVd<~G5M`Ah^a*bx_SAd#*BNPfKjW@s@6v=$ zzFoTc;h}qe*KRnPUihxe?_zfXn3E1zCz@DW(1aCKjcvaEq+%33$2b0)xCL*neYDs2 z&dIV?7X$U}CH<8!Rfpk8<%0B@0Rrx%svY~&xfH4~Ya%2S>SK`{X<0AhZt;TI>mz@M zE`nF8+3`P+4>`nir*@!BZDGPQlxV!A_jkk*cDr`NZ^9kaw`b~0xY`aDJaF`!S%J!Y`*kZy=lt#JnJ$0=eewt zb@*SCpICgA5J^Y`)JD~%2IOB)nts87JYzugv&@zrXP5U$E~K(@K1X*od5lpJARoo4 zJS!k((76F!7r^FIqgBZ|J=WXZ(t$V*rC}8wg(gW{RhGq-$%)2_N~`WG^S+VVkZgQ5 zt6;c(K^luQx$XZ;*D#=W^7qLYpA!jfUHYl_;Y)Rmhm6z1XZEO<>9&|A<|z{~GSLZ= z#Vj+9n5nqv+X2|Y#Q-P)d-eKJ$8!NDUnp6x-?L$V>K=^#JtOys05TEFCk?_@B3}Na zuiE2lD{(wqMukumLII8iCW0^h)MW!e+%QHT;pBSW>gKR#Gy$hk9pE*aaBUK*)0Moh zPY7Xpl*=8^LVc1t8>8)A{TP9%0|9TVk7qdN47rNi%0ZZt#i1ddGsNnetqq2gsj&^u z)1|n|d(c;olv2OFOLM6qMCwkvS)RK(4cS$nSM1hob88E%Wk?*Fcvt$t3Iy}*sI!aP z)rdr9h)_Q)kGOZAMT0oK)AciNFzfVZL9LlDMP99uuXX;QJTQowE|OF|;sT}m-NM|T z^4mNNNPQ?Q*HcK4_{XSf>|BNGBN_L>aH(pd8}H^DD=E84-OU2GsUh!Kj5g|e&ZwHn zLQ1I=VbNR@{>b69W~R@2tq$F_thv|YCDplHtaHUPg2pcF2=bOAOr0Quh30l#br22y zfrRuL>)HaHX~)`vxf+Gqf?Y6&FbqTneNclLQD*-(LNYW@jDOhH{aUG+NKv3#YEmn- zUlaE9d#c@Jxj`-WzTafIX^WJDp<>EIjuQ6Yj=LYmxunK-I81!C^d9BnJgTOV;VqKf z%@r(>bXs%J@-@sK)bgEH2UD5uJ$ib+nC^<&^O(++jEJW^h-N2}YDVm*fmRHlyA*3b z;V3Sya`t5IW_~_JuQNA*p)r{;P!x zQ@I(c)kb=qa8&oa7%+#;o5J4J9(B4Ry{|V=W-btvg%h>Wq0@W z8pu6u#gU!+NMj&}tf1BrW+w&*b267jiuD5{SM8e?%3~?gJCt_m>f7j6+e-E8rBUy< zEu^kuo|h-VweLa`%IF~Td1S3UP@hz5#YrPZL2sR-tYnl@Gvq3Dd6w!(VIVkR*`Oq1 zF(>jV>1plVFEZpq%NfS)+C}&)R_FG^s}=H8VQV+DfAk}V$KpCiaV)d=i)N?fH>Nm$9^<`g8{&I9 zct+&t;6y1M!Q4fn$!*na@=je%BhOtNOdTZbRh^^M~Mb*WC z?Jh(_q6b~3)K+Fhw^=utrd8spb6S*J%iImYgl(+JtouH?F~l7%c{#a9)r#fedEFqI z_VjVQ;kbO3rA4l%^7Nt--564g;9|VjNWT8()S0FAd<8cA`{7UbrqBN<0#j<)Xgt^@ zuI~&veDTEm3g49`QQ2Hsf!5pv*OaP%#~5Z(BSUel+ff;DtT}0LWSp zsW}<|gZ*7Z`vm~_Bfvp0-UucpfG!AJ0Z!%sOal$}4gnU-=32zq}6IhcJRoxs;lGr8oS<5?acvd6IsqTD$z!a|yip z+p>SiQ*u}TPaAU*1vhPp0s73^p88+P;QZz?An6{ksQB#{ z?_g@*ixDMY;cG}300iXyJsMtE3glpCe{cy{&;tmU2EBIy_wm8WM%$VX8lP^Mm6Vjc zfRw%kz`1_c&wq2$3p=1XwdSMepaTU1Lu&7hUGCp%Pc(WPNSvQtN{8M(D05wK_@d4G zHlfAfrorboEjm81=w7^FO?YniNq={A&-Cwu%yb7L{zbLT%^B}|gG8?u-W${9a51;dMPU`l3H0^)C!Wakgj{}}!+N}ozi&RLmxypuhX9xw070rq8KT0~ zf<)jM-!)!#&pH z-el1iO#doyDp2f)p2KJAWeZMg(mxBTCj=llSedtu6(e@mhU&`qqQT<;ANvgm8k^LnU3)`-KhT$gYkvY*sA-iANnGC6&p zZEP+F)y?2RtW~O3?8=cSJR~mI1wAjj;zGxNXdX4+R%l7}2>AmgENBfSyLc*=Pl&9O zq$CMZppJ{=!jAZ>Bqq*7EXD@snT(tb&|3bJ(Rgq6wJ!E572HRN3&G%T8_KjxBeq!i z92F`HwE0(@mfo=*t^Vv! z_e`xI@eQ=l4*))t?5F8F&fW|yOtEl`gXrU&XFzAr@G}%+^O~Qo7%_#9LJw6OtDTGj z?IJ5G4083UI>HV@yyXxOA1s@n&YuiqEK$ddF^QTt8^vaj*cdUT495~bR2Ap=BXp2x zd?WyW`K_acU#TN#KM8xW>1@Gw-zYE`Tw#(vx0cwyWFW?%HrZZqBed<6aTbeK6VX-| z4?byV$69}Ki^h{Sj-^MafBbwxiek-*2l}>blu>aEHgM1n9Vj-0s*ABJh^WB@h%c1j z0vDuP@)>yI+a7QqPR61K`#`hK&1D&!=sYC$mRN=mHk%%~&{m<^UY~B4A|4PQ8QH^t z*gsMe{|W>!reCmbV4aSSp~%OhOBI07`pU%$&Ao;(>_rmzMM}Z#Tf9~#u;o?u8`f{Y z$6FCagXrG)<4H}2TV`7J6*DMxe#-_Papjy~P0{R9JErC-gk; zSSJL)jnhiAfGp$D6G2|Eit?I^la@b#Zdkc3MIMo*s1H_T75k?X zBT1RJ2-eW~BN&m-Q4X(St+GS^_-`HLR$Jy8#tAS&{~hj$IX4T{>HD8`O!2A!-p3&! zC!+K1V|>R=-j_q}gTZ*JeZ)u^X{G(^YzlLDzKtC!+kp*X_P9#)H!1JUpAX0VIH-ET zWO%JV;;i*(NPG){55)#K{f?MY71^vf-u{v02t8jdN9m#Qfkx$_;7G@Bd5IVq;D6;k zXDwx#s$IGIEIQcF(&MWdV3Vdv?6D$21d%A*oaHz)%g>FiQB2fU2#4aqBcT00BAe9M zbm$-fG;6^ndib<1$8#bI&x1v#1Rx_x%71hsifQY3MNoz*J3PN?1b9|jWvRE*rL_5xu;8Dh1 zq!Qspv$)XNoTv^uEgyZr##uk5e+kby2^Zqg_ie4Bsh!#Wj7;#cT%>6un`AZ}*AiOk za0$A`(y!TQH9*cNFd> gYeU%^K;jiakCWj`fHY&fB+q9N_e<9K(9SNdO;7V5W?k zBHGcnCxnCu9r0HMnmr(*<&MuSKY>4T_7`p-eAhBHC^4-|7vQJ z0s83?5yP}Pp2P)7>0aNWs+{-?gdkLW9Uz*w>dVt*qju4ebt0Z|`?*VFS@h#Q*`S<|$;ERZDF~%z%M6eL`dVf;{ z#=#8Fi&N{F7gfekvV`2uc@pFp|1~SZ64Uq|dc`?sOfJ?4C8Y?&ahdY(l_LYf2(>>T zoXnX6D70`P;B!ZD0Iu!*H(Ee}ix`W)78>M122j^>dw^h^fEGHd=L)B%{nE}k+gBJT ziB5@Nz#1gaB7_ZcCp?>3bg5_ON|h0wb(M=aOl%YW#jeGS5R7og+*V%iu>Rcn2xeEJ z3)HTSkWFqHqSpI<>GKO5hfs!8-6l7bjbVSeD6rE`Hvg5@mEzb|9TOHy`RP7Ho3@k$ zCWqyg1q>~_o2SU)Ba!zO5r(7Am4wJumN+wE|HDsA)Cn^g>H&=K0$k06z)bs@nj>HM z#rwWF_pJy9aw{qOxLhkdHfZ5|p4O5nFYI*a>$0cM==p~5y9ae2XUDthJsnp3N6@_f zP%pGihnS|sDO*Pzm~&>l8tDZ zJ3v&_xI~U}$R7O-!+YJ5M#U(aXK#}pFYP0jCR3~V!gjj;FsJDSM0;PW=&AHR)0ylg z9uefHe$@$tdRk;JR)VRVPAC)1Zt^Cv0}5tNux_4 z#*b#Zy^BEoiVa<(S~-t!BzOH?t9Xw-z+d-KMJUKDK3C4leoulWJ-L7oh9y)zUAuMg4+2x#6{A|dON;jjYtV3YkLCm{ zOWXGaY%LgAF^~^-Wv2v>Lv2^-z)1N^D7uD)`udJf<^FKuv&m}?3J9@WgmULzEVzPb zV+3L3=$fFSJvKSc_P)MqORyk1$IQ`O6pv-i*D_M=LcVYlzLS@t^buKGjm1m`RVe|i z^~;i^{J*Pd(U5Q8B@^O|A`;4@Bdui>^`!USmeKsRbd8tNI@nCAB|lJWNGpQ9;(g^$3E$G zZ@zWeXBe+cSuk*52(q@)9Bj9T2)x1voz@7r6SXs=jh|f`RRL-#<@Y`h&cVh661q!a2(#h!2HJ;;sb$eLG{KL56zWLZ=_{B*_ zCGE>NM=_SJkk4fHh9P0ZO*i;e#2|bGfiZ$V1ETcpLaHS6rz3GM12XF|?Y1K%@7Mp zeAe9zzcc4ZP;JlutF%Gr`DSRU6V76|S)L2YgaCEy0J=t#CX=}H*$0cLG-8m8JifUS z=HdA@qL~f_yTh&+YpBSwUKp+=>pU0SL*I5i5jCvL=d!r$Y;B-VbiOD&6TtxEWmYnd z$)_>|g$;rhIi-W)J-SP~D5)n`S&W3V$(Bwx<@+=mm$~-3jqBb+0x^zh$6eX^|6O6= zT^q_R?FbXdDt%CMBl78;IjL=M$aH8uXeE5wqMRrD%I-%&QLSsAZVU^wr+~D+vgzyR zxo#W%Rj<=~CiU7eplzAszf)AYjmOY1!i{i?D3iA;3y%=w!jh3vi74j8eQ&zlP_eLb zNzgUtL(Z~XC`=;w2*!wY?*lMoGGOqcHC95v;i#HNy6Gh*`iKeiJiv#K*NirU1h&f( z*Y~r+$xmkdQXMXxhbzt@`QvsrOGRkRkyv!g>U4c3VxdPk+b6Ma6&WhwuQyM#E7p2& zHg?%?Fdht3 zuZ^Y5Eu>g8D?PSc4XhIt=n?V+NCB%?{Br|uf~#o1OtHP%{2unZe0?)S4{Oe6o9-la zyDHOfliEGLp()}Mg=#$?`=0e@c_Nscz}g7K0RWAFaZzQEViy}N}!GPb0E&a0(e*_9c^!{Ro=H0mjh;L+C zl8;2x)28)>QvoS;ofh&jcgOqukla){aE;y}&oe-o&%bKj2Px2=iz ziaC!s6A0CWfLyO1%*koj;TV4NdRS)XxVE;M&E)&S8UwQB!9 z3>!uTp3VKaex(;c->TbJp7K)n#m>#+^FnF~sF#5P~SDX`3qzR)u0vQ>mv_XX>i)Yy0iOzfw(<=@8$<=@G4@$Q1QlGwZMfc0aWo zpGlJwk}_>E`p6r7vC?UMy*5RcZEv^~(GR!GO47`*GvnhMH{+YV^FaOki@Uxr!e%-% zQ57OwZzyH69(F-RT&zCQV?w`~P=Ox6%Gh|Sja0D@T6iE4bq{M-V_p&$(lK`ra$Eoe z7%~2sACTbkrz*bIz3_V7Ro3*I%Xl1`WDlj>8RbCN_}m-_24S`|{l6!ECT2dY!beV< zcuY1!)ThsL>%lP9Q7LupZdYxLK(?L8nR*GY9e^5EIV6fx|R6mmMocT>m!z+$eA zkbkR5?{^qI{G}s(Vt_l)`0v_RJ~RQ`P*M zrbWRY@fbq&c?a!5GMAUy8KhMyvmd)n04frpHD}mdfLB0f#fkV~8i(PE1RINo8!QVL zLX2TsyYI*4ZPA0%OfWrFEH3mu0Ie)=%FGzy2F-ue=o#875$h%7fm34Q`=5?E9+vq) zWY)2K)=30qC=4LTA`atVw^)L5DSdp5=#`1ys%?f`S=b^cvk6M4JoQ@MZ)?HD{JNu= z&6H$;ga}X2cm!-%`&P$wzVtioqe%@&DGdllk z{1CWvPMJH7XpmDFNJ&ZsaNp>VAj#uf`FsyLxDKHfUxCBQ*o{=oD1)k0=l8(!4X6Au z6o=HgoeJYg=TRxd&)$%&X0y~5y~KM?$7P8^EOs_kZzrJ0v9x3%XVR8gNo*l7w^f_u z2d_y&JO=4-emBi|8ILzRhs$XARP4gDRX)v zdMFxF)tsiGpXC${c!o7mA_qXgH)eQ1pa?Y>cmfZAhwl(NAOPzJI6ef%NCx&KMnIth z;7DK15$AXafQ{}gEc8d)GZAuNFOQI7GwIx9l=Kh__`mzWqPKjN+rrfqgoT83?M+{_ z5Ag!Pq8fLUY0+4X!Dwp=sR72w1sMPwd;|!!;(pdpP%h_7JtNtn3#iGL$}8% z{0e8w_Y(lz^nlCRl3yi5L@t@E!Zx1JU+x#w?yR0V>5a-O&Egx8zrRT3FARv2DCFR< zA7fQ>B>QiaP7f6wd6<*()mu+c(_bk7K2k}i@Ke2~ioZ>b%LtL10|YpG=H(PQ z)y`oe>c}{dTY(0*b zZC7@y|4>2zs%#g5pW+m|l59Tj_vF13fXE`cA2}_(FGu0;e%`kmAV%Jd(!UGWF3P9E z;LgYrvu3;X!Nmbiu)Osp%K3{n)1}lmHeLDZ!@^BJEMNnR_|(}yE){dG6}fjxeKoTP zksL1xD2cyr&9?-4Lj;RrKOkEH|oXDGu7C z=rT%`)|bujMr!U203eS9xOWx`7TBa7JOF_pXMfj^aL@z&HGlw6t?F&9CKj0gcdPTC dkq}x(w`fsO-l7%4zSVc%z~$ARmdTpG{eRL%Oospf literal 27901 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 X2zevpAKfy$KmUO%Yb%v2TD|-~ThS|a diff --git a/en/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png b/en/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png index 705e0ef079d1418019c8fc6971458c97a96c6374..46e03649df960b8d9018793b515925ccac70439c 100644 GIT binary patch literal 17481 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 IG5`Gk08-5n@Bjb+ literal 17379 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 diff --git a/en/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png b/en/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png index 2bf435fd8bbc3526abf06b5fc92f316ba47cc3e4..0efa18000da314a42af5e2afc9fd5cab292fccbd 100644 GIT binary patch literal 27878 zcmd3NWmgn-%SpK2>`$W3Nk99 z&(F_KPfw4q;}Lc|KERHLr-z4!yN8GS`=|T+`@8$6ySvA`ySv-F$J_hcmvZw`E^lwH zt{<4i*;=7S^|K zW_A}>Hg7gyWgS*te%9937S}FTS68RjCs$ThmY0_omp7J{mKGM*7Z(>778d4LuIE;+ zXBJQA=jSJ859j9QW@l$-U}gHHOifKqPEJltOpK3@53HXJuK(*?8faT+ZGAafhNn(O z$0kNbr-nx+hKGm$4NVRX4*vW1uX1L)db+A;r0Undoa}$u+5di~4<7XmjP>{T_x1Jl z_V)Jl^mKQ3cXf4jc6N4jbhNj(x3#skwzjskw6r!g)ps4&v>#WuA2&6(G&VLiG&I!L z*XMTbl{Ow`_GhGaWyG{+1vdtLt@r<1J6c;?TT@e0U0q#ORaIG0QC?nNR#sM8T3S+4 zQe0eIR8&+@P>^4JkXzW8mzS56I}=nI^!xYk+}vFE%0A=Lbx7`h+^_BIUxg9rOF20? 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

+
Reviewer: krahets diff --git a/en/sitemap.xml.gz b/en/sitemap.xml.gz index d5d3e5fb4135d0495e1c148e0912359777dd88d1..5a0c07fba897146b823bbd28b14aa4205544fc54 100644 GIT binary patch delta 15 Wcmeys{(+rMzMF$XWX?vmSIht^2?YZH delta 15 Wcmeys{(+rMzMF&NK
  • 16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5
  • 16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c
  • 16.3 \u00a0 \u672f\u8bed\u8868
  • "},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c","text":"

    \u7531\u4e8e\u7b14\u8005\u80fd\u529b\u6709\u9650\uff0c\u4e66\u4e2d\u96be\u514d\u5b58\u5728\u4e00\u4e9b\u9057\u6f0f\u548c\u9519\u8bef\uff0c\u8bf7\u60a8\u8c05\u89e3\u3002\u5982\u679c\u60a8\u53d1\u73b0\u4e86\u7b14\u8bef\u3001\u94fe\u63a5\u5931\u6548\u3001\u5185\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u4e49\u3001\u89e3\u91ca\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7ed3\u6784\u4e0d\u5408\u7406\u7b49\u95ee\u9898\uff0c\u8bf7\u534f\u52a9\u6211\u4eec\u8fdb\u884c\u4fee\u6b63\uff0c\u4ee5\u7ed9\u8bfb\u8005\u63d0\u4f9b\u66f4\u4f18\u8d28\u7684\u5b66\u4e60\u8d44\u6e90\u3002

    \u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c06\u5728\u672c\u4e66\u4ed3\u5e93\u3001\u7f51\u9875\u7248\u548c PDF \u7248\u7684\u4e3b\u9875\u4e0a\u8fdb\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8c22\u4ed6\u4eec\u5bf9\u5f00\u6e90\u793e\u533a\u7684\u65e0\u79c1\u5949\u732e\u3002

    \u5f00\u6e90\u7684\u9b45\u529b

    \u7eb8\u8d28\u56fe\u4e66\u7684\u4e24\u6b21\u5370\u5237\u7684\u95f4\u9694\u65f6\u95f4\u5f80\u5f80\u8f83\u4e45\uff0c\u5185\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

    \u800c\u5728\u672c\u5f00\u6e90\u4e66\u4e2d\uff0c\u5185\u5bb9\u66f4\u8fed\u7684\u65f6\u95f4\u88ab\u7f29\u77ed\u81f3\u6570\u65e5\u751a\u81f3\u51e0\u4e2a\u5c0f\u65f6\u3002

    "},{"location":"chapter_appendix/contribution/#1","title":"1. \u00a0 \u5185\u5bb9\u5fae\u8c03","text":"

    \u5982\u56fe 16-3 \u6240\u793a\uff0c\u6bcf\u4e2a\u9875\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7f16\u8f91\u56fe\u6807\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u4fee\u6539\u6587\u672c\u6216\u4ee3\u7801\u3002

    1. \u70b9\u51fb\u201c\u7f16\u8f91\u56fe\u6807\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u4ed3\u5e93\u201d\u7684\u63d0\u793a\uff0c\u8bf7\u540c\u610f\u8be5\u64cd\u4f5c\u3002
    2. \u4fee\u6539 Markdown \u6e90\u6587\u4ef6\u5185\u5bb9\uff0c\u68c0\u67e5\u5185\u5bb9\u7684\u6b63\u786e\u6027\uff0c\u5e76\u5c3d\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7edf\u4e00\u3002
    3. \u5728\u9875\u9762\u5e95\u90e8\u586b\u5199\u4fee\u6539\u8bf4\u660e\uff0c\u7136\u540e\u70b9\u51fb\u201cPropose file change\u201d\u6309\u94ae\u3002\u9875\u9762\u8df3\u8f6c\u540e\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002

    \u56fe 16-3 \u00a0 \u9875\u9762\u7f16\u8f91\u6309\u952e

    \u56fe\u7247\u65e0\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u901a\u8fc7\u65b0\u5efa Issue \u6216\u8bc4\u8bba\u7559\u8a00\u6765\u63cf\u8ff0\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5c3d\u5feb\u91cd\u65b0\u7ed8\u5236\u5e76\u66ff\u6362\u56fe\u7247\u3002

    "},{"location":"chapter_appendix/contribution/#2","title":"2. \u00a0 \u5185\u5bb9\u521b\u4f5c","text":"

    \u5982\u679c\u60a8\u6709\u5174\u8da3\u53c2\u4e0e\u6b64\u5f00\u6e90\u9879\u76ee\uff0c\u5305\u62ec\u5c06\u4ee3\u7801\u7ffb\u8bd1\u6210\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u3001\u6269\u5c55\u6587\u7ae0\u5185\u5bb9\u7b49\uff0c\u90a3\u4e48\u9700\u8981\u5b9e\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

    1. \u767b\u5f55 GitHub \uff0c\u5c06\u672c\u4e66\u7684\u4ee3\u7801\u4ed3\u5e93 Fork \u5230\u4e2a\u4eba\u8d26\u53f7\u4e0b\u3002
    2. \u8fdb\u5165\u60a8\u7684 Fork \u4ed3\u5e93\u7f51\u9875\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c06\u4ed3\u5e93\u514b\u9686\u81f3\u672c\u5730\u3002
    3. \u5728\u672c\u5730\u8fdb\u884c\u5185\u5bb9\u521b\u4f5c\uff0c\u5e76\u8fdb\u884c\u5b8c\u6574\u6d4b\u8bd5\uff0c\u9a8c\u8bc1\u4ee3\u7801\u7684\u6b63\u786e\u6027\u3002
    4. \u5c06\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u540e Push \u81f3\u8fdc\u7a0b\u4ed3\u5e93\u3002
    5. \u5237\u65b0\u4ed3\u5e93\u7f51\u9875\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002
    "},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

    \u5728 hello-algo \u6839\u76ee\u5f55\u4e0b\uff0c\u6267\u884c\u4ee5\u4e0b Docker \u811a\u672c\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8bbf\u95ee\u672c\u9879\u76ee\uff1a

    docker-compose up -d\n

    \u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u5220\u9664\u90e8\u7f72\uff1a

    docker-compose down\n
    "},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88c5 IDE","text":"

    \u63a8\u8350\u4f7f\u7528\u5f00\u6e90\u3001\u8f7b\u91cf\u7684 VS Code \u4f5c\u4e3a\u672c\u5730\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09\u3002\u8bbf\u95ee VS Code \u5b98\u7f51\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u76f8\u5e94\u7248\u672c\u7684 VS Code \u8fdb\u884c\u4e0b\u8f7d\u548c\u5b89\u88c5\u3002

    \u56fe 16-1 \u00a0 \u4ece\u5b98\u7f51\u4e0b\u8f7d VS Code

    VS Code \u62e5\u6709\u5f3a\u5927\u7684\u6269\u5c55\u5305\u751f\u6001\u7cfb\u7edf\uff0c\u652f\u6301\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u7684\u8fd0\u884c\u548c\u8c03\u8bd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5b89\u88c5\u201cPython Extension Pack\u201d\u6269\u5c55\u5305\u4e4b\u540e\uff0c\u5373\u53ef\u8fdb\u884c Python \u4ee3\u7801\u8c03\u8bd5\u3002\u5b89\u88c5\u6b65\u9aa4\u5982\u56fe 16-2 \u6240\u793a\u3002

    \u56fe 16-2 \u00a0 \u5b89\u88c5 VS Code \u6269\u5c55\u5305

    "},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88c5\u8bed\u8a00\u73af\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88c5 Python Extension Pack \u3002
    3. \uff08\u53ef\u9009\uff09\u5728\u547d\u4ee4\u884c\u8f93\u5165 pip install black \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u73af\u5883","text":"
    1. Windows \u7cfb\u7edf\u9700\u8981\u5b89\u88c5 MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e26 Clang \uff0c\u65e0\u987b\u5b89\u88c5\u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88c5 C/C++ Extension Pack \u3002
    3. \uff08\u53ef\u9009\uff09\u6253\u5f00 Settings \u9875\u9762\uff0c\u641c\u7d22 Clang_format_fallback Style \u4ee3\u7801\u683c\u5f0f\u5316\u9009\u9879\uff0c\u8bbe\u7f6e\u4e3a { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
    "},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 OpenJDK\uff08\u7248\u672c\u9700\u6ee1\u8db3 > JDK 9\uff09\u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88c5 Extension Pack for Java \u3002
    "},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 .Net 8.0 \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88c5 C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
    3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88c5\u6559\u7a0b\uff09\u3002
    "},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 go \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88c5 Go \u3002
    3. \u6309\u5feb\u6377\u952e Ctrl + Shift + P \u547c\u51fa\u547d\u4ee4\u680f\uff0c\u8f93\u5165 go \uff0c\u9009\u62e9 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9009\u5e76\u5b89\u88c5\u5373\u53ef\u3002
    "},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Swift \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88c5 Swift for Visual Studio Code \u3002
    "},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Node.js \u3002
    2. \uff08\u53ef\u9009\uff09\u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 TypeScript \u73af\u5883","text":"
    1. \u540c JavaScript \u73af\u5883\u5b89\u88c5\u6b65\u9aa4\u3002
    2. \u5b89\u88c5 TypeScript Execute (tsx) \u3002
    3. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 typescript \uff0c\u5b89\u88c5 Pretty TypeScript Errors \u3002
    "},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 Dart \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Dart \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88c5 Dart \u3002
    "},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 Rust \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Rust \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88c5 rust-analyzer \u3002
    "},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u672f\u8bed\u8868","text":"

    \u8868 16-1 \u5217\u51fa\u4e86\u4e66\u4e2d\u51fa\u73b0\u7684\u91cd\u8981\u672f\u8bed\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\u3002

    • \u5efa\u8bae\u8bb0\u4f4f\u540d\u8bcd\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u9605\u8bfb\u82f1\u6587\u6587\u732e\u3002
    • \u90e8\u5206\u540d\u8bcd\u5728\u7b80\u4f53\u4e2d\u6587\u548c\u7e41\u4f53\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

    \u8868 16-1 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8bcd

    English \u7b80\u4f53\u4e2d\u6587 \u7e41\u4f53\u4e2d\u6587 algorithm \u7b97\u6cd5 \u6f14\u7b97\u6cd5 data structure \u6570\u636e\u7ed3\u6784 \u8cc7\u6599\u7d50\u69cb code \u4ee3\u7801 \u7a0b\u5f0f\u78bc file \u6587\u4ef6 \u6a94\u6848 function \u51fd\u6570 \u51fd\u5f0f method \u65b9\u6cd5 \u65b9\u6cd5 variable \u53d8\u91cf \u8b8a\u6578 asymptotic complexity analysis \u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 \u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790 time complexity \u65f6\u95f4\u590d\u6742\u5ea6 \u6642\u9593\u8907\u96dc\u5ea6 space complexity \u7a7a\u95f4\u590d\u6742\u5ea6 \u7a7a\u9593\u8907\u96dc\u5ea6 loop \u5faa\u73af \u8ff4\u5708 iteration \u8fed\u4ee3 \u8fed\u4ee3 recursion \u9012\u5f52 \u905e\u8ff4 tail recursion \u5c3e\u9012\u5f52 \u5c3e\u905e\u8ff4 recursion tree \u9012\u5f52\u6811 \u905e\u8ff4\u6a39 big-\\(O\\) notation \u5927 \\(O\\) \u8bb0\u53f7 \u5927 \\(O\\) \u8a18\u865f asymptotic upper bound \u6e10\u8fd1\u4e0a\u754c \u6f38\u8fd1\u4e0a\u754c sign-magnitude \u539f\u7801 \u539f\u78bc 1\u2019s complement \u53cd\u7801 \u4e00\u88dc\u6578 2\u2019s complement \u8865\u7801 \u4e8c\u88dc\u6578 array \u6570\u7ec4 \u9663\u5217 index \u7d22\u5f15 \u7d22\u5f15 linked list \u94fe\u8868 \u93c8\u7d50\u4e32\u5217 linked list node, list node \u94fe\u8868\u8282\u70b9 \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede head node \u5934\u8282\u70b9 \u982d\u7bc0\u9ede tail node \u5c3e\u8282\u70b9 \u5c3e\u7bc0\u9ede list \u5217\u8868 \u4e32\u5217 dynamic array \u52a8\u6001\u6570\u7ec4 \u52d5\u614b\u9663\u5217 hard disk \u786c\u76d8 \u786c\u789f random-access memory (RAM) \u5185\u5b58 \u8a18\u61b6\u9ad4 cache memory \u7f13\u5b58 \u5feb\u53d6 cache miss \u7f13\u5b58\u672a\u547d\u4e2d \u5feb\u53d6\u672a\u547d\u4e2d cache hit rate \u7f13\u5b58\u547d\u4e2d\u7387 \u5feb\u53d6\u547d\u4e2d\u7387 stack \u6808 \u5806\u758a top of the stack \u6808\u9876 \u5806\u758a\u9802 bottom of the stack \u6808\u5e95 \u5806\u758a\u5e95 queue \u961f\u5217 \u4f47\u5217 double-ended queue \u53cc\u5411\u961f\u5217 \u96d9\u5411\u4f47\u5217 front of the queue \u961f\u9996 \u4f47\u5217\u9996 rear of the queue \u961f\u5c3e \u4f47\u5217\u5c3e hash table \u54c8\u5e0c\u8868 \u96dc\u6e4a\u8868 hash set \u54c8\u5e0c\u96c6\u5408 \u96dc\u6e4a\u96c6\u5408 bucket \u6876 \u6876 hash function \u54c8\u5e0c\u51fd\u6570 \u96dc\u6e4a\u51fd\u5f0f hash collision \u54c8\u5e0c\u51b2\u7a81 \u96dc\u6e4a\u885d\u7a81 load factor \u8d1f\u8f7d\u56e0\u5b50 \u8ca0\u8f09\u56e0\u5b50 separate chaining \u94fe\u5f0f\u5730\u5740 \u93c8\u7d50\u4f4d\u5740 open addressing \u5f00\u653e\u5bfb\u5740 \u958b\u653e\u5b9a\u5740 linear probing \u7ebf\u6027\u63a2\u6d4b \u7dda\u6027\u63a2\u67e5 lazy deletion \u61d2\u5220\u9664 \u61f6\u522a\u9664 binary tree \u4e8c\u53c9\u6811 \u4e8c\u5143\u6a39 tree node \u6811\u8282\u70b9 \u6a39\u7bc0\u9ede left-child node \u5de6\u5b50\u8282\u70b9 \u5de6\u5b50\u7bc0\u9ede right-child node \u53f3\u5b50\u8282\u70b9 \u53f3\u5b50\u7bc0\u9ede parent node \u7236\u8282\u70b9 \u7236\u7bc0\u9ede left subtree \u5de6\u5b50\u6811 \u5de6\u5b50\u6a39 right subtree \u53f3\u5b50\u6811 \u53f3\u5b50\u6a39 root node \u6839\u8282\u70b9 \u6839\u7bc0\u9ede leaf node \u53f6\u8282\u70b9 \u8449\u7bc0\u9ede edge \u8fb9 \u908a level \u5c42 \u5c64 degree \u5ea6 \u5ea6 height \u9ad8\u5ea6 \u9ad8\u5ea6 depth \u6df1\u5ea6 \u6df1\u5ea6 perfect binary tree \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u5b8c\u7f8e\u4e8c\u5143\u6a39 complete binary tree \u5b8c\u5168\u4e8c\u53c9\u6811 \u5b8c\u5168\u4e8c\u5143\u6a39 full binary tree \u5b8c\u6ee1\u4e8c\u53c9\u6811 \u5b8c\u6eff\u4e8c\u5143\u6a39 balanced binary tree \u5e73\u8861\u4e8c\u53c9\u6811 \u5e73\u8861\u4e8c\u5143\u6a39 binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 AVL tree AVL \u6811 AVL \u6a39 red-black tree \u7ea2\u9ed1\u6811 \u7d05\u9ed1\u6a39 level-order traversal \u5c42\u5e8f\u904d\u5386 \u5c64\u5e8f\u8d70\u8a2a breadth-first traversal \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a depth-first traversal \u6df1\u5ea6\u4f18\u5148\u904d\u5386 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 balanced binary search tree \u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811 \u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39 balance factor \u5e73\u8861\u56e0\u5b50 \u5e73\u8861\u56e0\u5b50 heap \u5806 \u5806\u7a4d max heap \u5927\u9876\u5806 \u5927\u9802\u5806\u7a4d min heap \u5c0f\u9876\u5806 \u5c0f\u9802\u5806\u7a4d priority queue \u4f18\u5148\u961f\u5217 \u512a\u5148\u4f47\u5217 heapify \u5806\u5316 \u5806\u7a4d\u5316 top-\\(k\\) problem Top-\\(k\\) \u95ee\u9898 Top-\\(k\\) \u554f\u984c graph \u56fe \u5716 vertex \u9876\u70b9 \u9802\u9ede undirected graph \u65e0\u5411\u56fe \u7121\u5411\u5716 directed graph \u6709\u5411\u56fe \u6709\u5411\u5716 connected graph \u8fde\u901a\u56fe \u9023\u901a\u5716 disconnected graph \u975e\u8fde\u901a\u56fe \u975e\u9023\u901a\u5716 weighted graph \u6709\u6743\u56fe \u6709\u6b0a\u5716 adjacency \u90bb\u63a5 \u9130\u63a5 path \u8def\u5f84 \u8def\u5f91 in-degree \u5165\u5ea6 \u5165\u5ea6 out-degree \u51fa\u5ea6 \u51fa\u5ea6 adjacency matrix \u90bb\u63a5\u77e9\u9635 \u9130\u63a5\u77e9\u9663 adjacency list \u90bb\u63a5\u8868 \u9130\u63a5\u8868 breadth-first search \u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 \u5ee3\u5ea6\u512a\u5148\u641c\u5c0b depth-first search \u6df1\u5ea6\u4f18\u5148\u641c\u7d22 \u6df1\u5ea6\u512a\u5148\u641c\u5c0b binary search \u4e8c\u5206\u67e5\u627e \u4e8c\u5206\u641c\u5c0b searching algorithm \u641c\u7d22\u7b97\u6cd5 \u641c\u5c0b\u6f14\u7b97\u6cd5 sorting algorithm \u6392\u5e8f\u7b97\u6cd5 \u6392\u5e8f\u6f14\u7b97\u6cd5 selection sort \u9009\u62e9\u6392\u5e8f \u9078\u64c7\u6392\u5e8f bubble sort \u5192\u6ce1\u6392\u5e8f \u6ce1\u6cab\u6392\u5e8f insertion sort \u63d2\u5165\u6392\u5e8f \u63d2\u5165\u6392\u5e8f quick sort \u5feb\u901f\u6392\u5e8f \u5feb\u901f\u6392\u5e8f merge sort \u5f52\u5e76\u6392\u5e8f \u5408\u4f75\u6392\u5e8f heap sort \u5806\u6392\u5e8f \u5806\u7a4d\u6392\u5e8f bucket sort \u6876\u6392\u5e8f \u6876\u6392\u5e8f counting sort \u8ba1\u6570\u6392\u5e8f \u8a08\u6578\u6392\u5e8f radix sort \u57fa\u6570\u6392\u5e8f \u57fa\u6578\u6392\u5e8f divide and conquer \u5206\u6cbb \u5206\u6cbb hanota problem \u6c49\u8bfa\u5854\u95ee\u9898 \u6cb3\u5167\u5854\u554f\u984c backtracking algorithm \u56de\u6eaf\u7b97\u6cd5 \u56de\u6eaf\u6f14\u7b97\u6cd5 constraint \u7ea6\u675f \u7d04\u675f solution \u89e3 \u89e3 state \u72b6\u6001 \u72c0\u614b pruning \u526a\u679d \u526a\u679d permutations problem \u5168\u6392\u5217\u95ee\u9898 \u5168\u6392\u5217\u554f\u984c subset-sum problem \u5b50\u96c6\u548c\u95ee\u9898 \u5b50\u96c6\u5408\u554f\u984c \\(n\\)-queens problem \\(n\\) \u7687\u540e\u95ee\u9898 \\(n\\) \u7687\u540e\u554f\u984c dynamic programming \u52a8\u6001\u89c4\u5212 \u52d5\u614b\u898f\u5283 initial state \u521d\u59cb\u72b6\u6001 \u521d\u59cb\u72c0\u614b state-transition equation \u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \u72c0\u614b\u8f49\u79fb\u65b9\u7a0b knapsack problem \u80cc\u5305\u95ee\u9898 \u80cc\u5305\u554f\u984c edit distance problem \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c greedy algorithm \u8d2a\u5fc3\u7b97\u6cd5 \u8caa\u5a6a\u6f14\u7b97\u6cd5"},{"location":"chapter_array_and_linkedlist/","title":"\u7b2c 4 \u7ae0 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868","text":"

    Abstract

    \u6570\u636e\u7ed3\u6784\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5b9e\u7684\u7816\u5899\u3002

    \u6570\u7ec4\u7684\u7816\u5757\u6574\u9f50\u6392\u5217\uff0c\u9010\u4e2a\u7d27\u8d34\u3002\u94fe\u8868\u7684\u7816\u5757\u5206\u6563\u5404\u5904\uff0c\u8fde\u63a5\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u4e8e\u7816\u7f1d\u4e4b\u95f4\u3002

    "},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 4.1 \u00a0 \u6570\u7ec4
    • 4.2 \u00a0 \u94fe\u8868
    • 4.3 \u00a0 \u5217\u8868
    • 4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *
    • 4.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u6570\u7ec4","text":"

    \u6570\u7ec4\uff08array\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5c06\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002\u6211\u4eec\u5c06\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u4f4d\u7f6e\u79f0\u4e3a\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u56fe 4-1 \u5c55\u793a\u4e86\u6570\u7ec4\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5b58\u50a8\u65b9\u5f0f\u3002

    \u56fe 4-1 \u00a0 \u6570\u7ec4\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

    "},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1 \u00a0 \u6570\u7ec4\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/array/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u6570\u7ec4","text":"

    \u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u9009\u7528\u6570\u7ec4\u7684\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u65e0\u521d\u59cb\u503c\u3001\u7ed9\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u51b5\u4e0b\uff0c\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4f1a\u5c06\u6570\u7ec4\u5143\u7d20\u521d\u59cb\u5316\u4e3a \\(0\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    # \u521d\u59cb\u5316\u6570\u7ec4\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
    array.cpp
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\n// \u5b58\u50a8\u5728\u6808\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5b58\u50a8\u5728\u5806\u4e0a\uff08\u9700\u8981\u624b\u52a8\u91ca\u653e\u7a7a\u95f4\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
    array.java
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
    array.cs
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
    array.go
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[5]int\uff09\u4e3a\u6570\u7ec4\uff0c\u4e0d\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[]int\uff09\u4e3a\u5207\u7247\n// \u7531\u4e8e Go \u7684\u6570\u7ec4\u88ab\u8bbe\u8ba1\u4e3a\u5728\u7f16\u8bd1\u671f\u786e\u5b9a\u957f\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u91cf\u6765\u6307\u5b9a\u957f\u5ea6\n// \u4e3a\u4e86\u65b9\u4fbf\u5b9e\u73b0\u6269\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c06\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u6570\u7ec4\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
    array.swift
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
    array.js
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
    array.ts
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
    array.dart
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
    array.rs
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: [i32; 5] = [0; 5]; // [0, 0, 0, 0, 0]\nlet slice: &[i32] = &[0; 5];\n// \u5728 Rust \u4e2d\uff0c\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[i32; 5]\uff09\u4e3a\u6570\u7ec4\uff0c\u4e0d\u6307\u5b9a\u957f\u5ea6\u65f6\uff08&[i32]\uff09\u4e3a\u5207\u7247\n// \u7531\u4e8e Rust \u7684\u6570\u7ec4\u88ab\u8bbe\u8ba1\u4e3a\u5728\u7f16\u8bd1\u671f\u786e\u5b9a\u957f\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u91cf\u6765\u6307\u5b9a\u957f\u5ea6\n// Vector \u662f Rust \u4e00\u822c\u60c5\u51b5\u4e0b\u7528\u4f5c\u52a8\u6001\u6570\u7ec4\u7684\u7c7b\u578b\n// \u4e3a\u4e86\u65b9\u4fbf\u5b9e\u73b0\u6269\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c06 vector \u770b\u4f5c\u6570\u7ec4\uff08array\uff09\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    array.c
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
    array.kt
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
    array.rb
    # \u521d\u59cb\u5316\u6570\u7ec4\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
    array.zig
    // \u521d\u59cb\u5316\u6570\u7ec4\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

    \u6570\u7ec4\u5143\u7d20\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u8fd9\u610f\u5473\u7740\u8ba1\u7b97\u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7ed9\u5b9a\u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09\u548c\u67d0\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u56fe 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8ba1\u7b97\u5f97\u5230\u8be5\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u76f4\u63a5\u8bbf\u95ee\u8be5\u5143\u7d20\u3002

    \u56fe 4-2 \u00a0 \u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u8ba1\u7b97

    \u89c2\u5bdf\u56fe 4-2 \uff0c\u6211\u4eec\u53d1\u73b0\u6570\u7ec4\u9996\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u4e3a \\(0\\) \uff0c\u8fd9\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\u4f1a\u66f4\u81ea\u7136\u3002\u4f46\u4ece\u5730\u5740\u8ba1\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8d28\u4e0a\u662f\u5185\u5b58\u5730\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u4e2a\u5143\u7d20\u7684\u5730\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u4e3a \\(0\\) \u662f\u5408\u7406\u7684\u3002

    \u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u968f\u673a\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u5143\u7d20\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def random_access(nums: list[int]) -> int:\n    \"\"\"\u968f\u673a\u8bbf\u95ee\u5143\u7d20\"\"\"\n    # \u5728\u533a\u95f4 [0, len(nums)-1] \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
    array.cpp
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.java
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.cs
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.go
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
    array.swift
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
    array.js
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
    array.ts
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
    array.dart
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
    array.rs
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u533a\u95f4 [0, nums.len()) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
    array.c
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.kt
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u533a\u95f4 [0, nums.size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
    array.rb
    ### \u968f\u673a\u8bbf\u95ee\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  nums[random_index]\nend\n
    array.zig
    // \u968f\u673a\u8bbf\u95ee\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#3","title":"3. \u00a0 \u63d2\u5165\u5143\u7d20","text":"

    \u6570\u7ec4\u5143\u7d20\u5728\u5185\u5b58\u4e2d\u662f\u201c\u7d27\u6328\u7740\u7684\u201d\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u7a7a\u95f4\u518d\u5b58\u653e\u4efb\u4f55\u6570\u636e\u3002\u5982\u56fe 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u6570\u7ec4\u4e2d\u95f4\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\uff0c\u5219\u9700\u8981\u5c06\u8be5\u5143\u7d20\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u4e4b\u540e\u518d\u628a\u5143\u7d20\u8d4b\u503c\u7ed9\u8be5\u7d22\u5f15\u3002

    \u56fe 4-3 \u00a0 \u6570\u7ec4\u63d2\u5165\u5143\u7d20\u793a\u4f8b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u4f1a\u5bfc\u81f4\u6570\u7ec4\u5c3e\u90e8\u5143\u7d20\u201c\u4e22\u5931\u201d\u3002\u6211\u4eec\u5c06\u8fd9\u4e2a\u95ee\u9898\u7684\u89e3\u51b3\u65b9\u6848\u7559\u5728\u201c\u5217\u8868\u201d\u7ae0\u8282\u4e2d\u8ba8\u8bba\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n
    array.cpp
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.java
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.cs
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.go
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
    array.swift
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
    array.js
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.ts
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.dart
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c06 _num \u8d4b\u7ed9 index \u5904\u5143\u7d20\n  nums[index] = _num;\n}\n
    array.rs
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut [i32], num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.c
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.kt
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
    array.rb
    ### \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n  nums[index] = num\nend\n
    array.zig
    // \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#4","title":"4. \u00a0 \u5220\u9664\u5143\u7d20","text":"

    \u540c\u7406\uff0c\u5982\u56fe 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u5220\u9664\u7d22\u5f15 \\(i\\) \u5904\u7684\u5143\u7d20\uff0c\u5219\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\u3002

    \u56fe 4-4 \u00a0 \u6570\u7ec4\u5220\u9664\u5143\u7d20\u793a\u4f8b

    \u8bf7\u6ce8\u610f\uff0c\u5220\u9664\u5143\u7d20\u5b8c\u6210\u540e\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u53d8\u5f97\u201c\u65e0\u610f\u4e49\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u987b\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def remove(nums: list[int], index: int):\n    \"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
    array.cpp
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.java
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.cs
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.go
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
    array.swift
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
    array.js
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.ts
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.dart
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
    array.rs
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfn remove(nums: &mut [i32], index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.c
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.kt
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
    array.rb
    ### \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
    array.zig
    // \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u603b\u7684\u6765\u770b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u70b9\u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6\u9ad8\uff1a\u6570\u7ec4\u7684\u63d2\u5165\u548c\u5220\u9664\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u957f\u5ea6\u3002
    • \u4e22\u5931\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u540e\uff0c\u8d85\u51fa\u6570\u7ec4\u957f\u5ea6\u8303\u56f4\u7684\u5143\u7d20\u4f1a\u4e22\u5931\u3002
    • \u5185\u5b58\u6d6a\u8d39\uff1a\u6211\u4eec\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e2a\u6bd4\u8f83\u957f\u7684\u6570\u7ec4\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u8fd9\u6837\u5728\u63d2\u5165\u6570\u636e\u65f6\uff0c\u4e22\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u65e0\u610f\u4e49\u201d\u7684\uff0c\u4f46\u8fd9\u6837\u505a\u4f1a\u9020\u6210\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u904d\u5386\u6570\u7ec4","text":"

    \u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e2\u53ef\u4ee5\u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u83b7\u53d6\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def traverse(nums: list[int]):\n    \"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\n    count = 0\n    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
    array.cpp
    /* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
    array.java
    /* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
    array.cs
    /* \u904d\u5386\u6570\u7ec4 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
    array.go
    /* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
    array.swift
    /* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
    array.js
    /* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
    array.ts
    /* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
    array.dart
    /* \u904d\u5386\u6570\u7ec4\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u901a\u8fc7 forEach \u65b9\u6cd5\u904d\u5386\u6570\u7ec4\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
    array.rs
    /* \u904d\u5386\u6570\u7ec4 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
    array.c
    /* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
    array.kt
    /* \u904d\u5386\u6570\u7ec4 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
    array.rb
    ### \u904d\u5386\u6570\u7ec4 ###\ndef traverse(nums)\n  count = 0\n\n  # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
    array.zig
    // \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#6","title":"6. \u00a0 \u67e5\u627e\u5143\u7d20","text":"

    \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\u9700\u8981\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u5224\u65ad\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5219\u8f93\u51fa\u5bf9\u5e94\u7d22\u5f15\u3002

    \u56e0\u4e3a\u6570\u7ec4\u662f\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u627e\u64cd\u4f5c\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u67e5\u627e\u201d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
    array.cpp
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.java
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.cs
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.go
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
    array.swift
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
    array.js
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
    array.ts
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    array.dart
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
    array.rs
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
    array.c
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.kt
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
    array.rb
    ### \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
    array.zig
    // \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u6269\u5bb9\u6570\u7ec4","text":"

    \u5728\u590d\u6742\u7684\u7cfb\u7edf\u73af\u5883\u4e2d\uff0c\u7a0b\u5e8f\u96be\u4ee5\u4fdd\u8bc1\u6570\u7ec4\u4e4b\u540e\u7684\u5185\u5b58\u7a7a\u95f4\u662f\u53ef\u7528\u7684\uff0c\u4ece\u800c\u65e0\u6cd5\u5b89\u5168\u5730\u6269\u5c55\u6570\u7ec4\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u4e0d\u53ef\u53d8\u7684\u3002

    \u5982\u679c\u6211\u4eec\u5e0c\u671b\u6269\u5bb9\u6570\u7ec4\uff0c\u5219\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u7136\u540e\u628a\u539f\u6570\u7ec4\u5143\u7d20\u4f9d\u6b21\u590d\u5236\u5230\u65b0\u6570\u7ec4\u3002\u8fd9\u662f\u4e00\u4e2a \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u6570\u7ec4\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u8017\u65f6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u6269\u5c55\u6570\u7ec4\u957f\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res = [0] * (len(nums) + enlarge)\n    # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n
    array.cpp
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = new int[size + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    delete[] nums;\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.java
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.cs
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.go
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res := make([]int, len(nums)+enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
    array.swift
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
    array.js
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.ts
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.dart
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  return res;\n}\n
    array.rs
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfn extend(nums: &[i32], enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    res\n}\n
    array.c
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.kt
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    val res = IntArray(nums.size + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
    array.rb
    ### \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 ###\n# \u8bf7\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n# \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  res\nend\n
    array.zig
    // \u6269\u5c55\u6570\u7ec4\u957f\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u6570\u7ec4\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u4e14\u5143\u7d20\u7c7b\u578b\u76f8\u540c\u3002\u8fd9\u79cd\u505a\u6cd5\u5305\u542b\u4e30\u5bcc\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u7cfb\u7edf\u53ef\u4ee5\u5229\u7528\u8fd9\u4e9b\u4fe1\u606f\u6765\u4f18\u5316\u6570\u636e\u7ed3\u6784\u7684\u64cd\u4f5c\u6548\u7387\u3002

    • \u7a7a\u95f4\u6548\u7387\u9ad8\uff1a\u6570\u7ec4\u4e3a\u6570\u636e\u5206\u914d\u4e86\u8fde\u7eed\u7684\u5185\u5b58\u5757\uff0c\u65e0\u987b\u989d\u5916\u7684\u7ed3\u6784\u5f00\u9500\u3002
    • \u652f\u6301\u968f\u673a\u8bbf\u95ee\uff1a\u6570\u7ec4\u5141\u8bb8\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u4efb\u4f55\u5143\u7d20\u3002
    • \u7f13\u5b58\u5c40\u90e8\u6027\uff1a\u5f53\u8bbf\u95ee\u6570\u7ec4\u5143\u7d20\u65f6\uff0c\u8ba1\u7b97\u673a\u4e0d\u4ec5\u4f1a\u52a0\u8f7d\u5b83\uff0c\u8fd8\u4f1a\u7f13\u5b58\u5176\u5468\u56f4\u7684\u5176\u4ed6\u6570\u636e\uff0c\u4ece\u800c\u501f\u52a9\u9ad8\u901f\u7f13\u5b58\u6765\u63d0\u5347\u540e\u7eed\u64cd\u4f5c\u7684\u6267\u884c\u901f\u5ea6\u3002

    \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u662f\u4e00\u628a\u53cc\u5203\u5251\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

    • \u63d2\u5165\u4e0e\u5220\u9664\u6548\u7387\u4f4e\uff1a\u5f53\u6570\u7ec4\u4e2d\u5143\u7d20\u8f83\u591a\u65f6\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52a8\u5927\u91cf\u7684\u5143\u7d20\u3002
    • \u957f\u5ea6\u4e0d\u53ef\u53d8\uff1a\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u6269\u5bb9\u6570\u7ec4\u9700\u8981\u5c06\u6240\u6709\u6570\u636e\u590d\u5236\u5230\u65b0\u6570\u7ec4\uff0c\u5f00\u9500\u5f88\u5927\u3002
    • \u7a7a\u95f4\u6d6a\u8d39\uff1a\u5982\u679c\u6570\u7ec4\u5206\u914d\u7684\u5927\u5c0f\u8d85\u8fc7\u5b9e\u9645\u6240\u9700\uff0c\u90a3\u4e48\u591a\u4f59\u7684\u7a7a\u95f4\u5c31\u88ab\u6d6a\u8d39\u4e86\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u6570\u7ec4\u5178\u578b\u5e94\u7528","text":"

    \u6570\u7ec4\u662f\u4e00\u79cd\u57fa\u7840\u4e14\u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\uff0c\u65e2\u9891\u7e41\u5e94\u7528\u5728\u5404\u7c7b\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u4e8e\u5b9e\u73b0\u5404\u79cd\u590d\u6742\u6570\u636e\u7ed3\u6784\u3002

    • \u968f\u673a\u8bbf\u95ee\uff1a\u5982\u679c\u6211\u4eec\u60f3\u968f\u673a\u62bd\u53d6\u4e00\u4e9b\u6837\u672c\uff0c\u90a3\u4e48\u53ef\u4ee5\u7528\u6570\u7ec4\u5b58\u50a8\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u968f\u673a\u5e8f\u5217\uff0c\u6839\u636e\u7d22\u5f15\u5b9e\u73b0\u968f\u673a\u62bd\u6837\u3002
    • \u6392\u5e8f\u548c\u641c\u7d22\uff1a\u6570\u7ec4\u662f\u6392\u5e8f\u548c\u641c\u7d22\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u4e8c\u5206\u67e5\u627e\u7b49\u90fd\u4e3b\u8981\u5728\u6570\u7ec4\u4e0a\u8fdb\u884c\u3002
    • \u67e5\u627e\u8868\uff1a\u5f53\u9700\u8981\u5feb\u901f\u67e5\u627e\u4e00\u4e2a\u5143\u7d20\u6216\u5176\u5bf9\u5e94\u5173\u7cfb\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u4f5c\u4e3a\u67e5\u627e\u8868\u3002\u5047\u5982\u6211\u4eec\u60f3\u5b9e\u73b0\u5b57\u7b26\u5230 ASCII \u7801\u7684\u6620\u5c04\uff0c\u5219\u53ef\u4ee5\u5c06\u5b57\u7b26\u7684 ASCII \u7801\u503c\u4f5c\u4e3a\u7d22\u5f15\uff0c\u5bf9\u5e94\u7684\u5143\u7d20\u5b58\u653e\u5728\u6570\u7ec4\u4e2d\u7684\u5bf9\u5e94\u4f4d\u7f6e\u3002
    • \u673a\u5668\u5b66\u4e60\uff1a\u795e\u7ecf\u7f51\u7edc\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9635\u3001\u5f20\u91cf\u4e4b\u95f4\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\uff0c\u8fd9\u4e9b\u6570\u636e\u90fd\u662f\u4ee5\u6570\u7ec4\u7684\u5f62\u5f0f\u6784\u5efa\u7684\u3002\u6570\u7ec4\u662f\u795e\u7ecf\u7f51\u7edc\u7f16\u7a0b\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002
    • \u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff1a\u6570\u7ec4\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002\u4f8b\u5982\uff0c\u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u4e8c\u7ef4\u6570\u7ec4\u3002
    "},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u94fe\u8868","text":"

    \u5185\u5b58\u7a7a\u95f4\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u516c\u5171\u8d44\u6e90\uff0c\u5728\u4e00\u4e2a\u590d\u6742\u7684\u7cfb\u7edf\u8fd0\u884c\u73af\u5883\u4e0b\uff0c\u7a7a\u95f2\u7684\u5185\u5b58\u7a7a\u95f4\u53ef\u80fd\u6563\u843d\u5728\u5185\u5b58\u5404\u5904\u3002\u6211\u4eec\u77e5\u9053\uff0c\u5b58\u50a8\u6570\u7ec4\u7684\u5185\u5b58\u7a7a\u95f4\u5fc5\u987b\u662f\u8fde\u7eed\u7684\uff0c\u800c\u5f53\u6570\u7ec4\u975e\u5e38\u5927\u65f6\uff0c\u5185\u5b58\u53ef\u80fd\u65e0\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u8fde\u7eed\u7a7a\u95f4\u3002\u6b64\u65f6\u94fe\u8868\u7684\u7075\u6d3b\u6027\u4f18\u52bf\u5c31\u4f53\u73b0\u51fa\u6765\u4e86\u3002

    \u94fe\u8868\uff08linked list\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u5404\u4e2a\u8282\u70b9\u901a\u8fc7\u201c\u5f15\u7528\u201d\u76f8\u8fde\u63a5\u3002\u5f15\u7528\u8bb0\u5f55\u4e86\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5185\u5b58\u5730\u5740\uff0c\u901a\u8fc7\u5b83\u53ef\u4ee5\u4ece\u5f53\u524d\u8282\u70b9\u8bbf\u95ee\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002

    \u94fe\u8868\u7684\u8bbe\u8ba1\u4f7f\u5f97\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\uff0c\u5b83\u4eec\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

    \u56fe 4-5 \u00a0 \u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

    \u89c2\u5bdf\u56fe 4-5 \uff0c\u94fe\u8868\u7684\u7ec4\u6210\u5355\u4f4d\u662f\u8282\u70b9\uff08node\uff09\u5bf9\u8c61\u3002\u6bcf\u4e2a\u8282\u70b9\u90fd\u5305\u542b\u4e24\u9879\u6570\u636e\uff1a\u8282\u70b9\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u201c\u5f15\u7528\u201d\u3002

    • \u94fe\u8868\u7684\u9996\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5934\u8282\u70b9\u201d\uff0c\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5c3e\u8282\u70b9\u201d\u3002
    • \u5c3e\u8282\u70b9\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u522b\u88ab\u8bb0\u4e3a null\u3001nullptr \u548c None \u3002
    • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u9488\u7684\u8bed\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u5e94\u88ab\u66ff\u6362\u4e3a\u201c\u6307\u9488\u201d\u3002

    \u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u94fe\u8868\u8282\u70b9 ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u8fd8\u9700\u989d\u5916\u4fdd\u5b58\u4e00\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u6570\u636e\u91cf\u4e0b\uff0c\u94fe\u8868\u6bd4\u6570\u7ec4\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u8282\u70b9\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n
    /* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  //\u6784\u9020\u51fd\u6570\n    int val = x;         // \u8282\u70b9\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype ListNode struct {\n    Val  int       // \u8282\u70b9\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewListNode \u6784\u9020\u51fd\u6570\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u94fe\u8868\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u8282\u70b9\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u6784\u9020\u51fd\u6570\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u94fe\u8868\u8282\u70b9\u7c7b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u8282\u70b9\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\n}\n
    # \u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val  # \u8282\u70b9\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
    // \u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
    "},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1 \u00a0 \u94fe\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u94fe\u8868","text":"

    \u5efa\u7acb\u94fe\u8868\u5206\u4e3a\u4e24\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u7b2c\u4e8c\u6b65\u662f\u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\u5173\u7cfb\u3002\u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4ece\u94fe\u8868\u7684\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u901a\u8fc7\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8bbf\u95ee\u6240\u6709\u8282\u70b9\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    # \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.cpp
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.java
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.cs
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.go
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
    linked_list.swift
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.js
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.ts
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.dart
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rs
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
    linked_list.c
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.kt
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rb
    # \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.zig
    // \u521d\u59cb\u5316\u94fe\u8868\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6570\u7ec4\u6574\u4f53\u662f\u4e00\u4e2a\u53d8\u91cf\uff0c\u6bd4\u5982\u6570\u7ec4 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u94fe\u8868\u662f\u7531\u591a\u4e2a\u72ec\u7acb\u7684\u8282\u70b9\u5bf9\u8c61\u7ec4\u6210\u7684\u3002\u6211\u4eec\u901a\u5e38\u5c06\u5934\u8282\u70b9\u5f53\u4f5c\u94fe\u8868\u7684\u4ee3\u79f0\uff0c\u6bd4\u5982\u4ee5\u4e0a\u4ee3\u7801\u4e2d\u7684\u94fe\u8868\u53ef\u8bb0\u4f5c\u94fe\u8868 n0 \u3002

    "},{"location":"chapter_array_and_linkedlist/linked_list/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

    \u5728\u94fe\u8868\u4e2d\u63d2\u5165\u8282\u70b9\u975e\u5e38\u5bb9\u6613\u3002\u5982\u56fe 4-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u60f3\u5728\u76f8\u90bb\u7684\u4e24\u4e2a\u8282\u70b9 n0 \u548c n1 \u4e4b\u95f4\u63d2\u5165\u4e00\u4e2a\u65b0\u8282\u70b9 P \uff0c\u5219\u53ea\u9700\u6539\u53d8\u4e24\u4e2a\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    \u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u6570\u7ec4\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u6548\u7387\u8f83\u4f4e\u3002

    \u56fe 4-6 \u00a0 \u94fe\u8868\u63d2\u5165\u8282\u70b9\u793a\u4f8b

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
    linked_list.cpp
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
    linked_list.java
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.cs
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.go
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
    linked_list.swift
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
    linked_list.js
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.ts
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.dart
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
    linked_list.rs
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
    linked_list.c
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
    linked_list.kt
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
    linked_list.rb
    ### \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u4e2a\u5185\u7f6e\u51fd\u6570\uff0c `P` \u662f\u4e00\u4e2a\u5e38\u91cf\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
    linked_list.zig
    // \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

    \u5982\u56fe 4-7 \u6240\u793a\uff0c\u5728\u94fe\u8868\u4e2d\u5220\u9664\u8282\u70b9\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u53d8\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u3002

    \u8bf7\u6ce8\u610f\uff0c\u5c3d\u7ba1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\u8282\u70b9 P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5b9e\u9645\u4e0a\u904d\u5386\u6b64\u94fe\u8868\u5df2\u7ecf\u65e0\u6cd5\u8bbf\u95ee\u5230 P \uff0c\u8fd9\u610f\u5473\u7740 P \u5df2\u7ecf\u4e0d\u518d\u5c5e\u4e8e\u8be5\u94fe\u8868\u4e86\u3002

    \u56fe 4-7 \u00a0 \u94fe\u8868\u5220\u9664\u8282\u70b9

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def remove(n0: ListNode):\n    \"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
    linked_list.cpp
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    delete P;\n}\n
    linked_list.java
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.cs
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.go
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
    linked_list.swift
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
    linked_list.js
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.ts
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.dart
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
    linked_list.rs
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
    linked_list.c
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    free(P);\n}\n
    linked_list.kt
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
    linked_list.rb
    ### \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
    linked_list.zig
    // \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8bbf\u95ee\u8282\u70b9","text":"

    \u5728\u94fe\u8868\u4e2d\u8bbf\u95ee\u8282\u70b9\u7684\u6548\u7387\u8f83\u4f4e\u3002\u5982\u4e0a\u4e00\u8282\u6240\u8ff0\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u4e0b\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u94fe\u8868\u5219\u4e0d\u7136\uff0c\u7a0b\u5e8f\u9700\u8981\u4ece\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u9010\u4e2a\u5411\u540e\u904d\u5386\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u8282\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8bbf\u95ee\u94fe\u8868\u7684\u7b2c \\(i\\) \u4e2a\u8282\u70b9\u9700\u8981\u5faa\u73af \\(i - 1\\) \u8f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
    linked_list.cpp
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
    linked_list.java
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.cs
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.go
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
    linked_list.swift
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
    linked_list.js
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.ts
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.dart
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
    linked_list.rs
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
    linked_list.c
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
    linked_list.kt
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
    linked_list.rb
    ### \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
    linked_list.zig
    // \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

    \u904d\u5386\u94fe\u8868\uff0c\u67e5\u627e\u5176\u4e2d\u503c\u4e3a target \u7684\u8282\u70b9\uff0c\u8f93\u51fa\u8be5\u8282\u70b9\u5728\u94fe\u8868\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u8fc7\u7a0b\u4e5f\u5c5e\u4e8e\u7ebf\u6027\u67e5\u627e\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
    linked_list.cpp
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.java
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.cs
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.go
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
    linked_list.swift
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
    linked_list.js
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
    linked_list.ts
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
    linked_list.dart
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
    linked_list.rs
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
    linked_list.c
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.kt
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
    linked_list.rb
    ### \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
    linked_list.zig
    // \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u6570\u7ec4 vs. \u94fe\u8868","text":"

    \u8868 4-1 \u603b\u7ed3\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u7684\u5404\u9879\u7279\u70b9\u5e76\u5bf9\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u4e8e\u5b83\u4eec\u91c7\u7528\u4e24\u79cd\u76f8\u53cd\u7684\u5b58\u50a8\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u79cd\u6027\u8d28\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73b0\u5bf9\u7acb\u7684\u7279\u70b9\u3002

    \u8868 4-1 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868\u7684\u6548\u7387\u5bf9\u6bd4

    \u6570\u7ec4 \u94fe\u8868 \u5b58\u50a8\u65b9\u5f0f \u8fde\u7eed\u5185\u5b58\u7a7a\u95f4 \u5206\u6563\u5185\u5b58\u7a7a\u95f4 \u5bb9\u91cf\u6269\u5c55 \u957f\u5ea6\u4e0d\u53ef\u53d8 \u53ef\u7075\u6d3b\u6269\u5c55 \u5185\u5b58\u6548\u7387 \u5143\u7d20\u5360\u7528\u5185\u5b58\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8d39\u7a7a\u95f4 \u5143\u7d20\u5360\u7528\u5185\u5b58\u591a \u8bbf\u95ee\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u89c1\u94fe\u8868\u7c7b\u578b","text":"

    \u5982\u56fe 4-8 \u6240\u793a\uff0c\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u4e09\u79cd\u3002

    • \u5355\u5411\u94fe\u8868\uff1a\u5373\u524d\u9762\u4ecb\u7ecd\u7684\u666e\u901a\u94fe\u8868\u3002\u5355\u5411\u94fe\u8868\u7684\u8282\u70b9\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\u4e24\u9879\u6570\u636e\u3002\u6211\u4eec\u5c06\u9996\u4e2a\u8282\u70b9\u79f0\u4e3a\u5934\u8282\u70b9\uff0c\u5c06\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u79f0\u4e3a\u5c3e\u8282\u70b9\uff0c\u5c3e\u8282\u70b9\u6307\u5411\u7a7a None \u3002
    • \u73af\u5f62\u94fe\u8868\uff1a\u5982\u679c\u6211\u4eec\u4ee4\u5355\u5411\u94fe\u8868\u7684\u5c3e\u8282\u70b9\u6307\u5411\u5934\u8282\u70b9\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5219\u5f97\u5230\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\u3002\u5728\u73af\u5f62\u94fe\u8868\u4e2d\uff0c\u4efb\u610f\u8282\u70b9\u90fd\u53ef\u4ee5\u89c6\u4f5c\u5934\u8282\u70b9\u3002
    • \u53cc\u5411\u94fe\u8868\uff1a\u4e0e\u5355\u5411\u94fe\u8868\u76f8\u6bd4\uff0c\u53cc\u5411\u94fe\u8868\u8bb0\u5f55\u4e86\u4e24\u4e2a\u65b9\u5411\u7684\u5f15\u7528\u3002\u53cc\u5411\u94fe\u8868\u7684\u8282\u70b9\u5b9a\u4e49\u540c\u65f6\u5305\u542b\u6307\u5411\u540e\u7ee7\u8282\u70b9\uff08\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\u548c\u524d\u9a71\u8282\u70b9\uff08\u4e0a\u4e00\u4e2a\u8282\u70b9\uff09\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u76f8\u8f83\u4e8e\u5355\u5411\u94fe\u8868\uff0c\u53cc\u5411\u94fe\u8868\u66f4\u5177\u7075\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u4e24\u4e2a\u65b9\u5411\u904d\u5386\u94fe\u8868\uff0c\u4f46\u76f8\u5e94\u5730\u4e5f\u9700\u8981\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    ListNode *prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  // \u6784\u9020\u51fd\u6570\n    int val = x;    // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype DoublyListNode struct {\n    Val  int             // \u8282\u70b9\u503c\n    Next *DoublyListNode // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u6784\u9020\u51fd\u6570\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\u578b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u8282\u70b9\u503c\n    val next: ListNode? = null  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
    # \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :next   # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil, prev_node=nil)\n    @val = val\n    @next = next_node\n    @prev = prev_node\n  end\nend\n
    // \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

    \u56fe 4-8 \u00a0 \u5e38\u89c1\u94fe\u8868\u79cd\u7c7b

    "},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u94fe\u8868\u5178\u578b\u5e94\u7528","text":"

    \u5355\u5411\u94fe\u8868\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u548c\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002

    • \u6808\u4e0e\u961f\u5217\uff1a\u5f53\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u90fd\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\u65f6\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u540e\u51fa\uff0c\u5bf9\u5e94\u6808\uff1b\u5f53\u63d2\u5165\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\uff0c\u5220\u9664\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u53e6\u4e00\u7aef\u8fdb\u884c\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u5148\u51fa\uff0c\u5bf9\u5e94\u961f\u5217\u3002
    • \u54c8\u5e0c\u8868\uff1a\u94fe\u5f0f\u5730\u5740\u662f\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8be5\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u51b2\u7a81\u7684\u5143\u7d20\u90fd\u4f1a\u88ab\u653e\u5230\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002
    • \u56fe\uff1a\u90bb\u63a5\u8868\u662f\u8868\u793a\u56fe\u7684\u4e00\u79cd\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u90fd\u4e0e\u4e00\u4e2a\u94fe\u8868\u76f8\u5173\u8054\uff0c\u94fe\u8868\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u4ee3\u8868\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u5176\u4ed6\u9876\u70b9\u3002

    \u53cc\u5411\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5feb\u901f\u67e5\u627e\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u5143\u7d20\u7684\u573a\u666f\u3002

    • \u9ad8\u7ea7\u6570\u636e\u7ed3\u6784\uff1a\u6bd4\u5982\u5728\u7ea2\u9ed1\u6811\u3001B \u6811\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u8bbf\u95ee\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5728\u8282\u70b9\u4e2d\u4fdd\u5b58\u4e00\u4e2a\u6307\u5411\u7236\u8282\u70b9\u7684\u5f15\u7528\u6765\u5b9e\u73b0\uff0c\u7c7b\u4f3c\u4e8e\u53cc\u5411\u94fe\u8868\u3002
    • \u6d4f\u89c8\u5668\u5386\u53f2\uff1a\u5728\u7f51\u9875\u6d4f\u89c8\u5668\u4e2d\uff0c\u5f53\u7528\u6237\u70b9\u51fb\u524d\u8fdb\u6216\u540e\u9000\u6309\u94ae\u65f6\uff0c\u6d4f\u89c8\u5668\u9700\u8981\u77e5\u9053\u7528\u6237\u8bbf\u95ee\u8fc7\u7684\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u7f51\u9875\u3002\u53cc\u5411\u94fe\u8868\u7684\u7279\u6027\u4f7f\u5f97\u8fd9\u79cd\u64cd\u4f5c\u53d8\u5f97\u7b80\u5355\u3002
    • LRU \u7b97\u6cd5\uff1a\u5728\u7f13\u5b58\u6dd8\u6c70\uff08LRU\uff09\u7b97\u6cd5\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u3002\u8fd9\u65f6\u5019\u4f7f\u7528\u53cc\u5411\u94fe\u8868\u5c31\u975e\u5e38\u5408\u9002\u3002

    \u73af\u5f62\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5468\u671f\u6027\u64cd\u4f5c\u7684\u573a\u666f\uff0c\u6bd4\u5982\u64cd\u4f5c\u7cfb\u7edf\u7684\u8d44\u6e90\u8c03\u5ea6\u3002

    • \u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\uff1a\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\u662f\u4e00\u79cd\u5e38\u89c1\u7684 CPU \u8c03\u5ea6\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5bf9\u4e00\u7ec4\u8fdb\u7a0b\u8fdb\u884c\u5faa\u73af\u3002\u6bcf\u4e2a\u8fdb\u7a0b\u88ab\u8d4b\u4e88\u4e00\u4e2a\u65f6\u95f4\u7247\uff0c\u5f53\u65f6\u95f4\u7247\u7528\u5b8c\u65f6\uff0cCPU \u5c06\u5207\u6362\u5230\u4e0b\u4e00\u4e2a\u8fdb\u7a0b\u3002\u8fd9\u79cd\u5faa\u73af\u64cd\u4f5c\u53ef\u4ee5\u901a\u8fc7\u73af\u5f62\u94fe\u8868\u6765\u5b9e\u73b0\u3002
    • \u6570\u636e\u7f13\u51b2\u533a\uff1a\u5728\u67d0\u4e9b\u6570\u636e\u7f13\u51b2\u533a\u7684\u5b9e\u73b0\u4e2d\uff0c\u4e5f\u53ef\u80fd\u4f1a\u4f7f\u7528\u73af\u5f62\u94fe\u8868\u3002\u6bd4\u5982\u5728\u97f3\u9891\u3001\u89c6\u9891\u64ad\u653e\u5668\u4e2d\uff0c\u6570\u636e\u6d41\u53ef\u80fd\u4f1a\u88ab\u5206\u6210\u591a\u4e2a\u7f13\u51b2\u5757\u5e76\u653e\u5165\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\uff0c\u4ee5\u4fbf\u5b9e\u73b0\u65e0\u7f1d\u64ad\u653e\u3002
    "},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u5217\u8868","text":"

    \u5217\u8868\uff08list\uff09\u662f\u4e00\u4e2a\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8bbf\u95ee\u3001\u4fee\u6539\u3001\u6dfb\u52a0\u3001\u5220\u9664\u548c\u904d\u5386\u7b49\u64cd\u4f5c\uff0c\u65e0\u987b\u4f7f\u7528\u8005\u8003\u8651\u5bb9\u91cf\u9650\u5236\u7684\u95ee\u9898\u3002\u5217\u8868\u53ef\u4ee5\u57fa\u4e8e\u94fe\u8868\u6216\u6570\u7ec4\u5b9e\u73b0\u3002

    • \u94fe\u8868\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u5217\u8868\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\u64cd\u4f5c\uff0c\u5e76\u4e14\u53ef\u4ee5\u7075\u6d3b\u52a8\u6001\u6269\u5bb9\u3002
    • \u6570\u7ec4\u4e5f\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\uff0c\u4f46\u7531\u4e8e\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u4e2a\u5177\u6709\u957f\u5ea6\u9650\u5236\u7684\u5217\u8868\u3002

    \u5f53\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u5217\u8868\u65f6\uff0c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6027\u8d28\u4f1a\u5bfc\u81f4\u5217\u8868\u7684\u5b9e\u7528\u6027\u964d\u4f4e\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u65e0\u6cd5\u4e8b\u5148\u786e\u5b9a\u9700\u8981\u5b58\u50a8\u591a\u5c11\u6570\u636e\uff0c\u4ece\u800c\u96be\u4ee5\u9009\u62e9\u5408\u9002\u7684\u5217\u8868\u957f\u5ea6\u3002\u82e5\u957f\u5ea6\u8fc7\u5c0f\uff0c\u5219\u5f88\u53ef\u80fd\u65e0\u6cd5\u6ee1\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u957f\u5ea6\u8fc7\u5927\uff0c\u5219\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002

    \u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff08dynamic array\uff09\u6765\u5b9e\u73b0\u5217\u8868\u3002\u5b83\u7ee7\u627f\u4e86\u6570\u7ec4\u7684\u5404\u9879\u4f18\u70b9\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u52a8\u6001\u6269\u5bb9\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u6807\u51c6\u5e93\u63d0\u4f9b\u7684\u5217\u8868\u662f\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982 Python \u4e2d\u7684 list \u3001Java \u4e2d\u7684 ArrayList \u3001C++ \u4e2d\u7684 vector \u548c C# \u4e2d\u7684 List \u7b49\u3002\u5728\u63a5\u4e0b\u6765\u7684\u8ba8\u8bba\u4e2d\uff0c\u6211\u4eec\u5c06\u628a\u201c\u5217\u8868\u201d\u548c\u201c\u52a8\u6001\u6570\u7ec4\u201d\u89c6\u4e3a\u7b49\u540c\u7684\u6982\u5ff5\u3002

    "},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1 \u00a0 \u5217\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u5217\u8868","text":"

    \u6211\u4eec\u901a\u5e38\u4f7f\u7528\u201c\u65e0\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u8fd9\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1: list[int] = []\n# \u6709\u521d\u59cb\u503c\nnums: list[int] = [1, 3, 2, 5, 4]\n
    list.cpp
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u65e0\u521d\u59cb\u503c\nvector<int> nums1;\n// \u6709\u521d\u59cb\u503c\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
    list.java
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u6570\u7ec4\u7684\u5143\u7d20\u7c7b\u578b\u9700\u4e3a int[] \u7684\u5305\u88c5\u7c7b Integer[]\uff09\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
    list.cs
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
    list_test.go
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
    list.swift
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
    list.js
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
    list.ts
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst nums: number[] = [1, 3, 2, 5, 4];\n
    list.dart
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nList<int> nums = [1, 3, 2, 5, 4];\n
    list.rs
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: Vec<i32> = Vec::new();\n// \u6709\u521d\u59cb\u503c\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nvar nums1 = listOf<Int>()\n// \u6709\u521d\u59cb\u503c\nvar numbers = arrayOf(1, 3, 2, 5, 4)\nvar nums = numbers.toMutableList()\n
    list.rb
    # \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
    list.zig
    // \u521d\u59cb\u5316\u5217\u8868\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

    \u5217\u8868\u672c\u8d28\u4e0a\u662f\u6570\u7ec4\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u8bbf\u95ee\u5143\u7d20\nnum: int = nums[1]  # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.cpp
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.java
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums.get(1);  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.cs
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list_test.go
    /* \u8bbf\u95ee\u5143\u7d20 */\nnum := nums[1]  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.swift
    /* \u8bbf\u95ee\u5143\u7d20 */\nlet num = nums[1] // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.js
    /* \u8bbf\u95ee\u5143\u7d20 */\nconst num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.ts
    /* \u8bbf\u95ee\u5143\u7d20 */\nconst num: number = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.dart
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.rs
    /* \u8bbf\u95ee\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u8bbf\u95ee\u5143\u7d20 */\nval num = nums[1]       // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.rb
    # \u8bbf\u95ee\u5143\u7d20\nnum = nums[1] # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.zig
    // \u8bbf\u95ee\u5143\u7d20\nvar num = nums.items[1]; // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#3","title":"3. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u5143\u7d20","text":"

    \u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5730\u6dfb\u52a0\u4e0e\u5220\u9664\u5143\u7d20\u3002\u5728\u5217\u8868\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u4e0e\u6570\u7ec4\u76f8\u540c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6e05\u7a7a\u5217\u8868\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.pop(3)        # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.cpp
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.java
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.cs
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list_test.go
    /* \u6e05\u7a7a\u5217\u8868 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.swift
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.js
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.ts
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.dart
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.rs
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);    // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.rb
    # \u6e05\u7a7a\u5217\u8868\nnums.clear\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.delete_at(3) # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.zig
    // \u6e05\u7a7a\u5217\u8868\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n// \u5220\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u904d\u5386\u5217\u8868","text":"

    \u4e0e\u6570\u7ec4\u4e00\u6837\uff0c\u5217\u8868\u53ef\u4ee5\u6839\u636e\u7d22\u5f15\u904d\u5386\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u5404\u5143\u7d20\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\nfor num in nums:\n    count += num\n
    list.cpp
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
    list.java
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
    list.cs
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
    list_test.go
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
    list.swift
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
    list.js
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.ts
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.dart
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
    list.rs
    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
    list.rb
    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
    list.zig
    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#5","title":"5. \u00a0 \u62fc\u63a5\u5217\u8868","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u65b0\u5217\u8868 nums1 \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u62fc\u63a5\u5230\u539f\u5217\u8868\u7684\u5c3e\u90e8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.cpp
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
    list.java
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.cs
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list_test.go
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.swift
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.js
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.ts
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.dart
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.rs
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.rb
    # \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
    list.zig
    // \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#6","title":"6. \u00a0 \u6392\u5e8f\u5217\u8868","text":"

    \u5b8c\u6210\u5217\u8868\u6392\u5e8f\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u6570\u7ec4\u7c7b\u7b97\u6cd5\u9898\u4e2d\u7ecf\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u548c\u201c\u53cc\u6307\u9488\u201d\u7b97\u6cd5\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6392\u5e8f\u5217\u8868\nnums.sort()  # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.cpp
    /* \u6392\u5e8f\u5217\u8868 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.java
    /* \u6392\u5e8f\u5217\u8868 */\nCollections.sort(nums);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.cs
    /* \u6392\u5e8f\u5217\u8868 */\nnums.Sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list_test.go
    /* \u6392\u5e8f\u5217\u8868 */\nsort.Ints(nums)  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.swift
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.js
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.ts
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.dart
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.rs
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.rb
    # \u6392\u5e8f\u5217\u8868\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.zig
    // \u6392\u5e8f\u5217\u8868\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u5217\u8868\u5b9e\u73b0","text":"

    \u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u4e86\u5217\u8868\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u4eec\u7684\u5b9e\u73b0\u6bd4\u8f83\u590d\u6742\uff0c\u5404\u4e2a\u53c2\u6570\u7684\u8bbe\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u6269\u5bb9\u500d\u6570\u7b49\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u6e90\u7801\u8fdb\u884c\u5b66\u4e60\u3002

    \u4e3a\u4e86\u52a0\u6df1\u5bf9\u5217\u8868\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u4eec\u5c1d\u8bd5\u5b9e\u73b0\u4e00\u4e2a\u7b80\u6613\u7248\u5217\u8868\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u4e2a\u91cd\u70b9\u8bbe\u8ba1\u3002

    • \u521d\u59cb\u5bb9\u91cf\uff1a\u9009\u53d6\u4e00\u4e2a\u5408\u7406\u7684\u6570\u7ec4\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u9009\u62e9 10 \u4f5c\u4e3a\u521d\u59cb\u5bb9\u91cf\u3002
    • \u6570\u91cf\u8bb0\u5f55\uff1a\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf size \uff0c\u7528\u4e8e\u8bb0\u5f55\u5217\u8868\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff0c\u5e76\u968f\u7740\u5143\u7d20\u63d2\u5165\u548c\u5220\u9664\u5b9e\u65f6\u66f4\u65b0\u3002\u6839\u636e\u6b64\u53d8\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9a\u4f4d\u5217\u8868\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65ad\u662f\u5426\u9700\u8981\u6269\u5bb9\u3002
    • \u6269\u5bb9\u673a\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u65f6\u5217\u8868\u5bb9\u91cf\u5df2\u6ee1\uff0c\u5219\u9700\u8981\u8fdb\u884c\u6269\u5bb9\u3002\u5148\u6839\u636e\u6269\u5bb9\u500d\u6570\u521b\u5efa\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u518d\u5c06\u5f53\u524d\u6570\u7ec4\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52a8\u81f3\u65b0\u6570\u7ec4\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u89c4\u5b9a\u6bcf\u6b21\u5c06\u6570\u7ec4\u6269\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
    class MyList:\n    \"\"\"\u5217\u8868\u7c7b\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        self._size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u5220\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\n        return self._arr[: self._size]\n
    my_list.cpp
    /* \u5217\u8868\u7c7b */\nclass MyList {\n  private:\n    int *arr;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u5217\u8868\u5bb9\u91cf\n    int arrSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
    my_list.java
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    private int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] toArray() {\n        int size = size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.cs
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\n    private int arrSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a arrCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.go
    /* \u5217\u8868\u7c7b */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\n        arr:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n    }\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868 */\nfunc (l *myList) toArray() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
    my_list.swift
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var _capacity: Int // \u5217\u8868\u5bb9\u91cf\n    private var _size: Int // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
    my_list.js
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    #arr = new Array(); // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    #capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    #size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    toArray() {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.ts
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private arr: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\n    private _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.dart
    /* \u5217\u8868\u7c7b */\nclass MyList {\n  late List<int> _arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n  int _capacity = 10; // \u5217\u8868\u5bb9\u91cf\n  int _size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8bbf\u95ee\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5220\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u5217\u8868\u6269\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
    my_list.rs
    /* \u5217\u8868\u7c7b */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    capacity: usize,     // \u5217\u8868\u5bb9\u91cf\n    size: usize,         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
    my_list.c
    /* \u5217\u8868\u7c7b */\ntypedef struct {\n    int *arr;        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int capacity;    // \u5217\u8868\u5bb9\u91cf\n    int size;        // \u5217\u8868\u5927\u5c0f\n    int extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n} MyList;\n\n/* \u6784\u9020\u51fd\u6570 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u95f4\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91ca\u653e\u65e7\u6570\u636e\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u6570\u636e\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
    my_list.kt
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u5217\u8868\u5bb9\u91cf\n    private var size: Int = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
    my_list.rb
    ### \u5217\u8868\u7c7b ###\nclass MyList\n  attr_reader :size       # \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  attr_reader :capacity   # \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n\n    # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5220\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u5217\u8868\u6269\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 ###\n  def to_array\n    sz = size\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
    my_list.zig
    // \u5217\u8868\u7c7b\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\n        numSize: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8bbf\u95ee\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }\n\n        // \u5220\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u5217\u8868\u6269\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *","text":"

    \u5728\u672c\u7ae0\u7684\u524d\u4e24\u8282\u4e2d\uff0c\u6211\u4eec\u63a2\u8ba8\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u8fd9\u4e24\u79cd\u57fa\u7840\u4e14\u91cd\u8981\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b83\u4eec\u5206\u522b\u4ee3\u8868\u4e86\u201c\u8fde\u7eed\u5b58\u50a8\u201d\u548c\u201c\u5206\u6563\u5b58\u50a8\u201d\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u3002

    \u5b9e\u9645\u4e0a\uff0c\u7269\u7406\u7ed3\u6784\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u51b3\u5b9a\u4e86\u7a0b\u5e8f\u5bf9\u5185\u5b58\u548c\u7f13\u5b58\u7684\u4f7f\u7528\u6548\u7387\uff0c\u8fdb\u800c\u5f71\u54cd\u7b97\u6cd5\u7a0b\u5e8f\u7684\u6574\u4f53\u6027\u80fd\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u8bbe\u5907","text":"

    \u8ba1\u7b97\u673a\u4e2d\u5305\u62ec\u4e09\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u8bbe\u5907\uff1a\u786c\u76d8\uff08hard disk\uff09\u3001\u5185\u5b58\uff08random-access memory, RAM\uff09\u3001\u7f13\u5b58\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u4eec\u5728\u8ba1\u7b97\u673a\u7cfb\u7edf\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6027\u80fd\u7279\u70b9\u3002

    \u8868 4-2 \u00a0 \u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u8bbe\u5907

    \u786c\u76d8 \u5185\u5b58 \u7f13\u5b58 \u7528\u9014 \u957f\u671f\u5b58\u50a8\u6570\u636e\uff0c\u5305\u62ec\u64cd\u4f5c\u7cfb\u7edf\u3001\u7a0b\u5e8f\u3001\u6587\u4ef6\u7b49 \u4e34\u65f6\u5b58\u50a8\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u548c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e \u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u51cf\u5c11 CPU \u8bbf\u95ee\u5185\u5b58\u7684\u6b21\u6570 \u6613\u5931\u6027 \u65ad\u7535\u540e\u6570\u636e\u4e0d\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u5bb9\u91cf \u8f83\u5927\uff0cTB \u7ea7\u522b \u8f83\u5c0f\uff0cGB \u7ea7\u522b \u975e\u5e38\u5c0f\uff0cMB \u7ea7\u522b \u901f\u5ea6 \u8f83\u6162\uff0c\u51e0\u767e\u5230\u51e0\u5343 MB/s \u8f83\u5feb\uff0c\u51e0\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u51e0\u5341\u5230\u51e0\u767e GB/s \u4ef7\u683c \u8f83\u4fbf\u5b9c\uff0c\u51e0\u6bdb\u5230\u51e0\u5143 / GB \u8f83\u8d35\uff0c\u51e0\u5341\u5230\u51e0\u767e\u5143 / GB \u975e\u5e38\u8d35\uff0c\u968f CPU \u6253\u5305\u8ba1\u4ef7

    \u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf\u60f3\u8c61\u4e3a\u56fe 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7ed3\u6784\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9876\u7aef\u7684\u5b58\u50a8\u8bbe\u5907\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u8fd9\u79cd\u591a\u5c42\u7ea7\u7684\u8bbe\u8ba1\u5e76\u975e\u5076\u7136\uff0c\u800c\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u5bb6\u548c\u5de5\u7a0b\u5e08\u4eec\u7ecf\u8fc7\u6df1\u601d\u719f\u8651\u7684\u7ed3\u679c\u3002

    • \u786c\u76d8\u96be\u4ee5\u88ab\u5185\u5b58\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u5185\u5b58\u4e2d\u7684\u6570\u636e\u5728\u65ad\u7535\u540e\u4f1a\u4e22\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9002\u5408\u957f\u671f\u5b58\u50a8\u6570\u636e\uff1b\u5176\u6b21\uff0c\u5185\u5b58\u7684\u6210\u672c\u662f\u786c\u76d8\u7684\u51e0\u5341\u500d\uff0c\u8fd9\u4f7f\u5f97\u5b83\u96be\u4ee5\u5728\u6d88\u8d39\u8005\u5e02\u573a\u666e\u53ca\u3002
    • \u7f13\u5b58\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96be\u4ee5\u517c\u5f97\u3002\u968f\u7740 L1\u3001L2\u3001L3 \u7f13\u5b58\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u4f1a\u53d8\u5927\uff0c\u4e0e CPU \u6838\u5fc3\u4e4b\u95f4\u7684\u7269\u7406\u8ddd\u79bb\u4f1a\u53d8\u8fdc\uff0c\u4ece\u800c\u5bfc\u81f4\u6570\u636e\u4f20\u8f93\u65f6\u95f4\u589e\u52a0\uff0c\u5143\u7d20\u8bbf\u95ee\u5ef6\u8fdf\u53d8\u9ad8\u3002\u5728\u5f53\u524d\u6280\u672f\u4e0b\uff0c\u591a\u5c42\u7ea7\u7684\u7f13\u5b58\u7ed3\u6784\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u95f4\u7684\u6700\u4f73\u5e73\u8861\u70b9\u3002

    \u56fe 4-9 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf

    Tip

    \u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u5c42\u6b21\u7ed3\u6784\u4f53\u73b0\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u95f4\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5b9e\u9645\u4e0a\uff0c\u8fd9\u79cd\u6743\u8861\u666e\u904d\u5b58\u5728\u4e8e\u6240\u6709\u5de5\u4e1a\u9886\u57df\uff0c\u5b83\u8981\u6c42\u6211\u4eec\u5728\u4e0d\u540c\u7684\u4f18\u52bf\u548c\u9650\u5236\u4e4b\u95f4\u627e\u5230\u6700\u4f73\u5e73\u8861\u70b9\u3002

    \u603b\u7684\u6765\u8bf4\uff0c\u786c\u76d8\u7528\u4e8e\u957f\u671f\u5b58\u50a8\u5927\u91cf\u6570\u636e\uff0c\u5185\u5b58\u7528\u4e8e\u4e34\u65f6\u5b58\u50a8\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\uff0c\u800c\u7f13\u5b58\u5219\u7528\u4e8e\u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5e8f\u8fd0\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u534f\u4f5c\uff0c\u786e\u4fdd\u8ba1\u7b97\u673a\u7cfb\u7edf\u9ad8\u6548\u8fd0\u884c\u3002

    \u5982\u56fe 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4f1a\u4ece\u786c\u76d8\u4e2d\u88ab\u8bfb\u53d6\u5230\u5185\u5b58\u4e2d\uff0c\u4f9b CPU \u8ba1\u7b97\u4f7f\u7528\u3002\u7f13\u5b58\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u901a\u8fc7\u667a\u80fd\u5730\u4ece\u5185\u5b58\u52a0\u8f7d\u6570\u636e\uff0c\u7ed9 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u6570\u636e\u8bfb\u53d6\uff0c\u4ece\u800c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\uff0c\u51cf\u5c11\u5bf9\u8f83\u6162\u7684\u5185\u5b58\u7684\u4f9d\u8d56\u3002

    \u56fe 4-10 \u00a0 \u786c\u76d8\u3001\u5185\u5b58\u548c\u7f13\u5b58\u4e4b\u95f4\u7684\u6570\u636e\u6d41\u901a

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u5185\u5b58\u6548\u7387","text":"

    \u5728\u5185\u5b58\u7a7a\u95f4\u5229\u7528\u65b9\u9762\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5404\u81ea\u5177\u6709\u4f18\u52bf\u548c\u5c40\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u5185\u5b58\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u5757\u5185\u5b58\u4e0d\u80fd\u88ab\u591a\u4e2a\u7a0b\u5e8f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u4eec\u5e0c\u671b\u6570\u636e\u7ed3\u6784\u80fd\u591f\u5c3d\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u95f4\u3002\u6570\u7ec4\u7684\u5143\u7d20\u7d27\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u989d\u5916\u7684\u7a7a\u95f4\u6765\u5b58\u50a8\u94fe\u8868\u8282\u70b9\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u56e0\u6b64\u7a7a\u95f4\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u6570\u7ec4\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u591f\u7684\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u8fd9\u53ef\u80fd\u5bfc\u81f4\u5185\u5b58\u6d6a\u8d39\uff0c\u6570\u7ec4\u6269\u5bb9\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u94fe\u8868\u4ee5\u201c\u8282\u70b9\u201d\u4e3a\u5355\u4f4d\u8fdb\u884c\u52a8\u6001\u5185\u5b58\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u7075\u6d3b\u6027\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u968f\u7740\u53cd\u590d\u7533\u8bf7\u4e0e\u91ca\u653e\u5185\u5b58\uff0c\u7a7a\u95f2\u5185\u5b58\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u4f1a\u8d8a\u6765\u8d8a\u9ad8\uff0c\u4ece\u800c\u5bfc\u81f4\u5185\u5b58\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u6570\u7ec4\u7531\u4e8e\u5176\u8fde\u7eed\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u76f8\u5bf9\u4e0d\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u94fe\u8868\u7684\u5143\u7d20\u662f\u5206\u6563\u5b58\u50a8\u7684\uff0c\u5728\u9891\u7e41\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u7f13\u5b58\u6548\u7387","text":"

    \u7f13\u5b58\u867d\u7136\u5728\u7a7a\u95f4\u5bb9\u91cf\u4e0a\u8fdc\u5c0f\u4e8e\u5185\u5b58\uff0c\u4f46\u5b83\u6bd4\u5185\u5b58\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5e8f\u6267\u884c\u901f\u5ea6\u4e0a\u8d77\u7740\u81f3\u5173\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u4e8e\u7f13\u5b58\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5b58\u50a8\u4e00\u5c0f\u90e8\u5206\u9891\u7e41\u8bbf\u95ee\u7684\u6570\u636e\uff0c\u56e0\u6b64\u5f53 CPU \u5c1d\u8bd5\u8bbf\u95ee\u7684\u6570\u636e\u4e0d\u5728\u7f13\u5b58\u4e2d\u65f6\uff0c\u5c31\u4f1a\u53d1\u751f\u7f13\u5b58\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u65f6 CPU \u4e0d\u5f97\u4e0d\u4ece\u901f\u5ea6\u8f83\u6162\u7684\u5185\u5b58\u4e2d\u52a0\u8f7d\u6240\u9700\u6570\u636e\u3002

    \u663e\u7136\uff0c\u201c\u7f13\u5b58\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8bfb\u5199\u6570\u636e\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5e8f\u6027\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u4eec\u5c06 CPU \u4ece\u7f13\u5b58\u4e2d\u6210\u529f\u83b7\u53d6\u6570\u636e\u7684\u6bd4\u4f8b\u79f0\u4e3a\u7f13\u5b58\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u8fd9\u4e2a\u6307\u6807\u901a\u5e38\u7528\u6765\u8861\u91cf\u7f13\u5b58\u6548\u7387\u3002

    \u4e3a\u4e86\u5c3d\u53ef\u80fd\u8fbe\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u7f13\u5b58\u4f1a\u91c7\u53d6\u4ee5\u4e0b\u6570\u636e\u52a0\u8f7d\u673a\u5236\u3002

    • \u7f13\u5b58\u884c\uff1a\u7f13\u5b58\u4e0d\u662f\u5355\u4e2a\u5b57\u8282\u5730\u5b58\u50a8\u4e0e\u52a0\u8f7d\u6570\u636e\uff0c\u800c\u662f\u4ee5\u7f13\u5b58\u884c\u4e3a\u5355\u4f4d\u3002\u76f8\u6bd4\u4e8e\u5355\u4e2a\u5b57\u8282\u7684\u4f20\u8f93\uff0c\u7f13\u5b58\u884c\u7684\u4f20\u8f93\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
    • \u9884\u53d6\u673a\u5236\uff1a\u5904\u7406\u5668\u4f1a\u5c1d\u8bd5\u9884\u6d4b\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\uff08\u4f8b\u5982\u987a\u5e8f\u8bbf\u95ee\u3001\u56fa\u5b9a\u6b65\u957f\u8df3\u8dc3\u8bbf\u95ee\u7b49\uff09\uff0c\u5e76\u6839\u636e\u7279\u5b9a\u6a21\u5f0f\u5c06\u6570\u636e\u52a0\u8f7d\u81f3\u7f13\u5b58\u4e4b\u4e2d\uff0c\u4ece\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
    • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u9644\u8fd1\u7684\u6570\u636e\u53ef\u80fd\u8fd1\u671f\u4e5f\u4f1a\u88ab\u8bbf\u95ee\u3002\u56e0\u6b64\uff0c\u7f13\u5b58\u5728\u52a0\u8f7d\u67d0\u4e00\u6570\u636e\u65f6\uff0c\u4e5f\u4f1a\u52a0\u8f7d\u5176\u9644\u8fd1\u7684\u6570\u636e\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
    • \u65f6\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u5728\u4e0d\u4e45\u7684\u5c06\u6765\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8bbf\u95ee\u3002\u7f13\u5b58\u5229\u7528\u8fd9\u4e00\u539f\u7406\uff0c\u901a\u8fc7\u4fdd\u7559\u6700\u8fd1\u8bbf\u95ee\u8fc7\u7684\u6570\u636e\u6765\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

    \u5b9e\u9645\u4e0a\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5bf9\u7f13\u5b58\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u3002

    • \u5360\u7528\u7a7a\u95f4\uff1a\u94fe\u8868\u5143\u7d20\u6bd4\u6570\u7ec4\u5143\u7d20\u5360\u7528\u7a7a\u95f4\u66f4\u591a\uff0c\u5bfc\u81f4\u7f13\u5b58\u4e2d\u5bb9\u7eb3\u7684\u6709\u6548\u6570\u636e\u91cf\u66f4\u5c11\u3002
    • \u7f13\u5b58\u884c\uff1a\u94fe\u8868\u6570\u636e\u5206\u6563\u5728\u5185\u5b58\u5404\u5904\uff0c\u800c\u7f13\u5b58\u662f\u201c\u6309\u884c\u52a0\u8f7d\u201d\u7684\uff0c\u56e0\u6b64\u52a0\u8f7d\u5230\u65e0\u6548\u6570\u636e\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
    • \u9884\u53d6\u673a\u5236\uff1a\u6570\u7ec4\u6bd4\u94fe\u8868\u7684\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9884\u6d4b\u6027\u201d\uff0c\u5373\u7cfb\u7edf\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c06\u88ab\u52a0\u8f7d\u7684\u6570\u636e\u3002
    • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u6570\u7ec4\u88ab\u5b58\u50a8\u5728\u96c6\u4e2d\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u56e0\u6b64\u88ab\u52a0\u8f7d\u6570\u636e\u9644\u8fd1\u7684\u6570\u636e\u66f4\u6709\u53ef\u80fd\u5373\u5c06\u88ab\u8bbf\u95ee\u3002

    \u603b\u4f53\u800c\u8a00\uff0c\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u4f18\u4e8e\u94fe\u8868\u3002\u8fd9\u4f7f\u5f97\u5728\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u5f80\u5f80\u66f4\u53d7\u6b22\u8fce\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u7f13\u5b58\u6548\u7387\u5e76\u4e0d\u610f\u5473\u7740\u6570\u7ec4\u5728\u6240\u6709\u60c5\u51b5\u4e0b\u90fd\u4f18\u4e8e\u94fe\u8868\u3002\u5b9e\u9645\u5e94\u7528\u4e2d\u9009\u62e9\u54ea\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u6765\u51b3\u5b9a\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5b9e\u73b0\u201c\u6808\u201d\u6570\u636e\u7ed3\u6784\uff08\u4e0b\u4e00\u7ae0\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\uff09\uff0c\u4f46\u5b83\u4eec\u9002\u7528\u4e8e\u4e0d\u540c\u573a\u666f\u3002

    • \u5728\u505a\u7b97\u6cd5\u9898\u65f6\uff0c\u6211\u4eec\u4f1a\u503e\u5411\u4e8e\u9009\u62e9\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\uff0c\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u968f\u673a\u8bbf\u95ee\u7684\u80fd\u529b\uff0c\u4ee3\u4ef7\u4ec5\u662f\u9700\u8981\u9884\u5148\u4e3a\u6570\u7ec4\u5206\u914d\u4e00\u5b9a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    • \u5982\u679c\u6570\u636e\u91cf\u975e\u5e38\u5927\u3001\u52a8\u6001\u6027\u5f88\u9ad8\u3001\u6808\u7684\u9884\u671f\u5927\u5c0f\u96be\u4ee5\u4f30\u8ba1\uff0c\u90a3\u4e48\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u66f4\u52a0\u5408\u9002\u3002\u94fe\u8868\u80fd\u591f\u5c06\u5927\u91cf\u6570\u636e\u5206\u6563\u5b58\u50a8\u4e8e\u5185\u5b58\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u5e76\u4e14\u907f\u514d\u4e86\u6570\u7ec4\u6269\u5bb9\u4ea7\u751f\u7684\u989d\u5916\u5f00\u9500\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u6570\u7ec4\u548c\u94fe\u8868\u662f\u4e24\u79cd\u57fa\u672c\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5206\u522b\u4ee3\u8868\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u4e24\u79cd\u5b58\u50a8\u65b9\u5f0f\uff1a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\u3002\u4e24\u8005\u7684\u7279\u70b9\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u6027\u3002
    • \u6570\u7ec4\u652f\u6301\u968f\u673a\u8bbf\u95ee\u3001\u5360\u7528\u5185\u5b58\u8f83\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002
    • \u94fe\u8868\u901a\u8fc7\u66f4\u6539\u5f15\u7528\uff08\u6307\u9488\uff09\u5b9e\u73b0\u9ad8\u6548\u7684\u8282\u70b9\u63d2\u5165\u4e0e\u5220\u9664\uff0c\u4e14\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\uff1b\u4f46\u8282\u70b9\u8bbf\u95ee\u6548\u7387\u4f4e\u3001\u5360\u7528\u5185\u5b58\u8f83\u591a\u3002\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u5355\u5411\u94fe\u8868\u3001\u73af\u5f62\u94fe\u8868\u3001\u53cc\u5411\u94fe\u8868\u3002
    • \u5217\u8868\u662f\u4e00\u79cd\u652f\u6301\u589e\u5220\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u3002\u5b83\u4fdd\u7559\u4e86\u6570\u7ec4\u7684\u4f18\u52bf\uff0c\u540c\u65f6\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\u3002
    • \u5217\u8868\u7684\u51fa\u73b0\u5927\u5e45\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
    • \u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u6570\u7ec4\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u5185\u5b58\u7a7a\u95f4\u6548\u7387\uff0c\u800c\u94fe\u8868\u5219\u5728\u5185\u5b58\u4f7f\u7528\u4e0a\u66f4\u52a0\u7075\u6d3b\u3002
    • \u7f13\u5b58\u901a\u8fc7\u7f13\u5b58\u884c\u3001\u9884\u53d6\u673a\u5236\u4ee5\u53ca\u7a7a\u95f4\u5c40\u90e8\u6027\u548c\u65f6\u95f4\u5c40\u90e8\u6027\u7b49\u6570\u636e\u52a0\u8f7d\u673a\u5236\uff0c\u4e3a CPU \u63d0\u4f9b\u5feb\u901f\u6570\u636e\u8bbf\u95ee\uff0c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\u3002
    • \u7531\u4e8e\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u94fe\u8868\u66f4\u9ad8\u6548\u3002\u5728\u9009\u62e9\u6570\u636e\u7ed3\u6784\u65f6\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u548c\u573a\u666f\u505a\u51fa\u6070\u5f53\u9009\u62e9\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6570\u7ec4\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5b58\u50a8\u5728\u5806\u4e0a\uff0c\u5bf9\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u5426\u6709\u5f71\u54cd\uff1f

    \u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5806\u4e0a\u7684\u6570\u7ec4\u90fd\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u6570\u636e\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u6808\u548c\u5806\u5177\u6709\u5404\u81ea\u7684\u7279\u70b9\uff0c\u4ece\u800c\u5bfc\u81f4\u4ee5\u4e0b\u4e0d\u540c\u70b9\u3002

    1. \u5206\u914d\u548c\u91ca\u653e\u6548\u7387\uff1a\u6808\u662f\u4e00\u5757\u8f83\u5c0f\u7684\u5185\u5b58\uff0c\u5206\u914d\u7531\u7f16\u8bd1\u5668\u81ea\u52a8\u5b8c\u6210\uff1b\u800c\u5806\u5185\u5b58\u76f8\u5bf9\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u4ee3\u7801\u4e2d\u52a8\u6001\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u4e0a\u7684\u5206\u914d\u548c\u91ca\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u6808\u4e0a\u7684\u6162\u3002
    2. \u5927\u5c0f\u9650\u5236\uff1a\u6808\u5185\u5b58\u76f8\u5bf9\u8f83\u5c0f\uff0c\u5806\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\u3002\u56e0\u6b64\u5806\u66f4\u52a0\u9002\u5408\u5b58\u50a8\u5927\u578b\u6570\u7ec4\u3002
    3. \u7075\u6d3b\u6027\uff1a\u6808\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u9700\u8981\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\uff0c\u800c\u5806\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u786e\u5b9a\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u6570\u7ec4\u8981\u6c42\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u5374\u6ca1\u6709\u5f3a\u8c03\u76f8\u540c\u7c7b\u578b\u5462\uff1f

    \u94fe\u8868\u7531\u8282\u70b9\u7ec4\u6210\uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u5f15\u7528\uff08\u6307\u9488\uff09\u8fde\u63a5\uff0c\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5b58\u50a8\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

    \u76f8\u5bf9\u5730\uff0c\u6570\u7ec4\u5143\u7d20\u5219\u5fc5\u987b\u662f\u76f8\u540c\u7c7b\u578b\u7684\uff0c\u8fd9\u6837\u624d\u80fd\u901a\u8fc7\u8ba1\u7b97\u504f\u79fb\u91cf\u6765\u83b7\u53d6\u5bf9\u5e94\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u540c\u65f6\u5305\u542b int \u548c long \u4e24\u79cd\u7c7b\u578b\uff0c\u5355\u4e2a\u5143\u7d20\u5206\u522b\u5360\u7528 4 \u5b57\u8282 \u548c 8 \u5b57\u8282 \uff0c\u6b64\u65f6\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5305\u542b\u4e86\u4e24\u79cd\u201c\u5143\u7d20\u957f\u5ea6\u201d\u3002

    # \u5143\u7d20\u5185\u5b58\u5730\u5740 = \u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09 + \u5143\u7d20\u957f\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

    Q\uff1a\u5220\u9664\u8282\u70b9 P \u540e\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8bbe\u4e3a None \u5462\uff1f

    \u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u4ece\u8be5\u94fe\u8868\u7684\u89d2\u5ea6\u770b\uff0c\u4ece\u5934\u8282\u70b9\u904d\u5386\u5230\u5c3e\u8282\u70b9\u5df2\u7ecf\u4e0d\u4f1a\u9047\u5230 P \u4e86\u3002\u8fd9\u610f\u5473\u7740\u8282\u70b9 P \u5df2\u7ecf\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u4e86\uff0c\u6b64\u65f6\u8282\u70b9 P \u6307\u5411\u54ea\u91cc\u90fd\u4e0d\u4f1a\u5bf9\u8be5\u94fe\u8868\u4ea7\u751f\u5f71\u54cd\u3002

    \u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff08\u505a\u9898\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65ad\u5f00\u6ca1\u6709\u5173\u7cfb\uff0c\u53ea\u8981\u4fdd\u8bc1\u7a0b\u5e8f\u7684\u903b\u8f91\u662f\u6b63\u786e\u7684\u5c31\u884c\u3002\u4ece\u6807\u51c6\u5e93\u7684\u89d2\u5ea6\u770b\uff0c\u65ad\u5f00\u66f4\u52a0\u5b89\u5168\u3001\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65ad\u5f00\uff0c\u5047\u8bbe\u88ab\u5220\u9664\u8282\u70b9\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u4e48\u5b83\u4f1a\u5f71\u54cd\u540e\u7ee7\u8282\u70b9\u7684\u5185\u5b58\u56de\u6536\u3002

    Q\uff1a\u5728\u94fe\u8868\u4e2d\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u5220\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u67e5\u627e\u5143\u7d20\uff0c\u90a3\u4e3a\u4ec0\u4e48\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

    \u5982\u679c\u662f\u5148\u67e5\u627e\u5143\u7d20\u3001\u518d\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u786e\u5b9e\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u94fe\u8868\u7684 \\(O(1)\\) \u589e\u5220\u7684\u4f18\u52bf\u53ef\u4ee5\u5728\u5176\u4ed6\u5e94\u7528\u4e0a\u5f97\u5230\u4f53\u73b0\u3002\u4f8b\u5982\uff0c\u53cc\u5411\u961f\u5217\u9002\u5408\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u7ef4\u62a4\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u59cb\u7ec8\u6307\u5411\u5934\u8282\u70b9\u3001\u5c3e\u8282\u70b9\uff0c\u6bcf\u6b21\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

    Q\uff1a\u56fe\u201c\u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f\u201d\u4e2d\uff0c\u6d45\u84dd\u8272\u7684\u5b58\u50a8\u8282\u70b9\u6307\u9488\u662f\u5360\u7528\u4e00\u5757\u5185\u5b58\u5730\u5740\u5417\uff1f\u8fd8\u662f\u548c\u8282\u70b9\u503c\u5404\u5360\u4e00\u534a\u5462\uff1f

    \u8be5\u793a\u610f\u56fe\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

    • \u4e0d\u540c\u7c7b\u578b\u7684\u8282\u70b9\u503c\u5360\u7528\u7684\u7a7a\u95f4\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u5b9e\u4f8b\u5bf9\u8c61\u7b49\u3002
    • \u6307\u9488\u53d8\u91cf\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u5927\u5c0f\u6839\u636e\u6240\u4f7f\u7528\u7684\u64cd\u4f5c\u7cfb\u7edf\u53ca\u7f16\u8bd1\u73af\u5883\u800c\u5b9a\uff0c\u5927\u591a\u4e3a 8 \u5b57\u8282\u6216 4 \u5b57\u8282\u3002

    Q\uff1a\u5728\u5217\u8868\u672b\u5c3e\u6dfb\u52a0\u5143\u7d20\u662f\u5426\u65f6\u65f6\u523b\u523b\u90fd\u4e3a \\(O(1)\\) \uff1f

    \u5982\u679c\u6dfb\u52a0\u5143\u7d20\u65f6\u8d85\u51fa\u5217\u8868\u957f\u5ea6\uff0c\u5219\u9700\u8981\u5148\u6269\u5bb9\u5217\u8868\u518d\u6dfb\u52a0\u3002\u7cfb\u7edf\u4f1a\u7533\u8bf7\u4e00\u5757\u65b0\u7684\u5185\u5b58\uff0c\u5e76\u5c06\u539f\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u642c\u8fd0\u8fc7\u53bb\uff0c\u8fd9\u65f6\u5019\u65f6\u95f4\u590d\u6742\u5ea6\u5c31\u4f1a\u662f \\(O(n)\\) \u3002

    Q\uff1a\u201c\u5217\u8868\u7684\u51fa\u73b0\u6781\u5927\u5730\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u201d\uff0c\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u662f\u6307\u989d\u5916\u589e\u52a0\u7684\u53d8\u91cf\u5982\u5bb9\u91cf\u3001\u957f\u5ea6\u3001\u6269\u5bb9\u500d\u6570\u6240\u5360\u7684\u5185\u5b58\u5417\uff1f

    \u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u4e3b\u8981\u6709\u4e24\u65b9\u9762\u542b\u4e49\uff1a\u4e00\u65b9\u9762\uff0c\u5217\u8868\u90fd\u4f1a\u8bbe\u5b9a\u4e00\u4e2a\u521d\u59cb\u957f\u5ea6\uff0c\u6211\u4eec\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u8fd9\u4e48\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u4e3a\u4e86\u9632\u6b62\u9891\u7e41\u6269\u5bb9\uff0c\u6269\u5bb9\u4e00\u822c\u4f1a\u4e58\u4ee5\u4e00\u4e2a\u7cfb\u6570\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u8fd9\u6837\u4e00\u6765\uff0c\u4e5f\u4f1a\u51fa\u73b0\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u4eec\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6ee1\u5b83\u4eec\u3002

    Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u540e\uff0c\u8fd9 3 \u4e2a\u5143\u7d20\u7684\u5730\u5740\u662f\u76f8\u8fde\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u4f1a\u53d1\u73b0\u5b83\u4eec\u6bcf\u4e2a\u5143\u7d20\u7684 id \u5e76\u4e0d\u662f\u8fde\u7eed\u7684\uff0c\u800c\u662f\u5206\u522b\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u8fd9\u4e9b\u5143\u7d20\u7684\u5730\u5740\u4e0d\u8fde\u7eed\uff0c\u90a3\u4e48 m \u8fd8\u662f\u6570\u7ec4\u5417\uff1f

    \u5047\u5982\u628a\u5217\u8868\u5143\u7d20\u6362\u6210\u94fe\u8868\u8282\u70b9 n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u8fd9 5 \u4e2a\u8282\u70b9\u5bf9\u8c61\u4e5f\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\u3002\u7136\u800c\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u5217\u8868\u7d22\u5f15\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u8282\u70b9\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u8bbf\u95ee\u5230\u5bf9\u5e94\u7684\u8282\u70b9\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5b58\u50a8\u7684\u662f\u8282\u70b9\u7684\u5f15\u7528\uff0c\u800c\u975e\u8282\u70b9\u672c\u8eab\u3002

    \u4e0e\u8bb8\u591a\u8bed\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6570\u5b57\u4e5f\u88ab\u5305\u88c5\u4e3a\u5bf9\u8c61\uff0c\u5217\u8868\u4e2d\u5b58\u50a8\u7684\u4e0d\u662f\u6570\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5bf9\u6570\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f1a\u53d1\u73b0\u4e24\u4e2a\u6570\u7ec4\u4e2d\u7684\u76f8\u540c\u6570\u5b57\u62e5\u6709\u540c\u4e00\u4e2a id \uff0c\u5e76\u4e14\u8fd9\u4e9b\u6570\u5b57\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

    Q\uff1aC++ STL \u91cc\u9762\u7684 std::list \u5df2\u7ecf\u5b9e\u73b0\u4e86\u53cc\u5411\u94fe\u8868\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u7b97\u6cd5\u4e66\u4e0a\u4e0d\u600e\u4e48\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u4e3a\u6709\u4ec0\u4e48\u5c40\u9650\u6027\u5462\uff1f

    \u4e00\u65b9\u9762\uff0c\u6211\u4eec\u5f80\u5f80\u66f4\u9752\u7750\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u65f6\u624d\u4f7f\u7528\u94fe\u8868\uff0c\u4e3b\u8981\u6709\u4e24\u4e2a\u539f\u56e0\u3002

    • \u7a7a\u95f4\u5f00\u9500\uff1a\u7531\u4e8e\u6bcf\u4e2a\u5143\u7d20\u9700\u8981\u4e24\u4e2a\u989d\u5916\u7684\u6307\u9488\uff08\u4e00\u4e2a\u7528\u4e8e\u524d\u4e00\u4e2a\u5143\u7d20\uff0c\u4e00\u4e2a\u7528\u4e8e\u540e\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u5360\u7528\u7a7a\u95f4\u3002
    • \u7f13\u5b58\u4e0d\u53cb\u597d\uff1a\u7531\u4e8e\u6570\u636e\u4e0d\u662f\u8fde\u7eed\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5bf9\u7f13\u5b58\u7684\u5229\u7528\u7387\u8f83\u4f4e\u3002\u4e00\u822c\u60c5\u51b5\u4e0b\uff0cstd::vector \u7684\u6027\u80fd\u4f1a\u66f4\u597d\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u94fe\u8868\u7684\u60c5\u51b5\u4e3b\u8981\u662f\u4e8c\u53c9\u6811\u548c\u56fe\u3002\u6808\u548c\u961f\u5217\u5f80\u5f80\u4f1a\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u94fe\u8868\u3002

    Q\uff1a\u521d\u59cb\u5316\u5217\u8868 res = [0] * self.size() \u64cd\u4f5c\uff0c\u4f1a\u5bfc\u81f4 res \u7684\u6bcf\u4e2a\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u5730\u5740\u5417\uff1f

    \u4e0d\u4f1a\u3002\u4f46\u4e8c\u7ef4\u6570\u7ec4\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7ef4\u5217\u8868 res = [[0]] * self.size() \uff0c\u5219\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u4e2a\u5217\u8868 [0] \u3002

    "},{"location":"chapter_backtracking/","title":"\u7b2c 13 \u7ae0 \u00a0 \u56de\u6eaf","text":"

    Abstract

    \u6211\u4eec\u5982\u540c\u8ff7\u5bab\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u8fdb\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u4f1a\u9047\u5230\u56f0\u96be\u3002

    \u56de\u6eaf\u7684\u529b\u91cf\u8ba9\u6211\u4eec\u80fd\u591f\u91cd\u65b0\u5f00\u59cb\uff0c\u4e0d\u65ad\u5c1d\u8bd5\uff0c\u6700\u7ec8\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

    "},{"location":"chapter_backtracking/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5
    • 13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898
    • 13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898
    • 13.4 \u00a0 N \u7687\u540e\u95ee\u9898
    • 13.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_backtracking/backtracking_algorithm/","title":"13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5","text":"

    \u56de\u6eaf\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u79cd\u901a\u8fc7\u7a77\u4e3e\u6765\u89e3\u51b3\u95ee\u9898\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u4ece\u4e00\u4e2a\u521d\u59cb\u72b6\u6001\u51fa\u53d1\uff0c\u66b4\u529b\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u5f53\u9047\u5230\u6b63\u786e\u7684\u89e3\u5219\u5c06\u5176\u8bb0\u5f55\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5c1d\u8bd5\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u90fd\u65e0\u6cd5\u627e\u5230\u89e3\u4e3a\u6b62\u3002

    \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u6765\u904d\u5386\u89e3\u7a7a\u95f4\u3002\u5728\u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5229\u7528\u524d\u5e8f\u904d\u5386\u6784\u9020\u4e00\u4e2a\u56de\u6eaf\u95ee\u9898\uff0c\u9010\u6b65\u4e86\u89e3\u56de\u6eaf\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u4f8b\u9898\u4e00

    \u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\uff0c\u641c\u7d22\u5e76\u8bb0\u5f55\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u8282\u70b9\u5217\u8868\u3002

    \u5bf9\u4e8e\u6b64\u9898\uff0c\u6211\u4eec\u524d\u5e8f\u904d\u5386\u8fd9\u68f5\u6811\uff0c\u5e76\u5224\u65ad\u5f53\u524d\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \uff0c\u82e5\u662f\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u7684\u503c\u52a0\u5165\u7ed3\u679c\u5217\u8868 res \u4e4b\u4e2d\u3002\u76f8\u5173\u8fc7\u7a0b\u5b9e\u73b0\u5982\u56fe 13-1 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
    preorder_traversal_i_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
    preorder_traversal_i_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
    preorder_traversal_i_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, root)\n    }\n    preOrderI(root.Left, res)\n    preOrderI(root.Right, res)\n}\n
    preorder_traversal_i_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(root)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n
    preorder_traversal_i_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.dart
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(root);\n  }\n  preOrder(root.left, res);\n  preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.rs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<&Rc<RefCell<TreeNode>>>) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.as_ref());\n        pre_order(res, node.borrow().right.as_ref());\n    }\n}\n
    preorder_traversal_i_compact.c
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.kt
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
    preorder_traversal_i_compact.rb
    ### \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 ###\ndef pre_order(root)\n  return unless root\n\n  # \u8bb0\u5f55\u89e3\n  $res << root if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\nend\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 13-1 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u4e2d\u641c\u7d22\u8282\u70b9

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000","text":"

    \u4e4b\u6240\u4ee5\u79f0\u4e4b\u4e3a\u56de\u6eaf\u7b97\u6cd5\uff0c\u662f\u56e0\u4e3a\u8be5\u7b97\u6cd5\u5728\u641c\u7d22\u89e3\u7a7a\u95f4\u65f6\u4f1a\u91c7\u7528\u201c\u5c1d\u8bd5\u201d\u4e0e\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u5f53\u7b97\u6cd5\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u9047\u5230\u67d0\u4e2a\u72b6\u6001\u65e0\u6cd5\u7ee7\u7eed\u524d\u8fdb\u6216\u65e0\u6cd5\u5f97\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u65f6\uff0c\u5b83\u4f1a\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u5c1d\u8bd5\u5176\u4ed6\u53ef\u80fd\u7684\u9009\u62e9\u3002

    \u5bf9\u4e8e\u4f8b\u9898\u4e00\uff0c\u8bbf\u95ee\u6bcf\u4e2a\u8282\u70b9\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5c1d\u8bd5\u201d\uff0c\u800c\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u8fd4\u56de\u7236\u8282\u70b9\u7684 return \u5219\u8868\u793a\u201c\u56de\u9000\u201d\u3002

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u56de\u9000\u5e76\u4e0d\u4ec5\u4ec5\u5305\u62ec\u51fd\u6570\u8fd4\u56de\u3002\u4e3a\u89e3\u91ca\u8fd9\u4e00\u70b9\uff0c\u6211\u4eec\u5bf9\u4f8b\u9898\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

    \u4f8b\u9898\u4e8c

    \u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\u3002

    \u5728\u4f8b\u9898\u4e00\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u5217\u8868 path \u8bb0\u5f55\u8bbf\u95ee\u8fc7\u7684\u8282\u70b9\u8def\u5f84\u3002\u5f53\u8bbf\u95ee\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u590d\u5236 path \u5e76\u6dfb\u52a0\u8fdb\u7ed3\u679c\u5217\u8868 res \u3002\u904d\u5386\u5b8c\u6210\u540e\uff0cres \u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
    preorder_traversal_ii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
    preorder_traversal_ii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
    preorder_traversal_ii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_ii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderII(root.Left, res, path)\n    preOrderII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_ii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
    preorder_traversal_ii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_ii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_ii_compact.dart
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
    preorder_traversal_ii_compact.rs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<&Rc<RefCell<TreeNode>>>,\n) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_ii_compact.c
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; ++i) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
    preorder_traversal_ii_compact.kt
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
    preorder_traversal_ii_compact.rb
    ### \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c ###\ndef pre_order(root)\n  return unless root\n\n  # \u5c1d\u8bd5\n  $path << root\n\n  # \u8bb0\u5f55\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_ii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5728\u6bcf\u6b21\u201c\u5c1d\u8bd5\u201d\u4e2d\uff0c\u6211\u4eec\u901a\u8fc7\u5c06\u5f53\u524d\u8282\u70b9\u6dfb\u52a0\u8fdb path \u6765\u8bb0\u5f55\u8def\u5f84\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u4eec\u9700\u8981\u5c06\u8be5\u8282\u70b9\u4ece path \u4e2d\u5f39\u51fa\uff0c\u4ee5\u6062\u590d\u672c\u6b21\u5c1d\u8bd5\u4e4b\u524d\u7684\u72b6\u6001\u3002

    \u89c2\u5bdf\u56fe 13-2 \u6240\u793a\u7684\u8fc7\u7a0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5c1d\u8bd5\u548c\u56de\u9000\u7406\u89e3\u4e3a\u201c\u524d\u8fdb\u201d\u4e0e\u201c\u64a4\u9500\u201d\uff0c\u4e24\u4e2a\u64cd\u4f5c\u4e92\u4e3a\u9006\u5411\u3002

    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 13-2 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1312","title":"13.1.2 \u00a0 \u526a\u679d","text":"

    \u590d\u6742\u7684\u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u7ea6\u675f\u6761\u4ef6\u901a\u5e38\u53ef\u7528\u4e8e\u201c\u526a\u679d\u201d\u3002

    \u4f8b\u9898\u4e09

    \u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\uff0c\u5e76\u8981\u6c42\u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u3002

    \u4e3a\u4e86\u6ee1\u8db3\u4ee5\u4e0a\u7ea6\u675f\u6761\u4ef6\uff0c\u6211\u4eec\u9700\u8981\u6dfb\u52a0\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\uff0c\u5219\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
    preorder_traversal_iii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
    preorder_traversal_iii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
    preorder_traversal_iii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_iii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderIII(root.Left, res, path)\n    preOrderIII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_iii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
    preorder_traversal_iii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_iii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_iii_compact.dart
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null || root.val == 3) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
    preorder_traversal_iii_compact.rs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<&Rc<RefCell<TreeNode>>>,\n) {\n    // \u526a\u679d\n    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_iii_compact.c
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; i++) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
    preorder_traversal_iii_compact.kt
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
    preorder_traversal_iii_compact.rb
    ### \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 ###\ndef pre_order(root)\n  # \u526a\u679d\n  return if !root || root.val == 3\n\n  # \u5c1d\u8bd5\n  $path.append(root)\n\n  # \u8bb0\u5f55\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_iii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u201c\u526a\u679d\u201d\u662f\u4e00\u4e2a\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8bcd\u3002\u5982\u56fe 13-3 \u6240\u793a\uff0c\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u641c\u7d22\u5206\u652f\uff0c\u907f\u514d\u8bb8\u591a\u65e0\u610f\u4e49\u7684\u5c1d\u8bd5\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u641c\u7d22\u6548\u7387\u3002

    \u56fe 13-3 \u00a0 \u6839\u636e\u7ea6\u675f\u6761\u4ef6\u526a\u679d

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u4ee3\u7801","text":"

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c1d\u8bd5\u5c06\u56de\u6eaf\u7684\u201c\u5c1d\u8bd5\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u4f53\u6846\u67b6\u63d0\u70bc\u51fa\u6765\uff0c\u63d0\u5347\u4ee3\u7801\u7684\u901a\u7528\u6027\u3002

    \u5728\u4ee5\u4e0b\u6846\u67b6\u4ee3\u7801\u4e2d\uff0cstate \u8868\u793a\u95ee\u9898\u7684\u5f53\u524d\u72b6\u6001\uff0cchoices \u8868\u793a\u5f53\u524d\u72b6\u6001\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9009\u62e9\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    ### \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 ###\ndef backtrack(state, choices, res)\n    # \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution?(state)\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n        return\n    end\n\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices\n        # \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid?(state, choice)\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n        end\n    end\nend\n
    \n

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u57fa\u4e8e\u6846\u67b6\u4ee3\u7801\u6765\u89e3\u51b3\u4f8b\u9898\u4e09\u3002\u72b6\u6001 state \u4e3a\u8282\u70b9\u904d\u5386\u8def\u5f84\uff0c\u9009\u62e9 choices \u4e3a\u5f53\u524d\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\uff0c\u7ed3\u679c res \u662f\u8def\u5f84\u5217\u8868\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
    def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8bb0\u5f55\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5\"\"\"\n    return choice is not None and choice.val != 3\n\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u66f4\u65b0\u72b6\u6001\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u590d\u72b6\u6001\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
    preorder_traversal_iii_template.cpp
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.java
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.cs
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.go
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.swift
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.js
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.ts
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.dart
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
    preorder_traversal_iii_template.rs
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.last().unwrap().borrow().val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfn record_solution(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    res.push(state.clone());\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Option<&Rc<RefCell<TreeNode>>>) -> bool {\n    return choice.is_some() && choice.unwrap().borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &Vec<Option<&Rc<RefCell<TreeNode>>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for &choice in choices.iter() {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice.unwrap().clone());\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(\n                state,\n                &vec![\n                    choice.unwrap().borrow().left.as_ref(),\n                    choice.unwrap().borrow().right.as_ref(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice.unwrap().clone());\n        }\n    }\n}\n
    preorder_traversal_iii_template.c
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(void) {\n    for (int i = 0; i < pathSize; i++) {\n        res[resSize][i] = path[i];\n    }\n    resSize++;\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution()) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution();\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice();\n        }\n    }\n}\n
    preorder_traversal_iii_template.kt
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.rb
    ### \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n### \u8bb0\u5f55\u89e3 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n### \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n### \u66f4\u65b0\u72b6\u6001 ###\ndef make_choice(state, choice)\n  state << choice\nend\n\n### \u6062\u590d\u72b6\u6001 ###\ndef undo_choice(state, choice)\n  state.pop\nend\n\n### \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 ###\ndef backtrack(state, choices, res)\n  # \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n  record_solution(state, res) if is_solution?(state)\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  for choice in choices\n    # \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if is_valid?(state, choice)\n      # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      make_choice(state, choice)\n      # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, [choice.left, choice.right], res)\n      # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undo_choice(state, choice)\n    end\n  end\nend\n
    preorder_traversal_iii_template.zig
    [class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6839\u636e\u9898\u610f\uff0c\u6211\u4eec\u5728\u627e\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u540e\u5e94\u8be5\u7ee7\u7eed\u641c\u7d22\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u8bb0\u5f55\u89e3\u4e4b\u540e\u7684 return \u8bed\u53e5\u5220\u9664\u3002\u56fe 13-4 \u5bf9\u6bd4\u4e86\u4fdd\u7559\u6216\u5220\u9664 return \u8bed\u53e5\u7684\u641c\u7d22\u8fc7\u7a0b\u3002

    \u56fe 13-4 \u00a0 \u4fdd\u7559\u4e0e\u5220\u9664 return \u7684\u641c\u7d22\u8fc7\u7a0b\u5bf9\u6bd4

    \u76f8\u6bd4\u57fa\u4e8e\u524d\u5e8f\u904d\u5386\u7684\u4ee3\u7801\u5b9e\u73b0\uff0c\u57fa\u4e8e\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\u7684\u4ee3\u7801\u5b9e\u73b0\u867d\u7136\u663e\u5f97\u5570\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u56de\u6eaf\u95ee\u9898\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u53ea\u9700\u6839\u636e\u5177\u4f53\u95ee\u9898\u6765\u5b9a\u4e49 state \u548c choices \uff0c\u5e76\u5b9e\u73b0\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u65b9\u6cd5\u5373\u53ef\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4 \u00a0 \u5e38\u7528\u672f\u8bed","text":"

    \u4e3a\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u7b97\u6cd5\u95ee\u9898\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e0b\u56de\u6eaf\u7b97\u6cd5\u4e2d\u5e38\u7528\u672f\u8bed\u7684\u542b\u4e49\uff0c\u5e76\u5bf9\u7167\u4f8b\u9898\u4e09\u7ed9\u51fa\u5bf9\u5e94\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

    \u8868 13-1 \u00a0 \u5e38\u89c1\u7684\u56de\u6eaf\u7b97\u6cd5\u672f\u8bed

    \u540d\u8bcd \u5b9a\u4e49 \u4f8b\u9898\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6ee1\u8db3\u95ee\u9898\u7279\u5b9a\u6761\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u4e2a\u6216\u591a\u4e2a \u6839\u8282\u70b9\u5230\u8282\u70b9 \\(7\\) \u7684\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u6240\u6709\u8def\u5f84 \u7ea6\u675f\u6761\u4ef6\uff08constraint\uff09 \u7ea6\u675f\u6761\u4ef6\u662f\u95ee\u9898\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u6761\u4ef6\uff0c\u901a\u5e38\u7528\u4e8e\u526a\u679d \u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u8282\u70b9 \\(3\\) \u72b6\u6001\uff08state\uff09 \u72b6\u6001\u8868\u793a\u95ee\u9898\u5728\u67d0\u4e00\u65f6\u523b\u7684\u60c5\u51b5\uff0c\u5305\u62ec\u5df2\u7ecf\u505a\u51fa\u7684\u9009\u62e9 \u5f53\u524d\u5df2\u8bbf\u95ee\u7684\u8282\u70b9\u8def\u5f84\uff0c\u5373 path \u8282\u70b9\u5217\u8868 \u5c1d\u8bd5\uff08attempt\uff09 \u5c1d\u8bd5\u662f\u6839\u636e\u53ef\u7528\u9009\u62e9\u6765\u63a2\u7d22\u89e3\u7a7a\u95f4\u7684\u8fc7\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\uff0c\u68c0\u67e5\u662f\u5426\u4e3a\u89e3 \u9012\u5f52\u8bbf\u95ee\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\uff0c\u5c06\u8282\u70b9\u6dfb\u52a0\u8fdb path \uff0c\u5224\u65ad\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u72b6\u6001\u65f6\uff0c\u64a4\u9500\u524d\u9762\u505a\u51fa\u7684\u9009\u62e9\uff0c\u56de\u5230\u4e0a\u4e00\u4e2a\u72b6\u6001 \u5f53\u8d8a\u8fc7\u53f6\u8282\u70b9\u3001\u7ed3\u675f\u8282\u70b9\u8bbf\u95ee\u3001\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\u7ec8\u6b62\u641c\u7d22\uff0c\u51fd\u6570\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u636e\u95ee\u9898\u7279\u6027\u548c\u7ea6\u675f\u6761\u4ef6\u907f\u514d\u65e0\u610f\u4e49\u7684\u641c\u7d22\u8def\u5f84\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u7d22\u6548\u7387 \u5f53\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22

    Tip

    \u95ee\u9898\u3001\u89e3\u3001\u72b6\u6001\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u4e0a\u662f\u4e00\u79cd\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u7b97\u6cd5\uff0c\u5b83\u5c1d\u8bd5\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\u76f4\u5230\u627e\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u5728\u4e8e\u80fd\u591f\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e14\u5728\u5408\u7406\u7684\u526a\u679d\u64cd\u4f5c\u4e0b\uff0c\u5177\u6709\u5f88\u9ad8\u7684\u6548\u7387\u3002

    \u7136\u800c\uff0c\u5728\u5904\u7406\u5927\u89c4\u6a21\u6216\u8005\u590d\u6742\u95ee\u9898\u65f6\uff0c\u56de\u6eaf\u7b97\u6cd5\u7684\u8fd0\u884c\u6548\u7387\u53ef\u80fd\u96be\u4ee5\u63a5\u53d7\u3002

    • \u65f6\u95f4\uff1a\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u904d\u5386\u72b6\u6001\u7a7a\u95f4\u7684\u6240\u6709\u53ef\u80fd\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u6307\u6570\u9636\u6216\u9636\u4e58\u9636\u3002
    • \u7a7a\u95f4\uff1a\u5728\u9012\u5f52\u8c03\u7528\u4e2d\u9700\u8981\u4fdd\u5b58\u5f53\u524d\u7684\u72b6\u6001\uff08\u4f8b\u5982\u8def\u5f84\u3001\u7528\u4e8e\u526a\u679d\u7684\u8f85\u52a9\u53d8\u91cf\u7b49\uff09\uff0c\u5f53\u6df1\u5ea6\u5f88\u5927\u65f6\uff0c\u7a7a\u95f4\u9700\u6c42\u53ef\u80fd\u4f1a\u53d8\u5f97\u5f88\u5927\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u7684\u6700\u4f73\u89e3\u51b3\u65b9\u6848\u3002\u5bf9\u4e8e\u8fd9\u4e9b\u95ee\u9898\uff0c\u7531\u4e8e\u65e0\u6cd5\u9884\u6d4b\u54ea\u4e9b\u9009\u62e9\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u4eec\u5fc5\u987b\u5bf9\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u8fdb\u884c\u904d\u5386\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5173\u952e\u662f\u5982\u4f55\u4f18\u5316\u6548\u7387\uff0c\u5e38\u89c1\u7684\u6548\u7387\u4f18\u5316\u65b9\u6cd5\u6709\u4e24\u79cd\u3002

    • \u526a\u679d\uff1a\u907f\u514d\u641c\u7d22\u90a3\u4e9b\u80af\u5b9a\u4e0d\u4f1a\u4ea7\u751f\u89e3\u7684\u8def\u5f84\uff0c\u4ece\u800c\u8282\u7701\u65f6\u95f4\u548c\u7a7a\u95f4\u3002
    • \u542f\u53d1\u5f0f\u641c\u7d22\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8ba1\u503c\uff0c\u4ece\u800c\u4f18\u5148\u641c\u7d22\u6700\u6709\u53ef\u80fd\u4ea7\u751f\u6709\u6548\u89e3\u7684\u8def\u5f84\u3002
    "},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u9898","text":"

    \u56de\u6eaf\u7b97\u6cd5\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u641c\u7d22\u95ee\u9898\u3001\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u548c\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u3002

    \u641c\u7d22\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u89e3\u51b3\u65b9\u6848\u3002

    • \u5168\u6392\u5217\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7ec4\u5408\u3002
    • \u5b50\u96c6\u548c\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\u548c\u4e00\u4e2a\u76ee\u6807\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u4e3a\u76ee\u6807\u548c\u7684\u5b50\u96c6\u3002
    • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5706\u76d8\uff0c\u8981\u6c42\u5c06\u6240\u6709\u5706\u76d8\u4ece\u4e00\u6839\u67f1\u5b50\u79fb\u52a8\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\uff0c\u4e14\u4e0d\u80fd\u5c06\u5927\u5706\u76d8\u653e\u5728\u5c0f\u5706\u76d8\u4e0a\u3002

    \u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u6240\u6709\u7ea6\u675f\u6761\u4ef6\u7684\u89e3\u3002

    • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76d8\u4e0a\u653e\u7f6e \\(n\\) \u4e2a\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u4eec\u4e92\u4e0d\u653b\u51fb\u3002
    • \u6570\u72ec\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7f51\u683c\u4e2d\u586b\u5165\u6570\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u4e2a \\(3 \\times 3\\) \u5b50\u7f51\u683c\u4e2d\u7684\u6570\u5b57\u4e0d\u91cd\u590d\u3002
    • \u56fe\u7740\u8272\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u7528\u6700\u5c11\u7684\u989c\u8272\u7ed9\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u7740\u8272\uff0c\u4f7f\u5f97\u76f8\u90bb\u9876\u70b9\u989c\u8272\u4e0d\u540c\u3002

    \u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u4e00\u4e2a\u7ec4\u5408\u7a7a\u95f4\u4e2d\u627e\u5230\u6ee1\u8db3\u67d0\u4e9b\u6761\u4ef6\u7684\u6700\u4f18\u89e3\u3002

    • 0-1 \u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u80cc\u5305\uff0c\u6bcf\u4e2a\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u4ef7\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5185\uff0c\u9009\u62e9\u7269\u54c1\u4f7f\u5f97\u603b\u4ef7\u503c\u6700\u5927\u3002
    • \u65c5\u884c\u5546\u95ee\u9898\uff1a\u5728\u4e00\u4e2a\u56fe\u4e2d\uff0c\u4ece\u4e00\u4e2a\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u6240\u6709\u5176\u4ed6\u70b9\u6070\u597d\u4e00\u6b21\u540e\u8fd4\u56de\u8d77\u70b9\uff0c\u6c42\u6700\u77ed\u8def\u5f84\u3002
    • \u6700\u5927\u56e2\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u56fe\uff0c\u5373\u5b50\u56fe\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u90fd\u6709\u8fb9\u76f8\u8fde\u3002

    \u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u4f18\u89e3\u51b3\u65b9\u6848\u3002

    • 0-1 \u80cc\u5305\u95ee\u9898\u901a\u5e38\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\uff0c\u4ee5\u8fbe\u5230\u66f4\u9ad8\u7684\u65f6\u95f4\u6548\u7387\u3002
    • \u65c5\u884c\u5546\u662f\u4e00\u4e2a\u8457\u540d\u7684 NP-Hard \u95ee\u9898\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u9057\u4f20\u7b97\u6cd5\u548c\u8681\u7fa4\u7b97\u6cd5\u7b49\u3002
    • \u6700\u5927\u56e2\u95ee\u9898\u662f\u56fe\u8bba\u4e2d\u7684\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\uff0c\u53ef\u7528\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u542f\u53d1\u5f0f\u7b97\u6cd5\u6765\u89e3\u51b3\u3002
    "},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u95ee\u9898","text":"

    Question

    \u6839\u636e\u56fd\u9645\u8c61\u68cb\u7684\u89c4\u5219\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u51fb\u4e0e\u540c\u5904\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u6761\u659c\u7ebf\u4e0a\u7684\u68cb\u5b50\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u7687\u540e\u548c\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5bfb\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u95f4\u65e0\u6cd5\u76f8\u4e92\u653b\u51fb\u7684\u6446\u653e\u65b9\u6848\u3002

    \u5982\u56fe 13-15 \u6240\u793a\uff0c\u5f53 \\(n = 4\\) \u65f6\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u4e24\u4e2a\u89e3\u3002\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\u5171\u6709 \\(n^2\\) \u4e2a\u683c\u5b50\uff0c\u7ed9\u51fa\u4e86\u6240\u6709\u7684\u9009\u62e9 choices \u3002\u5728\u9010\u4e2a\u653e\u7f6e\u7687\u540e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u68cb\u76d8\u72b6\u6001\u5728\u4e0d\u65ad\u5730\u53d8\u5316\uff0c\u6bcf\u4e2a\u65f6\u523b\u7684\u68cb\u76d8\u5c31\u662f\u72b6\u6001 state \u3002

    \u56fe 13-15 \u00a0 4 \u7687\u540e\u95ee\u9898\u7684\u89e3

    \u56fe 13-16 \u5c55\u793a\u4e86\u672c\u9898\u7684\u4e09\u4e2a\u7ea6\u675f\u6761\u4ef6\uff1a\u591a\u4e2a\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u6761\u5bf9\u89d2\u7ebf\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u89d2\u7ebf\u5206\u4e3a\u4e3b\u5bf9\u89d2\u7ebf \\ \u548c\u6b21\u5bf9\u89d2\u7ebf / \u4e24\u79cd\u3002

    \u56fe 13-16 \u00a0 n \u7687\u540e\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6

    "},{"location":"chapter_backtracking/n_queens_problem/#1","title":"1. \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565","text":"

    \u7687\u540e\u7684\u6570\u91cf\u548c\u68cb\u76d8\u7684\u884c\u6570\u90fd\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u6211\u4eec\u5bb9\u6613\u5f97\u5230\u4e00\u4e2a\u63a8\u8bba\uff1a\u68cb\u76d8\u6bcf\u884c\u90fd\u5141\u8bb8\u4e14\u53ea\u5141\u8bb8\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u4ece\u7b2c\u4e00\u884c\u5f00\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\uff0c\u76f4\u81f3\u6700\u540e\u4e00\u884c\u7ed3\u675f\u3002

    \u56fe 13-17 \u6240\u793a\u4e3a 4 \u7687\u540e\u95ee\u9898\u7684\u9010\u884c\u653e\u7f6e\u8fc7\u7a0b\u3002\u53d7\u753b\u5e45\u9650\u5236\uff0c\u56fe 13-17 \u4ec5\u5c55\u5f00\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u4e2a\u641c\u7d22\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u4e0d\u6ee1\u8db3\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u65b9\u6848\u90fd\u8fdb\u884c\u4e86\u526a\u679d\u3002

    \u56fe 13-17 \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9010\u884c\u653e\u7f6e\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73b0\u591a\u4e2a\u7687\u540e\u7684\u6240\u6709\u641c\u7d22\u5206\u652f\u3002

    "},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u4e0e\u5bf9\u89d2\u7ebf\u526a\u679d","text":"

    \u4e3a\u4e86\u6ee1\u8db3\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5e03\u5c14\u578b\u6570\u7ec4 cols \u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u51b3\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u4eec\u901a\u8fc7 cols \u5c06\u5df2\u6709\u7687\u540e\u7684\u5217\u8fdb\u884c\u526a\u679d\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u52a8\u6001\u66f4\u65b0 cols \u7684\u72b6\u6001\u3002

    \u90a3\u4e48\uff0c\u5982\u4f55\u5904\u7406\u5bf9\u89d2\u7ebf\u7ea6\u675f\u5462\uff1f\u8bbe\u68cb\u76d8\u4e2d\u67d0\u4e2a\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\((row, col)\\) \uff0c\u9009\u5b9a\u77e9\u9635\u4e2d\u7684\u67d0\u6761\u4e3b\u5bf9\u89d2\u7ebf\uff0c\u6211\u4eec\u53d1\u73b0\u8be5\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u51cf\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u4e3a\u6052\u5b9a\u503c\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u4e24\u4e2a\u683c\u5b50\u6ee1\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5219\u5b83\u4eec\u4e00\u5b9a\u5904\u5728\u540c\u4e00\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u3002\u5229\u7528\u8be5\u89c4\u5f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u56fe 13-18 \u6240\u793a\u7684\u6570\u7ec4 diags1 \u8bb0\u5f55\u6bcf\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

    \u540c\u7406\uff0c\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6052\u5b9a\u503c\u3002\u6211\u4eec\u540c\u6837\u4e5f\u53ef\u4ee5\u501f\u52a9\u6570\u7ec4 diags2 \u6765\u5904\u7406\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002

    \u56fe 13-18 \u00a0 \u5904\u7406\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f

    "},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u8bf7\u6ce8\u610f\uff0c\\(n\\) \u7ef4\u65b9\u9635\u4e2d \\(row - col\\) \u7684\u8303\u56f4\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u8303\u56f4\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7684\u6570\u91cf\u90fd\u4e3a \\(2n - 1\\) \uff0c\u5373\u6570\u7ec4 diags1 \u548c diags2 \u7684\u957f\u5ea6\u90fd\u4e3a \\(2n - 1\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig n_queens.py
    def backtrack(\n    row: int,\n    n: int,\n    state: list[list[str]],\n    res: list[list[list[str]]],\n    cols: list[bool],\n    diags1: list[bool],\n    diags2: list[bool],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u904d\u5386\u6240\u6709\u5217\n    for col in range(n):\n        # \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = diags1[diag1] = diags2[diag2] = True\n            # \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            # \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = diags1[diag1] = diags2[diag2] = False\n\ndef n_queens(n: int) -> list[list[list[str]]]:\n    \"\"\"\u6c42\u89e3 n \u7687\u540e\"\"\"\n    # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state = [[\"#\" for _ in range(n)] for _ in range(n)]\n    cols = [False] * n  # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    res = []\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n
    n_queens.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\n               vector<bool> &diags1, vector<bool> &diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    vector<vector<string>> state(n, vector<string>(n, \"#\"));\n    vector<bool> cols(n, false);           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<vector<vector<string>>> res;\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\n        boolean[] cols, boolean[] diags1, boolean[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<String>> copyState = new ArrayList<>();\n        for (List<String> sRow : state) {\n            copyState.add(new ArrayList<>(sRow));\n        }\n        res.add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get(row).set(col, \"Q\");\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get(row).set(col, \"#\");\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<String>> state = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<String> row = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            row.add(\"#\");\n        }\n        state.add(row);\n    }\n    boolean[] cols = new boolean[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<String>>> res = new ArrayList<>();\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\n        bool[] cols, bool[] diags1, bool[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<string>> copyState = [];\n        foreach (List<string> sRow in state) {\n            copyState.Add(new List<string>(sRow));\n        }\n        res.Add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            Backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<string>>> NQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<string>> state = [];\n    for (int i = 0; i < n; i++) {\n        List<string> row = [];\n        for (int j = 0; j < n; j++) {\n            row.Add(\"#\");\n        }\n        state.Add(row);\n    }\n    bool[] cols = new bool[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<string>>> res = [];\n\n    Backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        newState := make([][]string, len(*state))\n        for i, _ := range newState {\n            newState[i] = make([]string, len((*state)[0]))\n            copy(newState[i], (*state)[i])\n\n        }\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            (*state)[row][col] = \"Q\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row+1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            (*state)[row][col] = \"#\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n int) [][][]string {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state := make([][]string, n)\n    for i := 0; i < n; i++ {\n        row := make([]string, n)\n        for i := 0; i < n; i++ {\n            row[i] = \"#\"\n        }\n        state[i] = row\n    }\n    // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    cols := make([]bool, n)\n    diags1 := make([]bool, 2*n-1)\n    diags2 := make([]bool, 2*n-1)\n    res := make([][][]string, 0)\n    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)\n    return res\n}\n
    n_queens.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = true\n            diags1[diag1] = true\n            diags2[diag2] = true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = false\n            diags1[diag1] = false\n            diags2[diag2] = false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    var state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\n    var cols = Array(repeating: false, count: n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var res: [[[String]]] = []\n\n    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n\n    return res\n}\n
    n_queens.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(\n    row: number,\n    n: number,\n    state: string[][],\n    res: string[][][],\n    cols: boolean[],\n    diags1: boolean[],\n    diags2: boolean[]\n): void {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res: string[][][] = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(\n  int row,\n  int n,\n  List<List<String>> state,\n  List<List<List<String>>> res,\n  List<bool> cols,\n  List<bool> diags1,\n  List<bool> diags2,\n) {\n  // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (row == n) {\n    List<List<String>> copyState = [];\n    for (List<String> sRow in state) {\n      copyState.add(List.from(sRow));\n    }\n    res.add(copyState);\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n      state[row][col] = \"Q\";\n      cols[col] = true;\n      diags1[diag1] = true;\n      diags2[diag2] = true;\n      // \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2);\n      // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n      state[row][col] = \"#\";\n      cols[col] = false;\n      diags1[diag1] = false;\n      diags2[diag2] = false;\n    }\n  }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n  // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  List<List<String>> state = List.generate(n, (index) => List.filled(n, \"#\"));\n  List<bool> cols = List.filled(n, false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<List<List<String>>> res = [];\n\n  backtrack(0, n, state, res, cols, diags1, diags2);\n\n  return res;\n}\n
    n_queens.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfn backtrack(\n    row: usize,\n    n: usize,\n    state: &mut Vec<Vec<String>>,\n    res: &mut Vec<Vec<Vec<String>>>,\n    cols: &mut [bool],\n    diags1: &mut [bool],\n    diags2: &mut [bool],\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        let mut copy_state: Vec<Vec<String>> = Vec::new();\n        for s_row in state.clone() {\n            copy_state.push(s_row);\n        }\n        res.push(copy_state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get_mut(row).unwrap()[col] = \"Q\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get_mut(row).unwrap()[col] = \"#\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    let mut state: Vec<Vec<String>> = Vec::new();\n    for _ in 0..n {\n        let mut row: Vec<String> = Vec::new();\n        for _ in 0..n {\n            row.push(\"#\".into());\n        }\n        state.push(row);\n    }\n    let mut cols = vec![false; n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut res: Vec<Vec<Vec<String>>> = Vec::new();\n\n    backtrack(\n        0,\n        n,\n        &mut state,\n        &mut res,\n        &mut cols,\n        &mut diags1,\n        &mut diags2,\n    );\n\n    res\n}\n
    n_queens.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],\n               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res[*resSize] = (char **)malloc(sizeof(char *) * n);\n        for (int i = 0; i < n; ++i) {\n            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));\n            strcpy(res[*resSize][i], state[i]);\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nchar ***nQueens(int n, int *returnSize) {\n    char state[MAX_SIZE][MAX_SIZE];\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    for (int i = 0; i < n; ++i) {\n        for (int j = 0; j < n; ++j) {\n            state[i][j] = '#';\n        }\n        state[i][n] = '\\0';\n    }\n    bool cols[MAX_SIZE] = {false};           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n\n    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);\n    *returnSize = 0;\n    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfun backtrack(\n    row: Int,\n    n: Int,\n    state: MutableList<MutableList<String>>,\n    res: MutableList<MutableList<MutableList<String>>?>,\n    cols: BooleanArray,\n    diags1: BooleanArray,\n    diags2: BooleanArray\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        val copyState = mutableListOf<MutableList<String>>()\n        for (sRow in state) {\n            copyState.add(sRow.toMutableList())\n        }\n        res.add(copyState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            diags2[diag2] = true\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            diags2[diag2] = false\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    val state = mutableListOf<MutableList<String>>()\n    for (i in 0..<n) {\n        val row = mutableListOf<String>()\n        for (j in 0..<n) {\n            row.add(\"#\")\n        }\n        state.add(row)\n    }\n    val cols = BooleanArray(n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val res = mutableListOf<MutableList<MutableList<String>>?>()\n\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n}\n
    n_queens.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e ###\ndef backtrack(row, n, state, res, cols, diags1, diags2)\n  # \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if row == n\n    res << state.map { |row| row.dup }\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u5217\n  for col in 0...n\n    # \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n    diag1 = row - col + n - 1\n    diag2 = row + col\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n    if !cols[col] && !diags1[diag1] && !diags2[diag2]\n      # \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n      state[row][col] = \"Q\"\n      cols[col] = diags1[diag1] = diags2[diag2] = true\n      # \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2)\n      # \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n      state[row][col] = \"#\"\n      cols[col] = diags1[diag1] = diags2[diag2] = false\n    end\n  end\nend\n\n### \u6c42\u89e3 n \u7687\u540e ###\ndef n_queens(n)\n  # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  state = Array.new(n) { Array.new(n, \"#\") }\n  cols = Array.new(n, false) # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n  diags1 = Array.new(2 * n - 1, false) # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  diags2 = Array.new(2 * n - 1, false) # \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  res = []\n  backtrack(0, n, state, res, cols, diags1, diags2)\n\n  res\nend\n
    n_queens.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u8651\u5217\u7ea6\u675f\uff0c\u5219\u4ece\u7b2c\u4e00\u884c\u5230\u6700\u540e\u4e00\u884c\u5206\u522b\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u4e2a\u9009\u62e9\uff0c\u4f7f\u7528 \\(O(n!)\\) \u65f6\u95f4\u3002\u5f53\u8bb0\u5f55\u89e3\u65f6\uff0c\u9700\u8981\u590d\u5236\u77e9\u9635 state \u5e76\u6dfb\u52a0\u8fdb res \uff0c\u590d\u5236\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002\u56e0\u6b64\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n! \\cdot n^2)\\) \u3002\u5b9e\u9645\u4e0a\uff0c\u6839\u636e\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u526a\u679d\u4e5f\u80fd\u591f\u5927\u5e45\u7f29\u5c0f\u641c\u7d22\u7a7a\u95f4\uff0c\u56e0\u800c\u641c\u7d22\u6548\u7387\u5f80\u5f80\u4f18\u4e8e\u4ee5\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    \u6570\u7ec4 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff0c\u6570\u7ec4 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/","title":"13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898","text":"

    \u5168\u6392\u5217\u95ee\u9898\u662f\u56de\u6eaf\u7b97\u6cd5\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u7684\u5b9a\u4e49\u662f\u5728\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff08\u5982\u4e00\u4e2a\u6570\u7ec4\u6216\u5b57\u7b26\u4e32\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u8868 13-2 \u5217\u4e3e\u4e86\u51e0\u4e2a\u793a\u4f8b\u6570\u636e\uff0c\u5305\u62ec\u8f93\u5165\u6570\u7ec4\u548c\u5bf9\u5e94\u7684\u6240\u6709\u6392\u5217\u3002

    \u8868 13-2 \u00a0 \u5168\u6392\u5217\u793a\u4f8b

    \u8f93\u5165\u6570\u7ec4 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1321","title":"13.2.1 \u00a0 \u65e0\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\u3002\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u4eec\u5148\u9009\u62e9 \\(1\\) \uff0c\u518d\u9009\u62e9 \\(3\\) \uff0c\u6700\u540e\u9009\u62e9 \\(2\\) \uff0c\u5219\u83b7\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u9500\u4e00\u4e2a\u9009\u62e9\uff0c\u4e4b\u540e\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002

    \u4ece\u56de\u6eaf\u4ee3\u7801\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9009\u96c6\u5408 choices \u662f\u8f93\u5165\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72b6\u6001 state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9009\u62e9\u7684\u5143\u7d20\u3002\u8bf7\u6ce8\u610f\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u5141\u8bb8\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u5e94\u8be5\u662f\u552f\u4e00\u7684\u3002

    \u5982\u56fe 13-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u641c\u7d22\u8fc7\u7a0b\u5c55\u5f00\u6210\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u5f53\u524d\u72b6\u6001 state \u3002\u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u7ecf\u8fc7\u4e09\u8f6e\u9009\u62e9\u540e\u5230\u8fbe\u53f6\u8282\u70b9\uff0c\u6bcf\u4e2a\u53f6\u8282\u70b9\u90fd\u5bf9\u5e94\u4e00\u4e2a\u6392\u5217\u3002

    \u56fe 13-5 \u00a0 \u5168\u6392\u5217\u7684\u9012\u5f52\u6811

    "},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u590d\u9009\u62e9\u526a\u679d","text":"

    \u4e3a\u4e86\u5b9e\u73b0\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u6211\u4eec\u8003\u8651\u5f15\u5165\u4e00\u4e2a\u5e03\u5c14\u578b\u6570\u7ec4 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9009\u62e9\uff0c\u5e76\u57fa\u4e8e\u5b83\u5b9e\u73b0\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

    • \u5728\u505a\u51fa\u9009\u62e9 choice[i] \u540e\uff0c\u6211\u4eec\u5c31\u5c06 selected[i] \u8d4b\u503c\u4e3a \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9009\u62e9\u3002
    • \u904d\u5386\u9009\u62e9\u5217\u8868 choices \u65f6\uff0c\u8df3\u8fc7\u6240\u6709\u5df2\u88ab\u9009\u62e9\u7684\u8282\u70b9\uff0c\u5373\u526a\u679d\u3002

    \u5982\u56fe 13-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u7b2c\u4e00\u8f6e\u9009\u62e9 1 \uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9 3 \uff0c\u7b2c\u4e09\u8f6e\u9009\u62e9 2 \uff0c\u5219\u9700\u8981\u5728\u7b2c\u4e8c\u8f6e\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f6e\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

    \u56fe 13-6 \u00a0 \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

    \u89c2\u5bdf\u56fe 13-6 \u53d1\u73b0\uff0c\u8be5\u526a\u679d\u64cd\u4f5c\u5c06\u641c\u7d22\u7a7a\u95f4\u5927\u5c0f\u4ece \\(O(n^n)\\) \u51cf\u5c0f\u81f3 \\(O(n!)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u60f3\u6e05\u695a\u4ee5\u4e0a\u4fe1\u606f\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u4ee3\u7801\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u4e3a\u4e86\u7f29\u77ed\u6574\u4f53\u4ee3\u7801\uff0c\u6211\u4eec\u4e0d\u5355\u72ec\u5b9e\u73b0\u6846\u67b6\u4ee3\u7801\u4e2d\u7684\u5404\u4e2a\u51fd\u6570\uff0c\u800c\u662f\u5c06\u5b83\u4eec\u5c55\u5f00\u5728 backtrack() \u51fd\u6570\u4e2d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_i.py
    def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if not selected[i]:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 I\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
    permutations_i.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
    permutations_i.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
    permutations_i.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> PermutationsI(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
    permutations_i.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackI(&state, &nums, &selected, &res)\n    return res\n}\n
    permutations_i.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
    permutations_i.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_i.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_i.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n    if (!selected[i]) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
    permutations_i.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
    permutations_i.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nint **permutationsI(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
    permutations_i.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
    permutations_i.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I ###\ndef backtrack(state, choices, selected, res)\n  # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  choices.each_with_index do |choice, i|\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n    unless selected[i]\n      # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      selected[i] = true\n      state << choice\n      # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res)\n      # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n### \u5168\u6392\u5217 I ###\ndef permutations_i(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_backtracking/permutations_problem/#1322","title":"13.2.2 \u00a0 \u8003\u8651\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u590d\u7684\u6392\u5217\u3002

    \u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 1, 2]\\) \u3002\u4e3a\u4e86\u65b9\u4fbf\u533a\u5206\u4e24\u4e2a\u91cd\u590d\u5143\u7d20 \\(1\\) \uff0c\u6211\u4eec\u5c06\u7b2c\u4e8c\u4e2a \\(1\\) \u8bb0\u4e3a \\(\\hat{1}\\) \u3002

    \u5982\u56fe 13-7 \u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u662f\u91cd\u590d\u7684\u3002

    \u56fe 13-7 \u00a0 \u91cd\u590d\u6392\u5217

    \u90a3\u4e48\u5982\u4f55\u53bb\u9664\u91cd\u590d\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\uff0c\u76f4\u63a5\u5bf9\u6392\u5217\u7ed3\u679c\u8fdb\u884c\u53bb\u91cd\u3002\u7136\u800c\u8fd9\u6837\u505a\u4e0d\u591f\u4f18\u96c5\uff0c\u56e0\u4e3a\u751f\u6210\u91cd\u590d\u6392\u5217\u7684\u641c\u7d22\u5206\u652f\u6ca1\u6709\u5fc5\u8981\uff0c\u5e94\u5f53\u63d0\u524d\u8bc6\u522b\u5e76\u526a\u679d\uff0c\u8fd9\u6837\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002

    "},{"location":"chapter_backtracking/permutations_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

    \u89c2\u5bdf\u56fe 13-8 \uff0c\u5728\u7b2c\u4e00\u8f6e\u4e2d\uff0c\u9009\u62e9 \\(1\\) \u6216\u9009\u62e9 \\(\\hat{1}\\) \u662f\u7b49\u4ef7\u7684\uff0c\u5728\u8fd9\u4e24\u4e2a\u9009\u62e9\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u590d\u7684\u3002\u56e0\u6b64\u5e94\u8be5\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

    \u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(2\\) \u4e4b\u540e\uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u5e94\u5c06\u7b2c\u4e8c\u8f6e\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u5728\u67d0\u4e00\u8f6e\u9009\u62e9\u4e2d\uff0c\u4fdd\u8bc1\u591a\u4e2a\u76f8\u7b49\u7684\u5143\u7d20\u4ec5\u88ab\u9009\u62e9\u4e00\u6b21\u3002

    \u56fe 13-8 \u00a0 \u91cd\u590d\u6392\u5217\u526a\u679d

    "},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5728\u4e0a\u4e00\u9898\u7684\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u8003\u8651\u5728\u6bcf\u4e00\u8f6e\u9009\u62e9\u4e2d\u5f00\u542f\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 duplicated \uff0c\u7528\u4e8e\u8bb0\u5f55\u8be5\u8f6e\u4e2d\u5df2\u7ecf\u5c1d\u8bd5\u8fc7\u7684\u5143\u7d20\uff0c\u5e76\u5c06\u91cd\u590d\u5143\u7d20\u526a\u679d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_ii.py
    def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice)  # \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 II\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
    permutations_ii.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    unordered_set<int> duplicated;\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.emplace(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
    permutations_ii.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    Set<Integer> duplicated = new HashSet<Integer>();\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
    permutations_ii.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.Add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> PermutationsII(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
    permutations_ii.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated := make(map[int]struct{}, 0)\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackII(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackII(&state, &nums, &selected, &res)\n    return res\n}\n
    permutations_ii.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
    permutations_ii.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_ii.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_ii.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
    permutations_ii.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    let mut duplicated = HashSet::<i32>::new();\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new();\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
    permutations_ii.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    bool duplicated[MAX_SIZE] = {false};\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated[choice] = true; // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nint **permutationsII(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
    permutations_ii.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
    permutations_ii.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II ###\ndef backtrack(state, choices, selected, res)\n  # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  duplicated = Set.new\n  choices.each_with_index do |choice, i|\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n    if !selected[i] && !duplicated.include?(choice)\n      # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      duplicated.add(choice)\n      selected[i] = true\n      state << choice\n      # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res)\n      # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n### \u5168\u6392\u5217 II ###\ndef permutations_ii(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5047\u8bbe\u5143\u7d20\u4e24\u4e24\u4e4b\u95f4\u4e92\u4e0d\u76f8\u540c\uff0c\u5219 \\(n\\) \u4e2a\u5143\u7d20\u5171\u6709 \\(n!\\) \u79cd\u6392\u5217\uff08\u9636\u4e58\uff09\uff1b\u5728\u8bb0\u5f55\u7ed3\u679c\u65f6\uff0c\u9700\u8981\u590d\u5236\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5217\u8868\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!n)\\) \u3002

    \u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u540c\u4e00\u65f6\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u4e2a duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u4e24\u79cd\u526a\u679d\u5bf9\u6bd4","text":"

    \u8bf7\u6ce8\u610f\uff0c\u867d\u7136 selected \u548c duplicated \u90fd\u7528\u4e8e\u526a\u679d\uff0c\u4f46\u4e24\u8005\u7684\u76ee\u6807\u4e0d\u540c\u3002

    • \u91cd\u590d\u9009\u62e9\u526a\u679d\uff1a\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\u4e2d\u53ea\u6709\u4e00\u4e2a selected \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5f53\u524d\u72b6\u6001\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u4e2a\u5143\u7d20\u5728 state \u4e2d\u91cd\u590d\u51fa\u73b0\u3002
    • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f6e\u9009\u62e9\uff08\u6bcf\u4e2a\u8c03\u7528\u7684 backtrack \u51fd\u6570\uff09\u90fd\u5305\u542b\u4e00\u4e2a duplicated \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5728\u672c\u8f6e\u904d\u5386\uff08for \u5faa\u73af\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9009\u62e9\u8fc7\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8bc1\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002

    \u56fe 13-9 \u5c55\u793a\u4e86\u4e24\u4e2a\u526a\u679d\u6761\u4ef6\u7684\u751f\u6548\u8303\u56f4\u3002\u6ce8\u610f\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u9009\u62e9\uff0c\u4ece\u6839\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\u6784\u6210\u4e00\u4e2a\u6392\u5217\u3002

    \u56fe 13-9 \u00a0 \u4e24\u79cd\u526a\u679d\u6761\u4ef6\u7684\u4f5c\u7528\u8303\u56f4

    "},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u65e0\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ef\u4ee5\u88ab\u9009\u53d6\u591a\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

    \u4f8b\u5982\uff0c\u8f93\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6807\u6574\u6570 \\(9\\) \uff0c\u89e3\u4e3a \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

    • \u8f93\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u91cd\u590d\u9009\u53d6\u3002
    • \u5b50\u96c6\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u4e2a\u5b50\u96c6\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c2\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

    \u7c7b\u4f3c\u4e8e\u5168\u6392\u5217\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\uff0c\u5e76\u5728\u9009\u62e9\u8fc7\u7a0b\u4e2d\u5b9e\u65f6\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u5f53\u5143\u7d20\u548c\u7b49\u4e8e target \u65f6\uff0c\u5c31\u5c06\u5b50\u96c6\u8bb0\u5f55\u81f3\u7ed3\u679c\u5217\u8868\u3002

    \u800c\u4e0e\u5168\u6392\u5217\u95ee\u9898\u4e0d\u540c\u7684\u662f\uff0c\u672c\u9898\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u9009\u53d6\uff0c\u56e0\u6b64\u65e0\u987b\u501f\u52a9 selected \u5e03\u5c14\u5217\u8868\u6765\u8bb0\u5f55\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9009\u62e9\u3002\u6211\u4eec\u53ef\u4ee5\u5bf9\u5168\u6392\u5217\u4ee3\u7801\u8fdb\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u9898\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i_naive.py
    def backtrack(\n    state: list[int],\n    target: int,\n    total: int,\n    choices: list[int],\n    res: list[list[int]],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
    subset_sum_i_naive.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i_naive.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)\n    return res\n}\n
    subset_sum_i_naive.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    total: number,\n    choices: number[],\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  int total,\n  List<int> choices,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
    subset_sum_i_naive.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    total: i32,\n    choices: &[i32],\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
    subset_sum_i_naive.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6570\u91cf\u4e3a0\n    backtrack(target, 0, nums, numsSize);\n}\n
    subset_sum_i_naive.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    total: Int,\n    choices: IntArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
    subset_sum_i_naive.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, total, choices, res)\n  # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if total == target\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  for i in 0...choices.length\n    # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n    next if total + choices[i] > target\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state << choices[i]\n    # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target, total + choices[i], choices, res)\n    # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.pop\n  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09###\ndef subset_sum_i_naive(nums, target)\n  state = [] # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  total = 0 # \u5b50\u96c6\u548c\n  res = [] # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, total, nums, res)\n  res\nend\n
    subset_sum_i_naive.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5411\u4ee5\u4e0a\u4ee3\u7801\u8f93\u5165\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u8f93\u51fa\u7ed3\u679c\u4e3a \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u867d\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u4e3a \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u590d\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

    \u8fd9\u662f\u56e0\u4e3a\u641c\u7d22\u8fc7\u7a0b\u662f\u533a\u5206\u9009\u62e9\u987a\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u533a\u5206\u9009\u62e9\u987a\u5e8f\u3002\u5982\u56fe 13-10 \u6240\u793a\uff0c\u5148\u9009 \\(4\\) \u540e\u9009 \\(5\\) \u4e0e\u5148\u9009 \\(5\\) \u540e\u9009 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5bf9\u5e94\u540c\u4e00\u4e2a\u5b50\u96c6\u3002

    \u56fe 13-10 \u00a0 \u5b50\u96c6\u641c\u7d22\u4e0e\u8d8a\u754c\u526a\u679d

    \u4e3a\u4e86\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u601d\u8def\u662f\u5bf9\u7ed3\u679c\u5217\u8868\u8fdb\u884c\u53bb\u91cd\u3002\u4f46\u8fd9\u4e2a\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u4e24\u65b9\u9762\u539f\u56e0\u3002

    • \u5f53\u6570\u7ec4\u5143\u7d20\u8f83\u591a\uff0c\u5c24\u5176\u662f\u5f53 target \u8f83\u5927\u65f6\uff0c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u4ea7\u751f\u5927\u91cf\u7684\u91cd\u590d\u5b50\u96c6\u3002
    • \u6bd4\u8f83\u5b50\u96c6\uff08\u6570\u7ec4\uff09\u7684\u5f02\u540c\u975e\u5e38\u8017\u65f6\uff0c\u9700\u8981\u5148\u6392\u5e8f\u6570\u7ec4\uff0c\u518d\u6bd4\u8f83\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u5143\u7d20\u7684\u5f02\u540c\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u590d\u5b50\u96c6\u526a\u679d","text":"

    \u6211\u4eec\u8003\u8651\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u901a\u8fc7\u526a\u679d\u8fdb\u884c\u53bb\u91cd\u3002\u89c2\u5bdf\u56fe 13-11 \uff0c\u91cd\u590d\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u987a\u5e8f\u9009\u62e9\u6570\u7ec4\u5143\u7d20\u65f6\u4ea7\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u51b5\u3002

    1. \u5f53\u7b2c\u4e00\u8f6e\u548c\u7b2c\u4e8c\u8f6e\u5206\u522b\u9009\u62e9 \\(3\\) \u548c \\(4\\) \u65f6\uff0c\u4f1a\u751f\u6210\u5305\u542b\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8bb0\u4e3a \\([3, 4, \\dots]\\) \u3002
    2. \u4e4b\u540e\uff0c\u5f53\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(4\\) \u65f6\uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \uff0c\u56e0\u4e3a\u8be5\u9009\u62e9\u4ea7\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

    \u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c42\u7684\u9009\u62e9\u90fd\u662f\u4ece\u5de6\u5230\u53f3\u88ab\u9010\u4e2a\u5c1d\u8bd5\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

    1. \u524d\u4e24\u8f6e\u9009\u62e9 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
    2. \u524d\u4e24\u8f6e\u9009\u62e9 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
    3. \u82e5\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(5\\) \uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u4e3a\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u4e0e\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

    \u56fe 13-11 \u00a0 \u4e0d\u540c\u9009\u62e9\u987a\u5e8f\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

    \u603b\u7ed3\u6765\u770b\uff0c\u7ed9\u5b9a\u8f93\u5165\u6570\u7ec4 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8bbe\u641c\u7d22\u8fc7\u7a0b\u4e2d\u7684\u9009\u62e9\u5e8f\u5217\u4e3a \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5219\u8be5\u9009\u62e9\u5e8f\u5217\u9700\u8981\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6ee1\u8db3\u8be5\u6761\u4ef6\u7684\u9009\u62e9\u5e8f\u5217\u90fd\u4f1a\u9020\u6210\u91cd\u590d\uff0c\u5e94\u5f53\u526a\u679d\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u4e3a\u5b9e\u73b0\u8be5\u526a\u679d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u53d8\u91cf start \uff0c\u7528\u4e8e\u6307\u793a\u904d\u5386\u8d77\u59cb\u70b9\u3002\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i\\) \u5f00\u59cb\u904d\u5386\u3002\u8fd9\u6837\u505a\u5c31\u53ef\u4ee5\u8ba9\u9009\u62e9\u5e8f\u5217\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4ece\u800c\u4fdd\u8bc1\u5b50\u96c6\u552f\u4e00\u3002

    \u9664\u6b64\u4e4b\u5916\uff0c\u6211\u4eec\u8fd8\u5bf9\u4ee3\u7801\u8fdb\u884c\u4e86\u4ee5\u4e0b\u4e24\u9879\u4f18\u5316\u3002

    • \u5728\u5f00\u542f\u641c\u7d22\u524d\uff0c\u5148\u5c06\u6570\u7ec4 nums \u6392\u5e8f\u3002\u5728\u904d\u5386\u6240\u6709\u9009\u62e9\u65f6\uff0c\u5f53\u5b50\u96c6\u548c\u8d85\u8fc7 target \u65f6\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\uff0c\u56e0\u4e3a\u540e\u8fb9\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target \u3002
    • \u7701\u53bb\u5143\u7d20\u548c\u53d8\u91cf total \uff0c\u901a\u8fc7\u5728 target \u4e0a\u6267\u884c\u51cf\u6cd5\u6765\u7edf\u8ba1\u5143\u7d20\u548c\uff0c\u5f53 target \u7b49\u4e8e \\(0\\) \u65f6\u8bb0\u5f55\u89e3\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i.py
    def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_i.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvector<vector<int>> subsetSumI(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<Integer>> subsetSumI(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> SubsetSumI(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_i.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> subsetSumI(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_i.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_i.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; ++i) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvoid subsetSumI(int *nums, int numsSize, int target) {\n    qsort(nums, numsSize, sizeof(int), cmp); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                           // \u904d\u5386\u8d77\u59cb\u70b9\n    backtrack(target, nums, numsSize, start);\n}\n
    subset_sum_i.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_i.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  for i in start...choices.length\n    # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    break if target - choices[i] < 0\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state << choices[i]\n    # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i, res)\n    # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.pop\n  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I ###\ndef subset_sum_i(nums, target)\n  state = [] # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort! # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  start = 0 # \u904d\u5386\u8d77\u59cb\u70b9\n  res = [] # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res)\n  res\nend\n
    subset_sum_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 13-12 \u6240\u793a\u4e3a\u5c06\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u8f93\u5165\u4ee5\u4e0a\u4ee3\u7801\u540e\u7684\u6574\u4f53\u56de\u6eaf\u8fc7\u7a0b\u3002

    \u56fe 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u8fc7\u7a0b

    "},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u8651\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u53ef\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

    \u76f8\u6bd4\u4e8e\u4e0a\u9898\uff0c\u672c\u9898\u7684\u8f93\u5165\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd9\u5f15\u5165\u4e86\u65b0\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u7ed9\u5b9a\u6570\u7ec4 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u5219\u73b0\u6709\u4ee3\u7801\u7684\u8f93\u51fa\u7ed3\u679c\u4e3a \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73b0\u4e86\u91cd\u590d\u5b50\u96c6\u3002

    \u9020\u6210\u8fd9\u79cd\u91cd\u590d\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f6e\u4e2d\u88ab\u591a\u6b21\u9009\u62e9\u3002\u5728\u56fe 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f6e\u5171\u6709\u4e09\u4e2a\u9009\u62e9\uff0c\u5176\u4e2d\u4e24\u4e2a\u90fd\u4e3a \\(4\\) \uff0c\u4f1a\u4ea7\u751f\u4e24\u4e2a\u91cd\u590d\u7684\u641c\u7d22\u5206\u652f\uff0c\u4ece\u800c\u8f93\u51fa\u91cd\u590d\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f6e\u7684\u4e24\u4e2a \\(4\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002

    \u56fe 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

    "},{"location":"chapter_backtracking/subset_sum_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

    \u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5b9e\u73b0\u65b9\u5f0f\u6bd4\u8f83\u5de7\u5999\uff1a\u7531\u4e8e\u6570\u7ec4\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u90bb\u7684\u3002\u8fd9\u610f\u5473\u7740\u5728\u67d0\u8f6e\u9009\u62e9\u4e2d\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u4e0e\u5176\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u5219\u8bf4\u660e\u5b83\u5df2\u7ecf\u88ab\u9009\u62e9\u8fc7\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u8fc7\u5f53\u524d\u5143\u7d20\u3002

    \u4e0e\u6b64\u540c\u65f6\uff0c\u672c\u9898\u89c4\u5b9a\u6bcf\u4e2a\u6570\u7ec4\u5143\u7d20\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5e78\u8fd0\u7684\u662f\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5229\u7528\u53d8\u91cf start \u6765\u6ee1\u8db3\u8be5\u7ea6\u675f\uff1a\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i + 1\\) \u5f00\u59cb\u5411\u540e\u904d\u5386\u3002\u8fd9\u6837\u65e2\u80fd\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u590d\u9009\u62e9\u5143\u7d20\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_ii.py
    def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c II\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_ii.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvector<vector<int>> subsetSumII(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<Integer>> subsetSumII(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> SubsetSumII(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_ii.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_ii.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> subsetSumII(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_ii.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_ii.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u5f00\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
    subset_sum_ii.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_ii.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  # \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n  for i in start...choices.length\n    # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    break if target - choices[i] < 0\n    # \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n    next if i > start && choices[i] == choices[i - 1]\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state << choices[i]\n    # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i + 1, res)\n    # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.pop\n  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c II ###\ndef subset_sum_ii(nums, target)\n  state = [] # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort! # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  start = 0 # \u904d\u5386\u8d77\u59cb\u70b9\n  res = [] # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res)\n  res\nend\n
    subset_sum_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 13-14 \u5c55\u793a\u4e86\u6570\u7ec4 \\([4, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u8fc7\u7a0b\uff0c\u5171\u5305\u542b\u56db\u79cd\u526a\u679d\u64cd\u4f5c\u3002\u8bf7\u4f60\u5c06\u56fe\u793a\u4e0e\u4ee3\u7801\u6ce8\u91ca\u76f8\u7ed3\u5408\uff0c\u7406\u89e3\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u79cd\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

    \u56fe 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u8fc7\u7a0b

    "},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u662f\u7a77\u4e3e\u6cd5\uff0c\u901a\u8fc7\u5bf9\u89e3\u7a7a\u95f4\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6765\u5bfb\u627e\u7b26\u5408\u6761\u4ef6\u7684\u89e3\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u9047\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u5219\u8bb0\u5f55\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u904d\u5386\u5b8c\u6210\u540e\u7ed3\u675f\u3002
    • \u56de\u6eaf\u7b97\u6cd5\u7684\u641c\u7d22\u8fc7\u7a0b\u5305\u62ec\u5c1d\u8bd5\u4e0e\u56de\u9000\u4e24\u4e2a\u90e8\u5206\u3002\u5b83\u901a\u8fc7\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u6765\u5c1d\u8bd5\u5404\u79cd\u9009\u62e9\uff0c\u5f53\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u60c5\u51b5\u65f6\uff0c\u5219\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002\u5c1d\u8bd5\u4e0e\u56de\u9000\u662f\u4e24\u4e2a\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
    • \u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u5b83\u4eec\u53ef\u7528\u4e8e\u5b9e\u73b0\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7ed3\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u7d22\u6548\u7387\u3002
    • \u56de\u6eaf\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u4e8e\u89e3\u51b3\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u3002\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u867d\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u7b97\u6cd5\u89e3\u51b3\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
    • \u5168\u6392\u5217\u95ee\u9898\u65e8\u5728\u641c\u7d22\u7ed9\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e2a\u5143\u7d20\u662f\u5426\u88ab\u9009\u62e9\uff0c\u526a\u6389\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\u7684\u641c\u7d22\u5206\u652f\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002
    • \u5728\u5168\u6392\u5217\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff0c\u5219\u6700\u7ec8\u7ed3\u679c\u4f1a\u51fa\u73b0\u91cd\u590d\u6392\u5217\u3002\u6211\u4eec\u9700\u8981\u7ea6\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u8fd9\u901a\u5e38\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\u6765\u5b9e\u73b0\u3002
    • \u5b50\u96c6\u548c\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u7ed9\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u4e3a\u76ee\u6807\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u800c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u8f93\u51fa\u6240\u6709\u987a\u5e8f\u7684\u7ed3\u679c\uff0c\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002\u6211\u4eec\u5728\u56de\u6eaf\u524d\u5c06\u6570\u636e\u8fdb\u884c\u6392\u5e8f\uff0c\u5e76\u8bbe\u7f6e\u4e00\u4e2a\u53d8\u91cf\u6765\u6307\u793a\u6bcf\u4e00\u8f6e\u7684\u904d\u5386\u8d77\u59cb\u70b9\uff0c\u4ece\u800c\u5c06\u751f\u6210\u91cd\u590d\u5b50\u96c6\u7684\u641c\u7d22\u5206\u652f\u8fdb\u884c\u526a\u679d\u3002
    • \u5bf9\u4e8e\u5b50\u96c6\u548c\u95ee\u9898\uff0c\u6570\u7ec4\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u4f1a\u4ea7\u751f\u91cd\u590d\u96c6\u5408\u3002\u6211\u4eec\u5229\u7528\u6570\u7ec4\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\uff0c\u901a\u8fc7\u5224\u65ad\u76f8\u90bb\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5b9e\u73b0\u526a\u679d\uff0c\u4ece\u800c\u786e\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u4e2d\u4e00\u6b21\u3002
    • \\(n\\) \u7687\u540e\u95ee\u9898\u65e8\u5728\u5bfb\u627e\u5c06 \\(n\\) \u4e2a\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76d8\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u4e24\u4e24\u4e4b\u95f4\u65e0\u6cd5\u653b\u51fb\u5bf9\u65b9\u3002\u8be5\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6\u6709\u884c\u7ea6\u675f\u3001\u5217\u7ea6\u675f\u3001\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002\u4e3a\u6ee1\u8db3\u884c\u7ea6\u675f\uff0c\u6211\u4eec\u91c7\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8bc1\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002
    • \u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u5904\u7406\u65b9\u5f0f\u7c7b\u4f3c\u3002\u5bf9\u4e8e\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u4ece\u800c\u6307\u793a\u9009\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5bf9\u4e8e\u5bf9\u89d2\u7ebf\u7ea6\u675f\uff0c\u6211\u4eec\u501f\u52a9\u4e24\u4e2a\u6570\u7ec4\u6765\u5206\u522b\u8bb0\u5f55\u8be5\u4e3b\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96be\u70b9\u5728\u4e8e\u627e\u5904\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5bf9\u89d2\u7ebf\u4e0a\u683c\u5b50\u6ee1\u8db3\u7684\u884c\u5217\u7d22\u5f15\u89c4\u5f8b\u3002
    "},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u600e\u4e48\u7406\u89e3\u56de\u6eaf\u548c\u9012\u5f52\u7684\u5173\u7cfb\uff1f

    \u603b\u7684\u6765\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u79cd\u201c\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u9012\u5f52\u66f4\u50cf\u662f\u4e00\u4e2a\u201c\u5de5\u5177\u201d\u3002

    • \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u9012\u5f52\u7684\u5e94\u7528\u573a\u666f\u4e4b\u4e00\uff0c\u662f\u9012\u5f52\u5728\u641c\u7d22\u95ee\u9898\u4e2d\u7684\u5e94\u7528\u3002
    • \u9012\u5f52\u7684\u7ed3\u6784\u4f53\u73b0\u4e86\u201c\u5b50\u95ee\u9898\u5206\u89e3\u201d\u7684\u89e3\u9898\u8303\u5f0f\uff0c\u5e38\u7528\u4e8e\u89e3\u51b3\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\uff08\u8bb0\u5fc6\u5316\u9012\u5f52\uff09\u7b49\u95ee\u9898\u3002
    "},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    Abstract

    \u590d\u6742\u5ea6\u5206\u6790\u72b9\u5982\u6d69\u701a\u7684\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u65f6\u7a7a\u5411\u5bfc\u3002

    \u5b83\u5e26\u9886\u6211\u4eec\u5728\u65f6\u95f4\u4e0e\u7a7a\u95f4\u8fd9\u4e24\u4e2a\u7ef4\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5bfb\u627e\u66f4\u4f18\u96c5\u7684\u89e3\u51b3\u65b9\u6848\u3002

    "},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30
    • 2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52
    • 2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6
    • 2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6
    • 2.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52","text":"

    \u5728\u7b97\u6cd5\u4e2d\uff0c\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u662f\u5f88\u5e38\u89c1\u7684\uff0c\u5b83\u4e0e\u590d\u6742\u5ea6\u5206\u6790\u606f\u606f\u76f8\u5173\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7ecd\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e4b\u524d\uff0c\u6211\u4eec\u5148\u6765\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5e8f\u4e2d\u5b9e\u73b0\u91cd\u590d\u6267\u884c\u4efb\u52a1\uff0c\u5373\u4e24\u79cd\u57fa\u672c\u7684\u7a0b\u5e8f\u63a7\u5236\u7ed3\u6784\uff1a\u8fed\u4ee3\u3001\u9012\u5f52\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#221","title":"2.2.1 \u00a0 \u8fed\u4ee3","text":"

    \u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u79cd\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u7684\u63a7\u5236\u7ed3\u6784\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5e8f\u4f1a\u5728\u6ee1\u8db3\u4e00\u5b9a\u7684\u6761\u4ef6\u4e0b\u91cd\u590d\u6267\u884c\u67d0\u6bb5\u4ee3\u7801\uff0c\u76f4\u5230\u8fd9\u4e2a\u6761\u4ef6\u4e0d\u518d\u6ee1\u8db3\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for","title":"1. \u00a0 for \u5faa\u73af","text":"

    for \u5faa\u73af\u662f\u6700\u5e38\u89c1\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9002\u5408\u5728\u9884\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6570\u65f6\u4f7f\u7528\u3002

    \u4ee5\u4e0b\u51fd\u6570\u57fa\u4e8e for \u5faa\u73af\u5b9e\u73b0\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7ed3\u679c\u4f7f\u7528\u53d8\u91cf res \u8bb0\u5f55\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5bf9\u5e94\u7684\u533a\u95f4\u662f\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u7684\uff0c\u5bf9\u5e94\u7684\u904d\u5386\u8303\u56f4\u4e3a \\(a, a + 1, \\dots, b-1\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def for_loop(n: int) -> int:\n    \"\"\"for \u5faa\u73af\"\"\"\n    res = 0\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
    iteration.cpp
    /* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.java
    /* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.cs
    /* for \u5faa\u73af */\nint ForLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.go
    /* for \u5faa\u73af */\nfunc forLoop(n int) int {\n    res := 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
    iteration.swift
    /* for \u5faa\u73af */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
    iteration.js
    /* for \u5faa\u73af */\nfunction forLoop(n) {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.ts
    /* for \u5faa\u73af */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.dart
    /* for \u5faa\u73af */\nint forLoop(int n) {\n  int res = 0;\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
    iteration.rs
    /* for \u5faa\u73af */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
    iteration.c
    /* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.kt
    /* for \u5faa\u73af */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
    iteration.rb
    ### for \u5faa\u73af ###\ndef for_loop(n)\n  res = 0\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
    iteration.zig
    // for \u5faa\u73af\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-1 \u662f\u8be5\u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe\u3002

    \u56fe 2-1 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe

    \u6b64\u6c42\u548c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u6210\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u8fd9\u4e2a\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u76f8\u5173\u5185\u5bb9\u5c06\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while","title":"2. \u00a0 while \u5faa\u73af","text":"

    \u4e0e for \u5faa\u73af\u7c7b\u4f3c\uff0cwhile \u5faa\u73af\u4e5f\u662f\u4e00\u79cd\u5b9e\u73b0\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u7a0b\u5e8f\u6bcf\u8f6e\u90fd\u4f1a\u5148\u68c0\u67e5\u6761\u4ef6\uff0c\u5982\u679c\u6761\u4ef6\u4e3a\u771f\uff0c\u5219\u7ee7\u7eed\u6267\u884c\uff0c\u5426\u5219\u5c31\u7ed3\u675f\u5faa\u73af\u3002

    \u4e0b\u9762\u6211\u4eec\u7528 while \u5faa\u73af\u6765\u5b9e\u73b0\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def while_loop(n: int) -> int:\n    \"\"\"while \u5faa\u73af\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    return res\n
    iteration.cpp
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.java
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.cs
    /* while \u5faa\u73af */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.go
    /* while \u5faa\u73af */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n    }\n    return res\n}\n
    iteration.swift
    /* while \u5faa\u73af */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
    iteration.js
    /* while \u5faa\u73af */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.ts
    /* while \u5faa\u73af */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.dart
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  }\n  return res;\n}\n
    iteration.rs
    /* while \u5faa\u73af */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    res\n}\n
    iteration.c
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.kt
    /* while \u5faa\u73af */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
    iteration.rb
    ### while \u5faa\u73af ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  end\n\n  res\nend\n
    iteration.zig
    // while \u5faa\u73af\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    while \u5faa\u73af\u6bd4 for \u5faa\u73af\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u7531\u5730\u8bbe\u8ba1\u6761\u4ef6\u53d8\u91cf\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9aa4\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6761\u4ef6\u53d8\u91cf \\(i\\) \u6bcf\u8f6e\u8fdb\u884c\u4e24\u6b21\u66f4\u65b0\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u5faa\u73af\u5b9e\u73b0\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def while_loop_ii(n: int) -> int:\n    \"\"\"while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    return res\n
    iteration.cpp
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.java
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.cs
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
    iteration.go
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
    iteration.swift
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
    iteration.js
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.ts
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.dart
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
    iteration.rs
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
    iteration.c
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.kt
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
    iteration.rb
    ### while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
    iteration.zig
    //  while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u603b\u7684\u6765\u8bf4\uff0cfor \u5faa\u73af\u7684\u4ee3\u7801\u66f4\u52a0\u7d27\u51d1\uff0cwhile \u5faa\u73af\u66f4\u52a0\u7075\u6d3b\uff0c\u4e24\u8005\u90fd\u53ef\u4ee5\u5b9e\u73b0\u8fed\u4ee3\u7ed3\u6784\u3002\u9009\u62e9\u4f7f\u7528\u54ea\u4e00\u4e2a\u5e94\u8be5\u6839\u636e\u7279\u5b9a\u95ee\u9898\u7684\u9700\u6c42\u6765\u51b3\u5b9a\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5d4c\u5957\u5faa\u73af","text":"

    \u6211\u4eec\u53ef\u4ee5\u5728\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\u5185\u5d4c\u5957\u53e6\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\uff0c\u4e0b\u9762\u4ee5 for \u5faa\u73af\u4e3a\u4f8b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def nested_for_loop(n: int) -> str:\n    \"\"\"\u53cc\u5c42 for \u5faa\u73af\"\"\"\n    res = \"\"\n    # \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
    iteration.cpp
    /* \u53cc\u5c42 for \u5faa\u73af */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
    iteration.java
    /* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
    iteration.cs
    /* \u53cc\u5c42 for \u5faa\u73af */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
    iteration.go
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u5faa\u73af j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
    iteration.swift
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
    iteration.js
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
    iteration.ts
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
    iteration.dart
    /* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u5faa\u73af i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u5faa\u73af j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
    iteration.rs
    /* \u53cc\u5c42 for \u5faa\u73af */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
    iteration.c
    /* \u53cc\u5c42 for \u5faa\u73af */\nchar *nestedForLoop(int n) {\n    // n * n \u4e3a\u5bf9\u5e94\u70b9\u6570\u91cf\uff0c\"(i, j), \" \u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u6700\u5927\u4e3a 6+10*2\uff0c\u52a0\u4e0a\u6700\u540e\u4e00\u4e2a\u7a7a\u5b57\u7b26 \\0 \u7684\u989d\u5916\u7a7a\u95f4\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
    iteration.kt
    /* \u53cc\u5c42 for \u5faa\u73af */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
    iteration.rb
    ### \u53cc\u5c42 for \u5faa\u73af ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u5faa\u73af i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u5faa\u73af j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
    iteration.zig
    // \u53cc\u5c42 for \u5faa\u73af\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-2 \u662f\u8be5\u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe\u3002

    \u56fe 2-2 \u00a0 \u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe

    \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u548c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u5173\u7cfb\u201d\u3002

    \u6211\u4eec\u53ef\u4ee5\u7ee7\u7eed\u6dfb\u52a0\u5d4c\u5957\u5faa\u73af\uff0c\u6bcf\u4e00\u6b21\u5d4c\u5957\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7ef4\u201d\uff0c\u5c06\u4f1a\u4f7f\u65f6\u95f4\u590d\u6742\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u5173\u7cfb\u201d\u201c\u56db\u6b21\u65b9\u5173\u7cfb\u201d\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#222","title":"2.2.2 \u00a0 \u9012\u5f52","text":"

    \u9012\u5f52\uff08recursion\uff09\u662f\u4e00\u79cd\u7b97\u6cd5\u7b56\u7565\uff0c\u901a\u8fc7\u51fd\u6570\u8c03\u7528\u81ea\u8eab\u6765\u89e3\u51b3\u95ee\u9898\u3002\u5b83\u4e3b\u8981\u5305\u542b\u4e24\u4e2a\u9636\u6bb5\u3002

    1. \u9012\uff1a\u7a0b\u5e8f\u4e0d\u65ad\u6df1\u5165\u5730\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u4f20\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\uff0c\u76f4\u5230\u8fbe\u5230\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u3002
    2. \u5f52\uff1a\u89e6\u53d1\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u540e\uff0c\u7a0b\u5e8f\u4ece\u6700\u6df1\u5c42\u7684\u9012\u5f52\u51fd\u6570\u5f00\u59cb\u9010\u5c42\u8fd4\u56de\uff0c\u6c47\u805a\u6bcf\u4e00\u5c42\u7684\u7ed3\u679c\u3002

    \u800c\u4ece\u5b9e\u73b0\u7684\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u4ee3\u7801\u4e3b\u8981\u5305\u542b\u4e09\u4e2a\u8981\u7d20\u3002

    1. \u7ec8\u6b62\u6761\u4ef6\uff1a\u7528\u4e8e\u51b3\u5b9a\u4ec0\u4e48\u65f6\u5019\u7531\u201c\u9012\u201d\u8f6c\u201c\u5f52\u201d\u3002
    2. \u9012\u5f52\u8c03\u7528\uff1a\u5bf9\u5e94\u201c\u9012\u201d\uff0c\u51fd\u6570\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u8f93\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\u3002
    3. \u8fd4\u56de\u7ed3\u679c\uff1a\u5bf9\u5e94\u201c\u5f52\u201d\uff0c\u5c06\u5f53\u524d\u9012\u5f52\u5c42\u7ea7\u7684\u7ed3\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c42\u3002

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u53ea\u9700\u8c03\u7528\u51fd\u6570 recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8ba1\u7b97\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def recur(n: int) -> int:\n    \"\"\"\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 1:\n        return 1\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res = recur(n - 1)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n
    recursion.cpp
    /* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.java
    /* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.cs
    /* \u9012\u5f52 */\nint Recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = Recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.go
    /* \u9012\u5f52 */\nfunc recur(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res := recur(n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
    recursion.swift
    /* \u9012\u5f52 */\nfunc recur(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n: n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
    recursion.js
    /* \u9012\u5f52 */\nfunction recur(n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.ts
    /* \u9012\u5f52 */\nfunction recur(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.dart
    /* \u9012\u5f52 */\nint recur(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 1) return 1;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  int res = recur(n - 1);\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  return n + res;\n}\n
    recursion.rs
    /* \u9012\u5f52 */\nfn recur(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    n + res\n}\n
    recursion.c
    /* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.kt
    /* \u9012\u5f52 */\nfun recur(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    val res = recur(n - 1)\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
    recursion.rb
    ### \u9012\u5f52 ###\ndef recur(n)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return 1 if n == 1\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  res = recur(n - 1)\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  n + res\nend\n
    recursion.zig
    // \u9012\u5f52\u51fd\u6570\nfn recur(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var res: i32 = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-3 \u5c55\u793a\u4e86\u8be5\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b\u3002

    \u56fe 2-3 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b

    \u867d\u7136\u4ece\u8ba1\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u4e0e\u9012\u5f52\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7ed3\u679c\uff0c\u4f46\u5b83\u4eec\u4ee3\u8868\u4e86\u4e24\u79cd\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u51b3\u95ee\u9898\u7684\u8303\u5f0f\u3002

    • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u4ece\u6700\u57fa\u7840\u7684\u6b65\u9aa4\u5f00\u59cb\uff0c\u7136\u540e\u4e0d\u65ad\u91cd\u590d\u6216\u7d2f\u52a0\u8fd9\u4e9b\u6b65\u9aa4\uff0c\u76f4\u5230\u4efb\u52a1\u5b8c\u6210\u3002
    • \u9012\u5f52\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u8fd9\u4e9b\u5b50\u95ee\u9898\u548c\u539f\u95ee\u9898\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u6765\u5c06\u5b50\u95ee\u9898\u7ee7\u7eed\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u51b5\u65f6\u505c\u6b62\uff08\u57fa\u672c\u60c5\u51b5\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

    \u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u6570\u4e3a\u4f8b\uff0c\u8bbe\u95ee\u9898 \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

    • \u8fed\u4ee3\uff1a\u5728\u5faa\u73af\u4e2d\u6a21\u62df\u6c42\u548c\u8fc7\u7a0b\uff0c\u4ece \\(1\\) \u904d\u5386\u5230 \\(n\\) \uff0c\u6bcf\u8f6e\u6267\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
    • \u9012\u5f52\uff1a\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u5b50\u95ee\u9898 \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65ad\uff08\u9012\u5f52\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u51b5 \\(f(1) = 1\\) \u65f6\u7ec8\u6b62\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u8c03\u7528\u6808","text":"

    \u9012\u5f52\u51fd\u6570\u6bcf\u6b21\u8c03\u7528\u81ea\u8eab\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u4e3a\u65b0\u5f00\u542f\u7684\u51fd\u6570\u5206\u914d\u5185\u5b58\uff0c\u4ee5\u5b58\u50a8\u5c40\u90e8\u53d8\u91cf\u3001\u8c03\u7528\u5730\u5740\u548c\u5176\u4ed6\u4fe1\u606f\u7b49\u3002\u8fd9\u5c06\u5bfc\u81f4\u4e24\u65b9\u9762\u7684\u7ed3\u679c\u3002

    • \u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u90fd\u5b58\u50a8\u5728\u79f0\u4e3a\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u7684\u5185\u5b58\u533a\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u6570\u8fd4\u56de\u540e\u624d\u4f1a\u88ab\u91ca\u653e\u3002\u56e0\u6b64\uff0c\u9012\u5f52\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
    • \u9012\u5f52\u8c03\u7528\u51fd\u6570\u4f1a\u4ea7\u751f\u989d\u5916\u7684\u5f00\u9500\u3002\u56e0\u6b64\u9012\u5f52\u901a\u5e38\u6bd4\u5faa\u73af\u7684\u65f6\u95f4\u6548\u7387\u66f4\u4f4e\u3002

    \u5982\u56fe 2-4 \u6240\u793a\uff0c\u5728\u89e6\u53d1\u7ec8\u6b62\u6761\u4ef6\u524d\uff0c\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684\u9012\u5f52\u51fd\u6570\uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002

    \u56fe 2-4 \u00a0 \u9012\u5f52\u8c03\u7528\u6df1\u5ea6

    \u5728\u5b9e\u9645\u4e2d\uff0c\u7f16\u7a0b\u8bed\u8a00\u5141\u8bb8\u7684\u9012\u5f52\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u8fc7\u6df1\u7684\u9012\u5f52\u53ef\u80fd\u5bfc\u81f4\u6808\u6ea2\u51fa\u9519\u8bef\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2","title":"2. \u00a0 \u5c3e\u9012\u5f52","text":"

    \u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u6570\u5728\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u6b65\u624d\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5219\u8be5\u51fd\u6570\u53ef\u4ee5\u88ab\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u4f18\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u95f4\u6548\u7387\u4e0a\u4e0e\u8fed\u4ee3\u76f8\u5f53\u3002\u8fd9\u79cd\u60c5\u51b5\u88ab\u79f0\u4e3a\u5c3e\u9012\u5f52\uff08tail recursion\uff09\u3002

    • \u666e\u901a\u9012\u5f52\uff1a\u5f53\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u7684\u51fd\u6570\u540e\uff0c\u9700\u8981\u7ee7\u7eed\u6267\u884c\u4ee3\u7801\uff0c\u56e0\u6b64\u7cfb\u7edf\u9700\u8981\u4fdd\u5b58\u4e0a\u4e00\u5c42\u8c03\u7528\u7684\u4e0a\u4e0b\u6587\u3002
    • \u5c3e\u9012\u5f52\uff1a\u9012\u5f52\u8c03\u7528\u662f\u51fd\u6570\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u4e2a\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u540e\uff0c\u65e0\u987b\u7ee7\u7eed\u6267\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7edf\u65e0\u987b\u4fdd\u5b58\u4e0a\u4e00\u5c42\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u3002

    \u4ee5\u8ba1\u7b97 \\(1 + 2 + \\dots + n\\) \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u7ed3\u679c\u53d8\u91cf res \u8bbe\u4e3a\u51fd\u6570\u53c2\u6570\uff0c\u4ece\u800c\u5b9e\u73b0\u5c3e\u9012\u5f52\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def tail_recur(n, res):\n    \"\"\"\u5c3e\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u9012\u5f52\u8c03\u7528\n    return tail_recur(n - 1, res + n)\n
    recursion.cpp
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.java
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.cs
    /* \u5c3e\u9012\u5f52 */\nint TailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return TailRecur(n - 1, res + n);\n}\n
    recursion.go
    /* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n int, res int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n-1, res+n)\n}\n
    recursion.swift
    /* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n: n - 1, res: res + n)\n}\n
    recursion.js
    /* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n, res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.ts
    /* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.dart
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u9012\u5f52\u8c03\u7528\n  return tailRecur(n - 1, res + n);\n}\n
    recursion.rs
    /* \u5c3e\u9012\u5f52 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    tail_recur(n - 1, res + n)\n}\n
    recursion.c
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.kt
    /* \u5c3e\u9012\u5f52 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u6dfb\u52a0 tailrec \u5173\u952e\u8bcd\uff0c\u4ee5\u5f00\u542f\u5c3e\u9012\u5f52\u4f18\u5316\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n)\n}\n
    recursion.rb
    ### \u5c3e\u9012\u5f52 ###\ndef tail_recur(n, res)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return res if n == 0\n  # \u5c3e\u9012\u5f52\u8c03\u7528\n  tail_recur(n - 1, res + n)\nend\n
    recursion.zig
    // \u5c3e\u9012\u5f52\u51fd\u6570\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5c3e\u9012\u5f52\u7684\u6267\u884c\u8fc7\u7a0b\u5982\u56fe 2-5 \u6240\u793a\u3002\u5bf9\u6bd4\u666e\u901a\u9012\u5f52\u548c\u5c3e\u9012\u5f52\uff0c\u4e24\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u6267\u884c\u70b9\u662f\u4e0d\u540c\u7684\u3002

    • \u666e\u901a\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u6bcf\u5c42\u8fd4\u56de\u540e\u90fd\u8981\u518d\u6267\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
    • \u5c3e\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u53ea\u9700\u5c42\u5c42\u8fd4\u56de\u3002

    \u56fe 2-5 \u00a0 \u5c3e\u9012\u5f52\u8fc7\u7a0b

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u8bb8\u591a\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u5e76\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\u3002\u4f8b\u5982\uff0cPython \u9ed8\u8ba4\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u6570\u662f\u5c3e\u9012\u5f52\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u4f1a\u9047\u5230\u6808\u6ea2\u51fa\u95ee\u9898\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u9012\u5f52\u6811","text":"

    \u5f53\u5904\u7406\u4e0e\u201c\u5206\u6cbb\u201d\u76f8\u5173\u7684\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u9012\u5f52\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c2\u3001\u4ee3\u7801\u66f4\u52a0\u6613\u8bfb\u3002\u4ee5\u201c\u6590\u6ce2\u90a3\u5951\u6570\u5217\u201d\u4e3a\u4f8b\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6590\u6ce2\u90a3\u5951\u6570\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8be5\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u3002

    \u8bbe\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u4e3a \\(f(n)\\) \uff0c\u6613\u5f97\u4e24\u4e2a\u7ed3\u8bba\u3002

    • \u6570\u5217\u7684\u524d\u4e24\u4e2a\u6570\u5b57\u4e3a \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
    • \u6570\u5217\u4e2d\u7684\u6bcf\u4e2a\u6570\u5b57\u662f\u524d\u4e24\u4e2a\u6570\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

    \u6309\u7167\u9012\u63a8\u5173\u7cfb\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5c06\u524d\u4e24\u4e2a\u6570\u5b57\u4f5c\u4e3a\u7ec8\u6b62\u6761\u4ef6\uff0c\u4fbf\u53ef\u5199\u51fa\u9012\u5f52\u4ee3\u7801\u3002\u8c03\u7528 fib(n) \u5373\u53ef\u5f97\u5230\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def fib(n: int) -> int:\n    \"\"\"\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n
    recursion.cpp
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.java
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.cs
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint Fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.go
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
    recursion.swift
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
    recursion.js
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.ts
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.dart
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7ed3\u679c f(n)\n  return res;\n}\n
    recursion.rs
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfn fib(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c\n    res\n}\n
    recursion.c
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.kt
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfun fib(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
    recursion.rb
    ### \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 ###\ndef fib(n)\n  # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7ed3\u679c f(n)\n  res\nend\n
    recursion.zig
    // \u6590\u6ce2\u90a3\u5951\u6570\u5217\nfn fib(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u6211\u4eec\u5728\u51fd\u6570\u5185\u9012\u5f52\u8c03\u7528\u4e86\u4e24\u4e2a\u51fd\u6570\uff0c\u8fd9\u610f\u5473\u7740\u4ece\u4e00\u4e2a\u8c03\u7528\u4ea7\u751f\u4e86\u4e24\u4e2a\u8c03\u7528\u5206\u652f\u3002\u5982\u56fe 2-6 \u6240\u793a\uff0c\u8fd9\u6837\u4e0d\u65ad\u9012\u5f52\u8c03\u7528\u4e0b\u53bb\uff0c\u6700\u7ec8\u5c06\u4ea7\u751f\u4e00\u68f5\u5c42\u6570\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff08recursion tree\uff09\u3002

    \u56fe 2-6 \u00a0 \u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u9012\u5f52\u6811

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9012\u5f52\u4f53\u73b0\u4e86\u201c\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u5b50\u95ee\u9898\u201d\u7684\u601d\u7ef4\u8303\u5f0f\uff0c\u8fd9\u79cd\u5206\u6cbb\u7b56\u7565\u81f3\u5173\u91cd\u8981\u3002

    • \u4ece\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u7d22\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u7b49\u8bb8\u591a\u91cd\u8981\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5e94\u7528\u4e86\u8fd9\u79cd\u601d\u7ef4\u65b9\u5f0f\u3002
    • \u4ece\u6570\u636e\u7ed3\u6784\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u5929\u7136\u9002\u5408\u5904\u7406\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u76f8\u5173\u95ee\u9898\uff0c\u56e0\u4e3a\u5b83\u4eec\u975e\u5e38\u9002\u5408\u7528\u5206\u6cbb\u601d\u60f3\u8fdb\u884c\u5206\u6790\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u4e24\u8005\u5bf9\u6bd4","text":"

    \u603b\u7ed3\u4ee5\u4e0a\u5185\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5b9e\u73b0\u3001\u6027\u80fd\u548c\u9002\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

    \u8868 2-1 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52\u7279\u70b9\u5bf9\u6bd4

    \u8fed\u4ee3 \u9012\u5f52 \u5b9e\u73b0\u65b9\u5f0f \u5faa\u73af\u7ed3\u6784 \u51fd\u6570\u8c03\u7528\u81ea\u8eab \u65f6\u95f4\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f83\u9ad8\uff0c\u65e0\u51fd\u6570\u8c03\u7528\u5f00\u9500 \u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u90fd\u4f1a\u4ea7\u751f\u5f00\u9500 \u5185\u5b58\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u5185\u5b58\u7a7a\u95f4 \u7d2f\u79ef\u51fd\u6570\u8c03\u7528\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u6808\u5e27\u7a7a\u95f4 \u9002\u7528\u95ee\u9898 \u9002\u7528\u4e8e\u7b80\u5355\u5faa\u73af\u4efb\u52a1\uff0c\u4ee3\u7801\u76f4\u89c2\u3001\u53ef\u8bfb\u6027\u597d \u9002\u7528\u4e8e\u5b50\u95ee\u9898\u5206\u89e3\uff0c\u5982\u6811\u3001\u56fe\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u4ee3\u7801\u7ed3\u6784\u7b80\u6d01\u3001\u6e05\u6670

    Tip

    \u5982\u679c\u611f\u89c9\u4ee5\u4e0b\u5185\u5bb9\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5728\u8bfb\u5b8c\u201c\u6808\u201d\u7ae0\u8282\u540e\u518d\u6765\u590d\u4e60\u3002

    \u90a3\u4e48\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5177\u6709\u4ec0\u4e48\u5185\u5728\u8054\u7cfb\u5462\uff1f\u4ee5\u4e0a\u8ff0\u9012\u5f52\u51fd\u6570\u4e3a\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u9012\u5f52\u7684\u201c\u5f52\u201d\u9636\u6bb5\u8fdb\u884c\u3002\u8fd9\u610f\u5473\u7740\u6700\u521d\u88ab\u8c03\u7528\u7684\u51fd\u6570\u5b9e\u9645\u4e0a\u662f\u6700\u540e\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u8fd9\u79cd\u5de5\u4f5c\u673a\u5236\u4e0e\u6808\u7684\u201c\u5148\u5165\u540e\u51fa\u201d\u539f\u5219\u5f02\u66f2\u540c\u5de5\u3002

    \u4e8b\u5b9e\u4e0a\uff0c\u201c\u8c03\u7528\u6808\u201d\u548c\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u8fd9\u7c7b\u9012\u5f52\u672f\u8bed\u5df2\u7ecf\u6697\u793a\u4e86\u9012\u5f52\u4e0e\u6808\u4e4b\u95f4\u7684\u5bc6\u5207\u5173\u7cfb\u3002

    1. \u9012\uff1a\u5f53\u51fd\u6570\u88ab\u8c03\u7528\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5728\u201c\u8c03\u7528\u6808\u201d\u4e0a\u4e3a\u8be5\u51fd\u6570\u5206\u914d\u65b0\u7684\u6808\u5e27\uff0c\u7528\u4e8e\u5b58\u50a8\u51fd\u6570\u7684\u5c40\u90e8\u53d8\u91cf\u3001\u53c2\u6570\u3001\u8fd4\u56de\u5730\u5740\u7b49\u6570\u636e\u3002
    2. \u5f52\uff1a\u5f53\u51fd\u6570\u5b8c\u6210\u6267\u884c\u5e76\u8fd4\u56de\u65f6\uff0c\u5bf9\u5e94\u7684\u6808\u5e27\u4f1a\u88ab\u4ece\u201c\u8c03\u7528\u6808\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u590d\u4e4b\u524d\u51fd\u6570\u7684\u6267\u884c\u73af\u5883\u3002

    \u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u8c03\u7528\u6808\u7684\u884c\u4e3a\uff0c\u4ece\u800c\u5c06\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u5f62\u5f0f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\"\"\"\n    # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack = []\n    res = 0\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in range(n, 0, -1):\n        # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while stack:\n        # \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
    recursion.cpp
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack<int> stack;\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.empty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.java
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.isEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.cs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<int> stack = new();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.Push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.Count > 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.go
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack := list.New()\n    res := 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i := n; i > 0; i-- {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.PushBack(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    for stack.Len() != 0 {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.swift
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [Int] = []\n    var res = 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1 ... n).reversed() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.isEmpty {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.js
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    const stack = [];\n    let res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.ts
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808 \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.dart
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  List<int> stack = [];\n  int res = 0;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for (int i = n; i > 0; i--) {\n    // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack.add(i);\n  }\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while (!stack.isEmpty) {\n    // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
    recursion.rs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1..=n).rev() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.is_empty() {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
    recursion.c
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u501f\u52a9\u4e00\u4e2a\u5927\u6570\u7ec4\u6765\u6a21\u62df\u6808\n    int top = -1;    // \u6808\u9876\u7d22\u5f15\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack[1 + top++] = i;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (top >= 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.kt
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    val stack = Stack<Int>()\n    var res = 0\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    for (i in n downTo 0) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i)\n    }\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    while (stack.isNotEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.rb
    ### \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  stack = []\n  res = 0\n\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for i in n.downto(0)\n    # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack << i\n  end\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
    recursion.zig
    // \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u5f53\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u540e\uff0c\u4ee3\u7801\u53d8\u5f97\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5c3d\u7ba1\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5f88\u591a\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f6c\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u8fd9\u6837\u505a\uff0c\u6709\u4ee5\u4e0b\u4e24\u70b9\u539f\u56e0\u3002

    • \u8f6c\u5316\u540e\u7684\u4ee3\u7801\u53ef\u80fd\u66f4\u52a0\u96be\u4ee5\u7406\u89e3\uff0c\u53ef\u8bfb\u6027\u66f4\u5dee\u3002
    • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\u7684\u884c\u4e3a\u53ef\u80fd\u975e\u5e38\u56f0\u96be\u3002

    \u603b\u4e4b\uff0c\u9009\u62e9\u8fed\u4ee3\u8fd8\u662f\u9012\u5f52\u53d6\u51b3\u4e8e\u7279\u5b9a\u95ee\u9898\u7684\u6027\u8d28\u3002\u5728\u7f16\u7a0b\u5b9e\u8df5\u4e2d\uff0c\u6743\u8861\u4e24\u8005\u7684\u4f18\u52a3\u5e76\u6839\u636e\u60c5\u5883\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\u81f3\u5173\u91cd\u8981\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30","text":"

    \u5728\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u8ffd\u6c42\u4ee5\u4e0b\u4e24\u4e2a\u5c42\u9762\u7684\u76ee\u6807\u3002

    1. \u627e\u5230\u95ee\u9898\u89e3\u6cd5\uff1a\u7b97\u6cd5\u9700\u8981\u5728\u89c4\u5b9a\u7684\u8f93\u5165\u8303\u56f4\u5185\u53ef\u9760\u5730\u6c42\u5f97\u95ee\u9898\u7684\u6b63\u786e\u89e3\u3002
    2. \u5bfb\u6c42\u6700\u4f18\u89e3\u6cd5\uff1a\u540c\u4e00\u4e2a\u95ee\u9898\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u89e3\u6cd5\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u5c3d\u53ef\u80fd\u9ad8\u6548\u7684\u7b97\u6cd5\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5728\u80fd\u591f\u89e3\u51b3\u95ee\u9898\u7684\u524d\u63d0\u4e0b\uff0c\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u4e3a\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u4e24\u4e2a\u7ef4\u5ea6\u3002

    • \u65f6\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u7684\u957f\u77ed\u3002
    • \u7a7a\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u7684\u5927\u5c0f\u3002

    \u7b80\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u8bbe\u8ba1\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u53ea\u6709\u8fd9\u6837\uff0c\u6211\u4eec\u624d\u80fd\u5c06\u5404\u79cd\u7b97\u6cd5\u8fdb\u884c\u5bf9\u6bd4\uff0c\u8fdb\u800c\u6307\u5bfc\u7b97\u6cd5\u8bbe\u8ba1\u4e0e\u4f18\u5316\u8fc7\u7a0b\u3002

    \u6548\u7387\u8bc4\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u4e3a\u4e24\u79cd\uff1a\u5b9e\u9645\u6d4b\u8bd5\u3001\u7406\u8bba\u4f30\u7b97\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5b9e\u9645\u6d4b\u8bd5","text":"

    \u5047\u8bbe\u6211\u4eec\u73b0\u5728\u6709\u7b97\u6cd5 A \u548c\u7b97\u6cd5 B \uff0c\u5b83\u4eec\u90fd\u80fd\u89e3\u51b3\u540c\u4e00\u95ee\u9898\uff0c\u73b0\u5728\u9700\u8981\u5bf9\u6bd4\u8fd9\u4e24\u4e2a\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u53f0\u8ba1\u7b97\u673a\uff0c\u8fd0\u884c\u8fd9\u4e24\u4e2a\u7b97\u6cd5\uff0c\u5e76\u76d1\u63a7\u8bb0\u5f55\u5b83\u4eec\u7684\u8fd0\u884c\u65f6\u95f4\u548c\u5185\u5b58\u5360\u7528\u60c5\u51b5\u3002\u8fd9\u79cd\u8bc4\u4f30\u65b9\u5f0f\u80fd\u591f\u53cd\u6620\u771f\u5b9e\u60c5\u51b5\uff0c\u4f46\u4e5f\u5b58\u5728\u8f83\u5927\u7684\u5c40\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u96be\u4ee5\u6392\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5e72\u6270\u56e0\u7d20\u3002\u786c\u4ef6\u914d\u7f6e\u4f1a\u5f71\u54cd\u7b97\u6cd5\u7684\u6027\u80fd\u8868\u73b0\u3002\u6bd4\u5982\u4e00\u4e2a\u7b97\u6cd5\u7684\u5e76\u884c\u5ea6\u8f83\u9ad8\uff0c\u90a3\u4e48\u5b83\u5c31\u66f4\u9002\u5408\u5728\u591a\u6838 CPU \u4e0a\u8fd0\u884c\uff0c\u4e00\u4e2a\u7b97\u6cd5\u7684\u5185\u5b58\u64cd\u4f5c\u5bc6\u96c6\uff0c\u90a3\u4e48\u5b83\u5728\u9ad8\u6027\u80fd\u5185\u5b58\u4e0a\u7684\u8868\u73b0\u5c31\u4f1a\u66f4\u597d\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u7b97\u6cd5\u5728\u4e0d\u540c\u7684\u673a\u5668\u4e0a\u7684\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\u662f\u4e0d\u4e00\u81f4\u7684\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u9700\u8981\u5728\u5404\u79cd\u673a\u5668\u4e0a\u8fdb\u884c\u6d4b\u8bd5\uff0c\u7edf\u8ba1\u5e73\u5747\u6548\u7387\uff0c\u800c\u8fd9\u662f\u4e0d\u73b0\u5b9e\u7684\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u5f00\u5b8c\u6574\u6d4b\u8bd5\u975e\u5e38\u8017\u8d39\u8d44\u6e90\u3002\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u7684\u53d8\u5316\uff0c\u7b97\u6cd5\u4f1a\u8868\u73b0\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5927\u65f6\uff0c\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u4e3a\u4e86\u5f97\u5230\u6709\u8bf4\u670d\u529b\u7684\u7ed3\u8bba\uff0c\u6211\u4eec\u9700\u8981\u6d4b\u8bd5\u5404\u79cd\u89c4\u6a21\u7684\u8f93\u5165\u6570\u636e\uff0c\u800c\u8fd9\u9700\u8981\u8017\u8d39\u5927\u91cf\u7684\u8ba1\u7b97\u8d44\u6e90\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2 \u00a0 \u7406\u8bba\u4f30\u7b97","text":"

    \u7531\u4e8e\u5b9e\u9645\u6d4b\u8bd5\u5177\u6709\u8f83\u5927\u7684\u5c40\u9650\u6027\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u4ec5\u901a\u8fc7\u4e00\u4e9b\u8ba1\u7b97\u6765\u8bc4\u4f30\u7b97\u6cd5\u7684\u6548\u7387\u3002\u8fd9\u79cd\u4f30\u7b97\u65b9\u6cd5\u88ab\u79f0\u4e3a\u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7b80\u79f0\u590d\u6742\u5ea6\u5206\u6790\u3002

    \u590d\u6742\u5ea6\u5206\u6790\u80fd\u591f\u4f53\u73b0\u7b97\u6cd5\u8fd0\u884c\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e4b\u95f4\u7684\u5173\u7cfb\u3002\u5b83\u63cf\u8ff0\u4e86\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u7b97\u6cd5\u6267\u884c\u6240\u9700\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u5b9a\u4e49\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u5206\u4e3a\u4e09\u4e2a\u91cd\u70b9\u6765\u7406\u89e3\u3002

    • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u201d\u5206\u522b\u5bf9\u5e94\u65f6\u95f4\u590d\u6742\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u3002
    • \u201c\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u7740\u590d\u6742\u5ea6\u53cd\u6620\u4e86\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u4e0e\u8f93\u5165\u6570\u636e\u4f53\u91cf\u4e4b\u95f4\u7684\u5173\u7cfb\u3002
    • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u201d\u8868\u793a\u590d\u6742\u5ea6\u5206\u6790\u5173\u6ce8\u7684\u4e0d\u662f\u8fd0\u884c\u65f6\u95f4\u6216\u5360\u7528\u7a7a\u95f4\u7684\u5177\u4f53\u503c\uff0c\u800c\u662f\u65f6\u95f4\u6216\u7a7a\u95f4\u589e\u957f\u7684\u201c\u5feb\u6162\u201d\u3002

    \u590d\u6742\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5b9e\u9645\u6d4b\u8bd5\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u3002

    • \u5b83\u65e0\u9700\u5b9e\u9645\u8fd0\u884c\u4ee3\u7801\uff0c\u66f4\u52a0\u7eff\u8272\u8282\u80fd\u3002
    • \u5b83\u72ec\u7acb\u4e8e\u6d4b\u8bd5\u73af\u5883\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\u3002
    • \u5b83\u53ef\u4ee5\u4f53\u73b0\u4e0d\u540c\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6027\u80fd\u3002

    Tip

    \u5982\u679c\u4f60\u4ecd\u5bf9\u590d\u6742\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u65e0\u987b\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

    \u590d\u6742\u5ea6\u5206\u6790\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u628a\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6807\u5c3a\u201d\uff0c\u4f7f\u6211\u4eec\u53ef\u4ee5\u8861\u91cf\u6267\u884c\u67d0\u4e2a\u7b97\u6cd5\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\uff0c\u5bf9\u6bd4\u4e0d\u540c\u7b97\u6cd5\u4e4b\u95f4\u7684\u6548\u7387\u3002

    \u590d\u6742\u5ea6\u662f\u4e2a\u6570\u5b66\u6982\u5ff5\uff0c\u5bf9\u4e8e\u521d\u5b66\u8005\u53ef\u80fd\u6bd4\u8f83\u62bd\u8c61\uff0c\u5b66\u4e60\u96be\u5ea6\u76f8\u5bf9\u8f83\u9ad8\u3002\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u770b\uff0c\u590d\u6742\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9002\u5408\u4f5c\u4e3a\u6700\u5148\u4ecb\u7ecd\u7684\u5185\u5bb9\u3002\u7136\u800c\uff0c\u5f53\u6211\u4eec\u8ba8\u8bba\u67d0\u4e2a\u6570\u636e\u7ed3\u6784\u6216\u7b97\u6cd5\u7684\u7279\u70b9\u65f6\uff0c\u96be\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u8fd0\u884c\u901f\u5ea6\u548c\u7a7a\u95f4\u4f7f\u7528\u60c5\u51b5\u3002

    \u7efc\u4e0a\u6240\u8ff0\uff0c\u5efa\u8bae\u4f60\u5728\u6df1\u5165\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5bf9\u590d\u6742\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u4e86\u89e3\uff0c\u4ee5\u4fbf\u80fd\u591f\u5b8c\u6210\u7b80\u5355\u7b97\u6cd5\u7684\u590d\u6742\u5ea6\u5206\u6790\u3002

    "},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6","text":"

    \u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u6982\u5ff5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u5e38\u7c7b\u4f3c\uff0c\u53ea\u9700\u5c06\u201c\u8fd0\u884c\u65f6\u95f4\u201d\u66ff\u6362\u4e3a\u201c\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u201d\u3002

    "},{"location":"chapter_computational_complexity/space_complexity/#241","title":"2.4.1 \u00a0 \u7b97\u6cd5\u76f8\u5173\u7a7a\u95f4","text":"

    \u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

    • \u8f93\u5165\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u5165\u6570\u636e\u3002
    • \u6682\u5b58\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u53d8\u91cf\u3001\u5bf9\u8c61\u3001\u51fd\u6570\u4e0a\u4e0b\u6587\u7b49\u6570\u636e\u3002
    • \u8f93\u51fa\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u51fa\u6570\u636e\u3002

    \u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u7edf\u8ba1\u8303\u56f4\u662f\u201c\u6682\u5b58\u7a7a\u95f4\u201d\u52a0\u4e0a\u201c\u8f93\u51fa\u7a7a\u95f4\u201d\u3002

    \u6682\u5b58\u7a7a\u95f4\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

    • \u6682\u5b58\u6570\u636e\uff1a\u7528\u4e8e\u4fdd\u5b58\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5404\u79cd\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u7b49\u3002
    • \u6808\u5e27\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u8c03\u7528\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u3002\u7cfb\u7edf\u5728\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\u90fd\u4f1a\u5728\u6808\u9876\u90e8\u521b\u5efa\u4e00\u4e2a\u6808\u5e27\uff0c\u51fd\u6570\u8fd4\u56de\u540e\uff0c\u6808\u5e27\u7a7a\u95f4\u4f1a\u88ab\u91ca\u653e\u3002
    • \u6307\u4ee4\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u7f16\u8bd1\u540e\u7684\u7a0b\u5e8f\u6307\u4ee4\uff0c\u5728\u5b9e\u9645\u7edf\u8ba1\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8ba1\u3002

    \u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5e8f\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u7edf\u8ba1\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u8f93\u51fa\u6570\u636e\u4e09\u90e8\u5206\uff0c\u5982\u56fe 2-15 \u6240\u793a\u3002

    \u56fe 2-15 \u00a0 \u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u5173\u7a7a\u95f4

    \u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class Node:\n    \"\"\"\u7c7b\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u8282\u70b9\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f93\u5165\u6570\u636e\n    A = 0                 # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node(0)        # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function()        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return A + b + c      # \u8f93\u51fa\u6570\u636e\n
    /* \u7ed3\u6784\u4f53 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node* node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = func();           // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    final int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new(0);       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = Function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7ed3\u6784\u4f53 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u521b\u5efa node \u7ed3\u6784\u4f53  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f93\u5165\u6570\u636e\n    const a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b := 0                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    newNode(0)              // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c := function()         // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c        // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u6570 */\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f93\u5165\u6570\u636e\n    let a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0             // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node(x: 0) // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function()    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c      // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f93\u5165\u6570\u636e\n    const a = 0;              // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f93\u5165\u6570\u636e\n    const a = 0;                        // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                          // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0);           // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();              // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;                   // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f93\u5165\u6570\u636e\n  const int a = 0;      // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n  int b = 0;            // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n  Node node = Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n  int c = function();   // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n  return a + b + c;     // \u8f93\u51fa\u6570\u636e\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7ed3\u6784\u4f53 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u521b\u5efa Node \u7ed3\u6784\u4f53 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u6570 */\nfn function() -> i32 {      \n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f93\u5165\u6570\u636e\n    const a: i32 = 0;               // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let mut b = 0;                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node::new(0);        // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function();             // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;               // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f93\u5165\u6570\u636e\n    const int a = 0;   // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;         // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    int c = func();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;  // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f93\u5165\u6570\u636e\n    val a = 0                // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    val node = Node(0)       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    val c = function()       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c         // \u8f93\u51fa\u6570\u636e\n}\n
    ### \u7c7b ###\nclass Node\n    attr_accessor :val      # \u8282\u70b9\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u6570 ###\ndef function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f93\u5165\u6570\u636e\n    a = 0               # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b = 0               # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node.new(0)  # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    a + b + c           # \u8f93\u51fa\u6570\u636e\nend\n
    \n
    "},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

    \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c06\u7edf\u8ba1\u5bf9\u8c61\u4ece\u201c\u64cd\u4f5c\u6570\u91cf\u201d\u8f6c\u4e3a\u201c\u4f7f\u7528\u7a7a\u95f4\u5927\u5c0f\u201d\u3002

    \u800c\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u3002\u8fd9\u662f\u56e0\u4e3a\u5185\u5b58\u7a7a\u95f4\u662f\u4e00\u9879\u786c\u6027\u8981\u6c42\uff0c\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u5728\u6240\u6709\u8f93\u5165\u6570\u636e\u4e0b\u90fd\u6709\u8db3\u591f\u7684\u5185\u5b58\u7a7a\u95f4\u9884\u7559\u3002

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u4e24\u5c42\u542b\u4e49\u3002

    1. \u4ee5\u6700\u5dee\u8f93\u5165\u6570\u636e\u4e3a\u51c6\uff1a\u5f53 \\(n < 10\\) \u65f6\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1b\u4f46\u5f53 \\(n > 10\\) \u65f6\uff0c\u521d\u59cb\u5316\u7684\u6570\u7ec4 nums \u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
    2. \u4ee5\u7b97\u6cd5\u8fd0\u884c\u4e2d\u7684\u5cf0\u503c\u5185\u5b58\u4e3a\u51c6\uff1a\u4f8b\u5982\uff0c\u7a0b\u5e8f\u5728\u6267\u884c\u6700\u540e\u4e00\u884c\u4e4b\u524d\uff0c\u5360\u7528 \\(O(1)\\) \u7a7a\u95f4\uff1b\u5f53\u521d\u59cb\u5316\u6570\u7ec4 nums \u65f6\uff0c\u7a0b\u5e8f\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
    void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
    void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
    void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
    func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
    func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
    function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
    function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
    void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
    fn algorithm(n: i32) {\n    let a = 0;                              // O(1)\n    let b = [0; 10000];                     // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];     // O(n)\n    }\n}\n
    void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
    fun algorithm(n: Int) {\n    val a = 0                    // O(1)\n    val b = IntArray(10000)      // O(1)\n    if (n > 10) {\n        val nums = IntArray(n)   // O(n)\n    }\n}\n
    def algorithm(n)\n    a = 0                           # O(1)\n    b = Array.new(10000)            # O(1)\n    nums = Array.new(n) if n > 10   # O(n)\nend\n
    \n

    \u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7edf\u8ba1\u6808\u5e27\u7a7a\u95f4\u3002\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def function() -> int:\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
    int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
    func function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
    @discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
    function constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    function constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
    fn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
    int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    fun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
    def function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
    \n

    \u51fd\u6570 loop() \u548c recur() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u4f46\u7a7a\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u3002

    • \u51fd\u6570 loop() \u5728\u5faa\u73af\u4e2d\u8c03\u7528\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f6e\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u5e76\u91ca\u653e\u4e86\u6808\u5e27\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002
    • \u9012\u5f52\u51fd\u6570 recur() \u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f1a\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 recur() \uff0c\u4ece\u800c\u5360\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002
    "},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

    \u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u56fe 2-16 \u5c55\u793a\u4e86\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\uff08\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\uff09\u3002

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} \\end{aligned} \\]

    \u56fe 2-16 \u00a0 \u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

    "},{"location":"chapter_computational_complexity/space_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

    \u5e38\u6570\u9636\u5e38\u89c1\u4e8e\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u7684\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u5faa\u73af\u4e2d\u521d\u59cb\u5316\u53d8\u91cf\u6216\u8c03\u7528\u51fd\u6570\u800c\u5360\u7528\u7684\u5185\u5b58\uff0c\u5728\u8fdb\u5165\u4e0b\u4e00\u5faa\u73af\u540e\u5c31\u4f1a\u88ab\u91ca\u653e\uff0c\u56e0\u6b64\u4e0d\u4f1a\u7d2f\u79ef\u5360\u7528\u7a7a\u95f4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        c = 0\n    # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        function()\n
    space_complexity.cpp
    /* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.java
    /* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
    space_complexity.cs
    /* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid Constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
    space_complexity.go
    /* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
    space_complexity.swift
    /* \u51fd\u6570 */\n@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
    space_complexity.js
    /* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.ts
    /* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.dart
    /* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n  // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
    space_complexity.rs
    /* \u51fd\u6570 */\nfn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        function();\n    }\n}\n
    space_complexity.c
    /* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.kt
    /* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfun constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        function()\n    }\n}\n
    space_complexity.rb
    ### \u51fd\u6570 ###\ndef function\n  # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6570\u9636 ###\ndef constant(n)\n  # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { c = 0 }\n  # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { function }\nend\n
    space_complexity.zig
    // \u51fd\u6570\nfn function() i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_computational_complexity/space_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

    \u7ebf\u6027\u9636\u5e38\u89c1\u4e8e\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u6b63\u6bd4\u7684\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u7b49\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def linear(n: int):\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    nums = [0] * n\n    # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
    space_complexity.cpp
    /* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<int> nums(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
    space_complexity.java
    /* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
    space_complexity.cs
    /* \u7ebf\u6027\u9636 */\nvoid Linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
    space_complexity.go
    /* \u7ebf\u6027\u9636 */\nfunc spaceLinear(n int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    _ = make([]int, n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
    space_complexity.swift
    /* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let nums = Array(repeating: 0, count: n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
    space_complexity.js
    /* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
    space_complexity.ts
    /* \u7ebf\u6027\u9636 */\nfunction linear(n: number): void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
    space_complexity.dart
    /* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n  // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n  List<int> nums = List.filled(n, 0);\n  // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
    space_complexity.rs
    /* \u7ebf\u6027\u9636 */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nums = vec![0; n as usize];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
    space_complexity.c
    /* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
    space_complexity.kt
    /* \u7ebf\u6027\u9636 */\nfun linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    val nums = Array(n) { 0 }\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
    space_complexity.rb
    ### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  nums = Array.new(n, 0)\n\n  # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
    space_complexity.zig
    // \u7ebf\u6027\u9636\nfn linear(comptime n: i32) !void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    var nums = [_]i32{0}**n;\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5373\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u6570\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def linear_recur(n: int):\n    \"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    print(\"\u9012\u5f52 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
    space_complexity.cpp
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u9012\u5f52 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.java
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u9012\u5f52 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
    space_complexity.go
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u9012\u5f52 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u9012\u5f52 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n  print('\u9012\u5f52 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u9012\u5f52 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
    space_complexity.c
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u9012\u5f52 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.kt
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u9012\u5f52 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
    space_complexity.rb
    ### \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef linear_recur(n)\n  puts \"\u9012\u5f52 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
    space_complexity.zig
    // \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-17 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u7ebf\u6027\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

    \u5e73\u65b9\u9636\u5e38\u89c1\u4e8e\u77e9\u9635\u548c\u56fe\uff0c\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u5e73\u65b9\u5173\u7cfb\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    num_matrix = [[0] * n for _ in range(n)]\n
    space_complexity.cpp
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
    space_complexity.java
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
    space_complexity.cs
    /* \u5e73\u65b9\u9636 */\nvoid Quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
    space_complexity.go
    /* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
    space_complexity.swift
    /* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
    space_complexity.ts
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): void {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
    space_complexity.dart
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n  // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
    space_complexity.rs
    /* \u5e73\u65b9\u9636 */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
    space_complexity.c
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
    space_complexity.kt
    /* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
    space_complexity.rb
    ### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  Array.new(n) { Array.new(n, 0) }\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 2-18 \u6240\u793a\uff0c\u8be5\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5728\u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u4e2a\u6570\u7ec4\uff0c\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u957f\u5ea6\u4e3a \\(n / 2\\) \uff0c\u56e0\u6b64\u603b\u4f53\u5360\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
    space_complexity.cpp
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.java
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
    space_complexity.go
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
    space_complexity.c
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
    space_complexity.kt
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
    space_complexity.rb
    ### \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-18 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u5e73\u65b9\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

    \u6307\u6570\u9636\u5e38\u89c1\u4e8e\u4e8c\u53c9\u6811\u3002\u89c2\u5bdf\u56fe 2-19 \uff0c\u5c42\u6570\u4e3a \\(n\\) \u7684\u201c\u6ee1\u4e8c\u53c9\u6811\u201d\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(2^n - 1\\) \uff0c\u5360\u7528 \\(O(2^n)\\) \u7a7a\u95f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
    space_complexity.cpp
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.java
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.cs
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
    space_complexity.go
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
    space_complexity.swift
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
    space_complexity.js
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.ts
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.dart
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
    space_complexity.rs
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
    space_complexity.c
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.kt
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
    space_complexity.rb
    ### \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
    space_complexity.zig
    // \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-19 \u00a0 \u6ee1\u4e8c\u53c9\u6811\u4ea7\u751f\u7684\u6307\u6570\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

    \u5bf9\u6570\u9636\u5e38\u89c1\u4e8e\u5206\u6cbb\u7b97\u6cd5\u3002\u4f8b\u5982\u5f52\u5e76\u6392\u5e8f\uff0c\u8f93\u5165\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u6bcf\u8f6e\u9012\u5f52\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6808\u5e27\u7a7a\u95f4\u3002

    \u518d\u4f8b\u5982\u5c06\u6570\u5b57\u8f6c\u5316\u4e3a\u5b57\u7b26\u4e32\uff0c\u8f93\u5165\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6570\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6743\u8861\u65f6\u95f4\u4e0e\u7a7a\u95f4","text":"

    \u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u80fd\u8fbe\u5230\u6700\u4f18\u3002\u7136\u800c\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u540c\u65f6\u4f18\u5316\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96be\u3002

    \u964d\u4f4e\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a\u4ee3\u4ef7\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u4eec\u5c06\u727a\u7272\u5185\u5b58\u7a7a\u95f4\u6765\u63d0\u5347\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u601d\u8def\u79f0\u4e3a\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff1b\u53cd\u4e4b\uff0c\u5219\u79f0\u4e3a\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002

    \u9009\u62e9\u54ea\u79cd\u601d\u8def\u53d6\u51b3\u4e8e\u6211\u4eec\u66f4\u770b\u91cd\u54ea\u4e2a\u65b9\u9762\u3002\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u65f6\u95f4\u6bd4\u7a7a\u95f4\u66f4\u5b9d\u8d35\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u5f53\u7136\uff0c\u5728\u6570\u636e\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\uff0c\u63a7\u5236\u7a7a\u95f4\u590d\u6742\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

    "},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"

    \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30

    • \u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e24\u4e2a\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\u3002
    • \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u6d4b\u8bd5\u6765\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96be\u4ee5\u6d88\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5f71\u54cd\uff0c\u4e14\u4f1a\u8017\u8d39\u5927\u91cf\u8ba1\u7b97\u8d44\u6e90\u3002
    • \u590d\u6742\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5b9e\u9645\u6d4b\u8bd5\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\uff0c\u5e76\u4e14\u80fd\u591f\u63ed\u793a\u7b97\u6cd5\u5728\u4e0d\u540c\u6570\u636e\u89c4\u6a21\u4e0b\u7684\u6548\u7387\u3002

    \u65f6\u95f4\u590d\u6742\u5ea6

    • \u65f6\u95f4\u590d\u6742\u5ea6\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\uff0c\u53ef\u4ee5\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f93\u5165\u7684\u6570\u636e\u91cf\u8f83\u5c0f\u6216\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\u65f6\uff0c\u65e0\u6cd5\u7cbe\u786e\u5bf9\u6bd4\u7b97\u6cd5\u6548\u7387\u7684\u4f18\u52a3\u3002
    • \u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u53f7\u8868\u793a\uff0c\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u5f53 \\(n\\) \u8d8b\u5411\u6b63\u65e0\u7a77\u65f6\uff0c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u7684\u589e\u957f\u7ea7\u522b\u3002
    • \u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u4e24\u6b65\uff0c\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002
    • \u5e38\u89c1\u65f6\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n \\log n)\\)\u3001\\(O(n^2)\\)\u3001\\(O(2^n)\\) \u548c \\(O(n!)\\) \u7b49\u3002
    • \u67d0\u4e9b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u51e0\u4e4e\u4e0d\u7528\uff0c\u56e0\u4e3a\u8f93\u5165\u6570\u636e\u4e00\u822c\u9700\u8981\u6ee1\u8db3\u4e25\u683c\u6761\u4ef6\u624d\u80fd\u8fbe\u5230\u6700\u4f73\u60c5\u51b5\u3002
    • \u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53cd\u6620\u7b97\u6cd5\u5728\u968f\u673a\u6570\u636e\u8f93\u5165\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5b9e\u9645\u5e94\u7528\u4e2d\u7684\u7b97\u6cd5\u6027\u80fd\u3002\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u9700\u8981\u7edf\u8ba1\u8f93\u5165\u6570\u636e\u5206\u5e03\u4ee5\u53ca\u7efc\u5408\u540e\u7684\u6570\u5b66\u671f\u671b\u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6

    • \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u4f5c\u7528\u7c7b\u4f3c\u4e8e\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\u3002
    • \u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u76f8\u5173\u5185\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u8f93\u5165\u7a7a\u95f4\u3001\u6682\u5b58\u7a7a\u95f4\u3001\u8f93\u51fa\u7a7a\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u8f93\u5165\u7a7a\u95f4\u4e0d\u7eb3\u5165\u7a7a\u95f4\u590d\u6742\u5ea6\u8ba1\u7b97\u3002\u6682\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u6307\u4ee4\u7a7a\u95f4\uff0c\u5176\u4e2d\u6808\u5e27\u7a7a\u95f4\u901a\u5e38\u4ec5\u5728\u9012\u5f52\u51fd\u6570\u4e2d\u5f71\u54cd\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
    • \u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5373\u7edf\u8ba1\u7b97\u6cd5\u5728\u6700\u5dee\u8f93\u5165\u6570\u636e\u548c\u6700\u5dee\u8fd0\u884c\u65f6\u523b\u4e0b\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
    • \u5e38\u89c1\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n^2)\\) \u548c \\(O(2^n)\\) \u7b49\u3002
    "},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u5c3e\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u5417\uff1f

    \u7406\u8bba\u4e0a\uff0c\u5c3e\u9012\u5f52\u51fd\u6570\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u8fc7\u7edd\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52a8\u4f18\u5316\u5c3e\u9012\u5f52\uff0c\u56e0\u6b64\u901a\u5e38\u8ba4\u4e3a\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \u3002

    Q\uff1a\u51fd\u6570\u548c\u65b9\u6cd5\u8fd9\u4e24\u4e2a\u672f\u8bed\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f

    \u51fd\u6570\uff08function\uff09\u53ef\u4ee5\u88ab\u72ec\u7acb\u6267\u884c\uff0c\u6240\u6709\u53c2\u6570\u90fd\u4ee5\u663e\u5f0f\u4f20\u9012\u3002\u65b9\u6cd5\uff08method\uff09\u4e0e\u4e00\u4e2a\u5bf9\u8c61\u5173\u8054\uff0c\u88ab\u9690\u5f0f\u4f20\u9012\u7ed9\u8c03\u7528\u5b83\u7684\u5bf9\u8c61\uff0c\u80fd\u591f\u5bf9\u7c7b\u7684\u5b9e\u4f8b\u4e2d\u5305\u542b\u7684\u6570\u636e\u8fdb\u884c\u64cd\u4f5c\u3002

    \u4e0b\u9762\u4ee5\u51e0\u79cd\u5e38\u89c1\u7684\u7f16\u7a0b\u8bed\u8a00\u4e3a\u4f8b\u6765\u8bf4\u660e\u3002

    • C \u8bed\u8a00\u662f\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u6ca1\u6709\u9762\u5411\u5bf9\u8c61\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u6570\u3002\u4f46\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u521b\u5efa\u7ed3\u6784\u4f53\uff08struct\uff09\u6765\u6a21\u62df\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff0c\u4e0e\u7ed3\u6784\u4f53\u76f8\u5173\u8054\u7684\u51fd\u6570\u5c31\u76f8\u5f53\u4e8e\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
    • Java \u548c C# \u662f\u9762\u5411\u5bf9\u8c61\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u4ee3\u7801\u5757\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u4e3a\u67d0\u4e2a\u7c7b\u7684\u4e00\u90e8\u5206\u3002\u9759\u6001\u65b9\u6cd5\u7684\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u51fd\u6570\uff0c\u56e0\u4e3a\u5b83\u88ab\u7ed1\u5b9a\u5728\u7c7b\u4e0a\uff0c\u4e0d\u80fd\u8bbf\u95ee\u7279\u5b9a\u7684\u5b9e\u4f8b\u53d8\u91cf\u3002
    • C++ \u548c Python \u65e2\u652f\u6301\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\uff08\u51fd\u6570\uff09\uff0c\u4e5f\u652f\u6301\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff08\u65b9\u6cd5\uff09\u3002

    Q\uff1a\u56fe\u89e3\u201c\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\uff1f

    \u4e0d\u662f\uff0c\u8be5\u56fe\u5c55\u793a\u7684\u662f\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u957f\u8d8b\u52bf\uff0c\u800c\u4e0d\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\u3002

    \u5047\u8bbe\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u6bcf\u6761\u66f2\u7ebf\u7684\u503c\u4e0e\u51fd\u6570\u5bf9\u5e94\u4e0d\u4e0a\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6761\u66f2\u7ebf\u90fd\u5305\u542b\u4e00\u4e2a\u5e38\u6570\u9879\uff0c\u7528\u4e8e\u5c06\u53d6\u503c\u8303\u56f4\u538b\u7f29\u5230\u4e00\u4e2a\u89c6\u89c9\u8212\u9002\u7684\u8303\u56f4\u5185\u3002

    \u5728\u5b9e\u9645\u4e2d\uff0c\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u4e2a\u65b9\u6cd5\u7684\u201c\u5e38\u6570\u9879\u201d\u590d\u6742\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u65e0\u6cd5\u4ec5\u51ed\u590d\u6742\u5ea6\u6765\u9009\u62e9 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u4f18\u89e3\u6cd5\u3002\u4f46\u5bf9\u4e8e \\(n = 8^5\\) \u5c31\u5f88\u597d\u9009\u4e86\uff0c\u8fd9\u65f6\u589e\u957f\u8d8b\u52bf\u5df2\u7ecf\u5360\u4e3b\u5bfc\u4e86\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6","text":"

    \u8fd0\u884c\u65f6\u95f4\u53ef\u4ee5\u76f4\u89c2\u4e14\u51c6\u786e\u5730\u53cd\u6620\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u4eec\u60f3\u51c6\u786e\u9884\u4f30\u4e00\u6bb5\u4ee3\u7801\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u5e94\u8be5\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

    1. \u786e\u5b9a\u8fd0\u884c\u5e73\u53f0\uff0c\u5305\u62ec\u786c\u4ef6\u914d\u7f6e\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u7cfb\u7edf\u73af\u5883\u7b49\uff0c\u8fd9\u4e9b\u56e0\u7d20\u90fd\u4f1a\u5f71\u54cd\u4ee3\u7801\u7684\u8fd0\u884c\u6548\u7387\u3002
    2. \u8bc4\u4f30\u5404\u79cd\u8ba1\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u6253\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
    3. \u7edf\u8ba1\u4ee3\u7801\u4e2d\u6240\u6709\u7684\u8ba1\u7b97\u64cd\u4f5c\uff0c\u5e76\u5c06\u6240\u6709\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u6c42\u548c\uff0c\u4ece\u800c\u5f97\u5230\u8fd0\u884c\u65f6\u95f4\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # \u5faa\u73af n \u6b21\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        System.out.println(0);     // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n    print(0); // 5 ns\n  }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n {     // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfun algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println(0)      // 5 ns\n    }\n}\n
    # \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n)\n    a = 2       # 1 ns\n    a = a + 1   # 1 ns\n    a = a * 2   # 10 ns\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # 1 ns\n        puts 0      # 5 ns\n    end\nend\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

    \u6839\u636e\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u4e3a \\((6n + 12)\\) ns \uff1a

    \\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

    \u4f46\u5b9e\u9645\u4e0a\uff0c\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73b0\u5b9e\u3002\u9996\u5148\uff0c\u6211\u4eec\u4e0d\u5e0c\u671b\u5c06\u9884\u4f30\u65f6\u95f4\u548c\u8fd0\u884c\u5e73\u53f0\u7ed1\u5b9a\uff0c\u56e0\u4e3a\u7b97\u6cd5\u9700\u8981\u5728\u5404\u79cd\u4e0d\u540c\u7684\u5e73\u53f0\u4e0a\u8fd0\u884c\u3002\u5176\u6b21\uff0c\u6211\u4eec\u5f88\u96be\u83b7\u77e5\u6bcf\u79cd\u64cd\u4f5c\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u8fd9\u7ed9\u9884\u4f30\u8fc7\u7a0b\u5e26\u6765\u4e86\u6781\u5927\u7684\u96be\u5ea6\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7edf\u8ba1\u65f6\u95f4\u589e\u957f\u8d8b\u52bf","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u7edf\u8ba1\u7684\u4e0d\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\uff0c\u800c\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002

    \u201c\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u201d\u8fd9\u4e2a\u6982\u5ff5\u6bd4\u8f83\u62bd\u8c61\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7ed9\u5b9a\u4e09\u4e2a\u7b97\u6cd5 A\u3001B \u548c C \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n: int):\n    print(0)\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmA(int n) {\n  print(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algoritm_A(n: Int) {\n    println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfun algorithm_B(n: Int) {\n    for (i in 0..<n){\n        println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algorithm_C(n: Int) {\n    for (i in 0..<1000000) {\n        println(0)\n    }\n}\n
    # \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n)\n    puts 0\nend\n\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n)\n    (0...n).each { puts 0 }\nend\n\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n)\n    (0...1_000_000).each { puts 0 }\nend\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

    \u56fe 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u4e2a\u7b97\u6cd5\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    • \u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u4e2a\u6253\u5370\u64cd\u4f5c\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u4e0d\u968f\u7740 \\(n\\) \u589e\u5927\u800c\u589e\u957f\u3002\u6211\u4eec\u79f0\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002
    • \u7b97\u6cd5 B \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(n\\) \u6b21\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740 \\(n\\) \u589e\u5927\u5448\u7ebf\u6027\u589e\u957f\u3002\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u9636\u201d\u3002
    • \u7b97\u6cd5 C \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(1000000\\) \u6b21\uff0c\u867d\u7136\u8fd0\u884c\u65f6\u95f4\u5f88\u957f\uff0c\u4f46\u5b83\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u3002\u56e0\u6b64 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002

    \u56fe 2-7 \u00a0 \u7b97\u6cd5 A\u3001B \u548c C \u7684\u65f6\u95f4\u589e\u957f\u8d8b\u52bf

    \u76f8\u8f83\u4e8e\u76f4\u63a5\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u70b9\u5462\uff1f

    • \u65f6\u95f4\u590d\u6742\u5ea6\u80fd\u591f\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u7b97\u6cd5 B \u7684\u8fd0\u884c\u65f6\u95f4\u5448\u7ebf\u6027\u589e\u957f\uff0c\u5728 \\(n > 1\\) \u65f6\u6bd4\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u65f6\u6bd4\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5b9e\u4e0a\uff0c\u53ea\u8981\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8db3\u591f\u5927\uff0c\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u7684\u7b97\u6cd5\u4e00\u5b9a\u4f18\u4e8e\u201c\u7ebf\u6027\u9636\u201d\u7684\u7b97\u6cd5\uff0c\u8fd9\u6b63\u662f\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u7684\u542b\u4e49\u3002
    • \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7b80\u4fbf\u3002\u663e\u7136\uff0c\u8fd0\u884c\u5e73\u53f0\u548c\u8ba1\u7b97\u64cd\u4f5c\u7c7b\u578b\u90fd\u4e0e\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u65e0\u5173\u3002\u56e0\u6b64\u5728\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u5c06\u6240\u6709\u8ba1\u7b97\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u89c6\u4e3a\u76f8\u540c\u7684\u201c\u5355\u4f4d\u65f6\u95f4\u201d\uff0c\u4ece\u800c\u5c06\u201c\u8ba1\u7b97\u64cd\u4f5c\u8fd0\u884c\u65f6\u95f4\u7edf\u8ba1\u201d\u7b80\u5316\u4e3a\u201c\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u7edf\u8ba1\u201d\uff0c\u8fd9\u6837\u4e00\u6765\u4f30\u7b97\u96be\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u5c40\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5c3d\u7ba1\u7b97\u6cd5 A \u548c C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\uff0c\u4f46\u5b9e\u9645\u8fd0\u884c\u65f6\u95f4\u5dee\u522b\u5f88\u5927\u3002\u540c\u6837\uff0c\u5c3d\u7ba1\u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 B \u660e\u663e\u4f18\u4e8e\u7b97\u6cd5 C \u3002\u5bf9\u4e8e\u6b64\u7c7b\u60c5\u51b5\uff0c\u6211\u4eec\u65f6\u5e38\u96be\u4ee5\u4ec5\u51ed\u65f6\u95f4\u590d\u6742\u5ea6\u5224\u65ad\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u5f53\u7136\uff0c\u5c3d\u7ba1\u5b58\u5728\u4e0a\u8ff0\u95ee\u9898\uff0c\u590d\u6742\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8bc4\u5224\u7b97\u6cd5\u6548\u7387\u6700\u6709\u6548\u4e14\u5e38\u7528\u7684\u65b9\u6cd5\u3002
    "},{"location":"chapter_computational_complexity/time_complexity/#232","title":"2.3.2 \u00a0 \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u8f93\u5165\u5927\u5c0f\u4e3a \\(n\\) \u7684\u51fd\u6570\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u5faa\u73af n \u6b21\n    for i in range(n):  # +1\n        print(0)        # +1\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        cout << 0 << endl;    // +1\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        System.out.println(0);    // +1\n    }\n}\n
    void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        Console.WriteLine(0);   // +1\n    }\n}\n
    func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
    func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
    function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
    function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
    void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n    print(0); // +1\n  }\n}\n
    fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println!(\"{}\", 0); // +1\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        printf(\"%d\", 0);            // +1\n    }\n}\n
    fun algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println(0) // +1\n    }\n}\n
    def algorithm(n)\n    a = 1       # +1\n    a = a + 1   # +1\n    a = a * 2   # +1\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # +1\n        puts 0      # +1\n    end\nend\n
    fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

    \u8bbe\u7b97\u6cd5\u7684\u64cd\u4f5c\u6570\u91cf\u662f\u4e00\u4e2a\u5173\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u7684\u51fd\u6570\uff0c\u8bb0\u4e3a \\(T(n)\\) \uff0c\u5219\u4ee5\u4e0a\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e3a\uff1a

    \\[ T(n) = 3 + 2n \\]

    \\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u6570\uff0c\u8bf4\u660e\u5176\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u662f\u7ebf\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u7ebf\u6027\u9636\u3002

    \u6211\u4eec\u5c06\u7ebf\u6027\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u8bb0\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e2a\u6570\u5b66\u7b26\u53f7\u79f0\u4e3a\u5927 \\(O\\) \u8bb0\u53f7\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u6570 \\(T(n)\\) \u7684\u6e10\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

    \u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u672c\u8d28\u4e0a\u662f\u8ba1\u7b97\u201c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\)\u201d\u7684\u6e10\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u786e\u7684\u6570\u5b66\u5b9a\u4e49\u3002

    \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c

    \u82e5\u5b58\u5728\u6b63\u5b9e\u6570 \\(c\\) \u548c\u5b9e\u6570 \\(n_0\\) \uff0c\u4f7f\u5f97\u5bf9\u4e8e\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5219\u53ef\u8ba4\u4e3a \\(f(n)\\) \u7ed9\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u4e2a\u6e10\u8fd1\u4e0a\u754c\uff0c\u8bb0\u4e3a \\(T(n) = O(f(n))\\) \u3002

    \u5982\u56fe 2-8 \u6240\u793a\uff0c\u8ba1\u7b97\u6e10\u8fd1\u4e0a\u754c\u5c31\u662f\u5bfb\u627e\u4e00\u4e2a\u51fd\u6570 \\(f(n)\\) \uff0c\u4f7f\u5f97\u5f53 \\(n\\) \u8d8b\u5411\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u5904\u4e8e\u76f8\u540c\u7684\u589e\u957f\u7ea7\u522b\uff0c\u4ec5\u76f8\u5dee\u4e00\u4e2a\u5e38\u6570\u9879 \\(c\\) \u7684\u500d\u6570\u3002

    \u56fe 2-8 \u00a0 \u51fd\u6570\u7684\u6e10\u8fd1\u4e0a\u754c

    "},{"location":"chapter_computational_complexity/time_complexity/#233","title":"2.3.3 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

    \u6e10\u8fd1\u4e0a\u754c\u7684\u6570\u5b66\u5473\u513f\u6709\u70b9\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89c9\u6ca1\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u65e0\u987b\u62c5\u5fc3\u3002\u6211\u4eec\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65ad\u7684\u5b9e\u8df5\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6e10\u9886\u609f\u5176\u6570\u5b66\u610f\u4e49\u3002

    \u6839\u636e\u5b9a\u4e49\uff0c\u786e\u5b9a \\(f(n)\\) \u4e4b\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u4e48\u5982\u4f55\u786e\u5b9a\u6e10\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u603b\u4f53\u5206\u4e3a\u4e24\u6b65\uff1a\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf","text":"

    \u9488\u5bf9\u4ee3\u7801\uff0c\u9010\u884c\u4ece\u4e0a\u5230\u4e0b\u8ba1\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u4e8e\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6570\u9879 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u79cd\u7cfb\u6570\u3001\u5e38\u6570\u9879\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u636e\u6b64\u539f\u5219\uff0c\u53ef\u4ee5\u603b\u7ed3\u51fa\u4ee5\u4e0b\u8ba1\u6570\u7b80\u5316\u6280\u5de7\u3002

    1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6570\u9879\u3002\u56e0\u4e3a\u5b83\u4eec\u90fd\u4e0e \\(n\\) \u65e0\u5173\uff0c\u6240\u4ee5\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4ea7\u751f\u5f71\u54cd\u3002
    2. \u7701\u7565\u6240\u6709\u7cfb\u6570\u3002\u4f8b\u5982\uff0c\u5faa\u73af \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7b80\u5316\u8bb0\u4e3a \\(n\\) \u6b21\uff0c\u56e0\u4e3a \\(n\\) \u524d\u9762\u7684\u7cfb\u6570\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u6ca1\u6709\u5f71\u54cd\u3002
    3. \u5faa\u73af\u5d4c\u5957\u65f6\u4f7f\u7528\u4e58\u6cd5\u3002\u603b\u64cd\u4f5c\u6570\u91cf\u7b49\u4e8e\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u64cd\u4f5c\u6570\u91cf\u4e4b\u79ef\uff0c\u6bcf\u4e00\u5c42\u5faa\u73af\u4f9d\u7136\u53ef\u4ee5\u5206\u522b\u5957\u7528\u7b2c 1. \u70b9\u548c\u7b2c 2. \u70b9\u7684\u6280\u5de7\u3002

    \u7ed9\u5b9a\u4e00\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u6765\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 1      # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
    void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
    void Algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
    func algorithm(n int) {\n    a := 1     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
    func algorithm(n: Int) {\n    var a = 1 // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
    function algorithm(n) {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
    function algorithm(n: number): void {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
    void algorithm(int n) {\n  int a = 1; // +0\uff08\u6280\u5de7 1\uff09\n  a = a + n; // +0\uff08\u6280\u5de7 1\uff09\n  // +n\uff08\u6280\u5de7 2\uff09\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n\uff08\u6280\u5de7 3\uff09\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
    fn algorithm(n: i32) {\n    let mut a = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
    fun algorithm(n: Int) {\n    var a = 1   // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (i in 0..<5 * n + 1) {\n        println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (i in 0..<2 * n) {\n        for (j in 0..<n + 1) {\n            println(0)\n        }\n    }\n}\n
    def algorithm(n)\n    a = 1       # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    (0...(5 * n + 1)).each do { puts 0 }\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    (0...(2 * n)).each do\n        (0...(n + 1)).each do { puts 0 }\n    end\nend\n
    fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + @as(i32, @intCast(n));        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

    \u4ee5\u4e0b\u516c\u5f0f\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u540e\u7684\u7edf\u8ba1\u7ed3\u679c\uff0c\u4e24\u8005\u63a8\u7b97\u51fa\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002

    \\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{\u5b8c\u6574\u7edf\u8ba1 (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{\u5077\u61d2\u7edf\u8ba1 (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2. \u00a0 \u7b2c\u4e8c\u6b65\uff1a\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u9636\u7684\u9879\u6765\u51b3\u5b9a\u3002\u8fd9\u662f\u56e0\u4e3a\u5728 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u6700\u9ad8\u9636\u7684\u9879\u5c06\u53d1\u6325\u4e3b\u5bfc\u4f5c\u7528\uff0c\u5176\u4ed6\u9879\u7684\u5f71\u54cd\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

    \u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u5938\u5f20\u7684\u503c\u662f\u4e3a\u4e86\u5f3a\u8c03\u201c\u7cfb\u6570\u65e0\u6cd5\u64bc\u52a8\u9636\u6570\u201d\u8fd9\u4e00\u7ed3\u8bba\u3002\u5f53 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u8fd9\u4e9b\u5e38\u6570\u53d8\u5f97\u65e0\u8db3\u8f7b\u91cd\u3002

    \u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6570\u91cf\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234","title":"2.3.4 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

    \u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u5982\u56fe 2-9 \u6240\u793a\uff08\u6309\u7167\u4ece\u4f4e\u5230\u9ad8\u7684\u987a\u5e8f\u6392\u5217\uff09\u3002

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u7ebf\u6027\u5bf9\u6570\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} < \\text{\u9636\u4e58\u9636} \\end{aligned} \\]

    \u56fe 2-9 \u00a0 \u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

    "},{"location":"chapter_computational_complexity/time_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

    \u5e38\u6570\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u5373\u4e0d\u968f\u7740 \\(n\\) \u7684\u53d8\u5316\u800c\u53d8\u5316\u3002

    \u5728\u4ee5\u4e0b\u51fd\u6570\u4e2d\uff0c\u5c3d\u7ba1\u64cd\u4f5c\u6570\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u4e8e\u5176\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def constant(n: int) -> int:\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.java
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.cs
    /* \u5e38\u6570\u9636 */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.go
    /* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
    time_complexity.dart
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e38\u6570\u9636 */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e38\u6570\u9636 */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
    time_complexity.rb
    ### \u5e38\u6570\u9636 ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
    time_complexity.zig
    // \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_computational_complexity/time_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

    \u7ebf\u6027\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u7ebf\u6027\u7ea7\u522b\u589e\u957f\u3002\u7ebf\u6027\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5355\u5c42\u5faa\u73af\u4e2d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.java
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.cs
    /* \u7ebf\u6027\u9636 */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.go
    /* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.dart
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7ebf\u6027\u9636 */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7ebf\u6027\u9636 */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
    time_complexity.rb
    ### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
    time_complexity.zig
    // \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u904d\u5386\u6570\u7ec4\u548c\u904d\u5386\u94fe\u8868\u7b49\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u6216\u94fe\u8868\u7684\u957f\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u9700\u6839\u636e\u8f93\u5165\u6570\u636e\u7684\u7c7b\u578b\u6765\u5177\u4f53\u786e\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u4e2a\u793a\u4f8b\u4e2d\uff0c\u53d8\u91cf \\(n\\) \u4e3a\u8f93\u5165\u6570\u636e\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u4e3a\u6570\u636e\u5927\u5c0f\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

    \u5e73\u65b9\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7ea7\u522b\u589e\u957f\u3002\u5e73\u65b9\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u56e0\u6b64\u603b\u4f53\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5e73\u65b9\u9636 */\nint Quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e73\u65b9\u9636 */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-10 \u5bf9\u6bd4\u4e86\u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u4e09\u79cd\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    \u56fe 2-10 \u00a0 \u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u4ee5\u5192\u6ce1\u6392\u5e8f\u4e3a\u4f8b\uff0c\u5916\u5c42\u5faa\u73af\u6267\u884c \\(n - 1\\) \u6b21\uff0c\u5185\u5c42\u5faa\u73af\u6267\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u4e3a \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O((n - 1) n / 2) = O(n^2)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8ba1\u6570\u5668\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8ba1\u6570\u5668\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8ba1\u6570\u5668\n\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8ba1\u6570\u5668\n\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8ba1\u6570\u5668 \n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_computational_complexity/time_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

    \u751f\u7269\u5b66\u7684\u201c\u7ec6\u80de\u5206\u88c2\u201d\u662f\u6307\u6570\u9636\u589e\u957f\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72b6\u6001\u4e3a \\(1\\) \u4e2a\u7ec6\u80de\uff0c\u5206\u88c2\u4e00\u8f6e\u540e\u53d8\u4e3a \\(2\\) \u4e2a\uff0c\u5206\u88c2\u4e24\u8f6e\u540e\u53d8\u4e3a \\(4\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f6e\u540e\u6709 \\(2^n\\) \u4e2a\u7ec6\u80de\u3002

    \u56fe 2-11 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u7ec6\u80de\u5206\u88c2\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exponential(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
    time_complexity.cpp
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.java
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.cs
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.go
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.swift
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.js
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.ts
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.dart
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
    time_complexity.rs
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
    time_complexity.c
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.kt
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.rb
    ### \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
    time_complexity.zig
    // \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-11 \u00a0 \u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u5728\u5b9e\u9645\u7b97\u6cd5\u4e2d\uff0c\u6307\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u5176\u9012\u5f52\u5730\u4e00\u5206\u4e3a\u4e8c\uff0c\u7ecf\u8fc7 \\(n\\) \u6b21\u5206\u88c2\u540e\u505c\u6b62\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
    time_complexity.cpp
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.java
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.cs
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
    time_complexity.go
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
    time_complexity.swift
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
    time_complexity.js
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.ts
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.dart
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.rs
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
    time_complexity.c
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.kt
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
    time_complexity.rb
    ### \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
    time_complexity.zig
    // \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6307\u6570\u9636\u589e\u957f\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7a77\u4e3e\u6cd5\uff08\u66b4\u529b\u641c\u7d22\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f83\u5e38\u89c1\u3002\u5bf9\u4e8e\u6570\u636e\u89c4\u6a21\u8f83\u5927\u7684\u95ee\u9898\uff0c\u6307\u6570\u9636\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u6216\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u6765\u89e3\u51b3\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

    \u4e0e\u6307\u6570\u9636\u76f8\u53cd\uff0c\u5bf9\u6570\u9636\u53cd\u6620\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u60c5\u51b5\u3002\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7531\u4e8e\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u6570\u3002

    \u56fe 2-12 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_2 n)\\) \uff0c\u7b80\u8bb0\u4e3a \\(O(\\log n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def logarithmic(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-12 \u00a0 \u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u4e0e\u6307\u6570\u9636\u7c7b\u4f3c\uff0c\u5bf9\u6570\u9636\u4e5f\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4ee5\u4e0b\u4ee3\u7801\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(\\log_2 n\\) \u7684\u9012\u5f52\u6811\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def log_recur(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
    time_complexity.cpp
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.java
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.cs
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
    time_complexity.go
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
    time_complexity.swift
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
    time_complexity.js
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.ts
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.dart
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
    time_complexity.rs
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
    time_complexity.c
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.kt
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
    time_complexity.rb
    ### \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
    time_complexity.zig
    // \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u7b97\u6cd5\u4e2d\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u591a\u201d\u548c\u201c\u5316\u7e41\u4e3a\u7b80\u201d\u7684\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u957f\u7f13\u6162\uff0c\u662f\u4ec5\u6b21\u4e8e\u5e38\u6570\u9636\u7684\u7406\u60f3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    \\(O(\\log n)\\) \u7684\u5e95\u6570\u662f\u591a\u5c11\uff1f

    \u51c6\u786e\u6765\u8bf4\uff0c\u201c\u4e00\u5206\u4e3a \\(m\\)\u201d\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u901a\u8fc7\u5bf9\u6570\u6362\u5e95\u516c\u5f0f\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6570\u3001\u76f8\u7b49\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a

    \\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5e95\u6570 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u54cd\u590d\u6742\u5ea6\u7684\u524d\u63d0\u4e0b\u8f6c\u6362\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u7701\u7565\u5e95\u6570 \\(m\\) \uff0c\u5c06\u5bf9\u6570\u9636\u76f4\u63a5\u8bb0\u4e3a \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636 \\(O(n \\log n)\\)","text":"

    \u7ebf\u6027\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u4e24\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u522b\u4e3a \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear_log_recur(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\n    if n <= 1:\n        return 1\n    # \u4e00\u5206\u4e3a\u4e8c\uff0c\u5b50\u95ee\u9898\u7684\u89c4\u6a21\u51cf\u5c0f\u4e00\u534a\n    count = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    # \u5f53\u524d\u5b50\u95ee\u9898\u5305\u542b n \u4e2a\u64cd\u4f5c\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
    time_complexity.c
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u7ebf\u6027\u5bf9\u6570\u9636 ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
    time_complexity.zig
    // \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-13 \u5c55\u793a\u4e86\u7ebf\u6027\u5bf9\u6570\u9636\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u53c9\u6811\u7684\u6bcf\u4e00\u5c42\u7684\u64cd\u4f5c\u603b\u6570\u90fd\u4e3a \\(n\\) \uff0c\u6811\u5171\u6709 \\(\\log_2 n + 1\\) \u5c42\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    \u56fe 2-13 \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u7b49\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#7-on","title":"7. \u00a0 \u9636\u4e58\u9636 \\(O(n!)\\)","text":"

    \u9636\u4e58\u9636\u5bf9\u5e94\u6570\u5b66\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u95ee\u9898\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u4e92\u4e0d\u91cd\u590d\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6570\u91cf\u4e3a\uff1a

    \\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

    \u9636\u4e58\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u5b9e\u73b0\u3002\u5982\u56fe 2-14 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u7b2c\u4e00\u5c42\u5206\u88c2\u51fa \\(n\\) \u4e2a\uff0c\u7b2c\u4e8c\u5c42\u5206\u88c2\u51fa \\(n - 1\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c42\u65f6\u505c\u6b62\u5206\u88c2\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def factorial_recur(n: int) -> int:\n    \"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
    time_complexity.cpp
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
    time_complexity.js
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
    time_complexity.c
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
    time_complexity.zig
    // \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-14 \u00a0 \u9636\u4e58\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u5f53 \\(n \\geq 4\\) \u65f6\u6052\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u9636\u4e58\u9636\u6bd4\u6307\u6570\u9636\u589e\u957f\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f83\u5927\u65f6\u4e5f\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#235","title":"2.3.5 \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6","text":"

    \u7b97\u6cd5\u7684\u65f6\u95f4\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u5047\u8bbe\u8f93\u5165\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d nums \u7531\u4ece \\(1\\) \u81f3 \\(n\\) \u7684\u6570\u5b57\u7ec4\u6210\uff0c\u6bcf\u4e2a\u6570\u5b57\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u987a\u5e8f\u662f\u968f\u673a\u6253\u4e71\u7684\uff0c\u4efb\u52a1\u76ee\u6807\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

    • \u5f53 nums = [?, ?, ..., 1] \uff0c\u5373\u5f53\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u65f6\uff0c\u9700\u8981\u5b8c\u6574\u904d\u5386\u6570\u7ec4\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
    • \u5f53 nums = [1, ?, ?, ...] \uff0c\u5373\u5f53\u9996\u4e2a\u5143\u7d20\u4e3a \\(1\\) \u65f6\uff0c\u65e0\u8bba\u6570\u7ec4\u591a\u957f\u90fd\u4e0d\u9700\u8981\u7ee7\u7eed\u904d\u5386\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(\\Omega(1)\\) \u3002

    \u201c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8bb0\u53f7\u8868\u793a\u3002\u76f8\u5e94\u5730\uff0c\u201c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8bb0\u53f7\u8868\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
    def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71\"\"\"\n    # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
    worst_best_time_complexity.cpp
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.java
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.cs
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.go
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
    worst_best_time_complexity.swift
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
    worst_best_time_complexity.js
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    worst_best_time_complexity.ts
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    worst_best_time_complexity.dart
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
    worst_best_time_complexity.rs
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
    worst_best_time_complexity.c
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u533a\u5185\u5b58\uff08\u521b\u5efa\u4e00\u7ef4\u53ef\u53d8\u957f\u6570\u7ec4\uff1a\u6570\u7ec4\u4e2d\u5143\u7d20\u6570\u91cf\u4e3a n \uff0c\u5143\u7d20\u7c7b\u578b\u4e3a int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.kt
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
    worst_best_time_complexity.rb
    ### \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71 ###\ndef random_numbers(n)\n  # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
    worst_best_time_complexity.zig
    // \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6211\u4eec\u5728\u5b9e\u9645\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u56e0\u4e3a\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6982\u7387\u4e0b\u624d\u80fd\u8fbe\u5230\uff0c\u53ef\u80fd\u4f1a\u5e26\u6765\u4e00\u5b9a\u7684\u8bef\u5bfc\u6027\u3002\u800c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u4e3a\u5b9e\u7528\uff0c\u56e0\u4e3a\u5b83\u7ed9\u51fa\u4e86\u4e00\u4e2a\u6548\u7387\u5b89\u5168\u503c\uff0c\u8ba9\u6211\u4eec\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u7b97\u6cd5\u3002

    \u4ece\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ea\u51fa\u73b0\u4e8e\u201c\u7279\u6b8a\u7684\u6570\u636e\u5206\u5e03\u201d\uff0c\u8fd9\u4e9b\u60c5\u51b5\u7684\u51fa\u73b0\u6982\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u5e76\u4e0d\u80fd\u771f\u5b9e\u5730\u53cd\u6620\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f53\u73b0\u7b97\u6cd5\u5728\u968f\u673a\u8f93\u5165\u6570\u636e\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8bb0\u53f7\u6765\u8868\u793a\u3002

    \u5bf9\u4e8e\u90e8\u5206\u7b97\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u63a8\u7b97\u51fa\u968f\u673a\u6570\u636e\u5206\u5e03\u4e0b\u7684\u5e73\u5747\u60c5\u51b5\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u4e8e\u8f93\u5165\u6570\u7ec4\u662f\u88ab\u6253\u4e71\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73b0\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6982\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u4e48\u7b97\u6cd5\u7684\u5e73\u5747\u5faa\u73af\u6b21\u6570\u5c31\u662f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

    \u4f46\u5bf9\u4e8e\u8f83\u4e3a\u590d\u6742\u7684\u7b97\u6cd5\uff0c\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5f80\u5f80\u6bd4\u8f83\u56f0\u96be\uff0c\u56e0\u4e3a\u5f88\u96be\u5206\u6790\u51fa\u5728\u6570\u636e\u5206\u5e03\u4e0b\u7684\u6574\u4f53\u6570\u5b66\u671f\u671b\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f5c\u4e3a\u7b97\u6cd5\u6548\u7387\u7684\u8bc4\u5224\u6807\u51c6\u3002

    \u4e3a\u4ec0\u4e48\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u53f7\uff1f

    \u53ef\u80fd\u7531\u4e8e \\(O\\) \u7b26\u53f7\u8fc7\u4e8e\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u4eec\u5e38\u5e38\u4f7f\u7528\u5b83\u6765\u8868\u793a\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u4f46\u4ece\u4e25\u683c\u610f\u4e49\u4e0a\u8bb2\uff0c\u8fd9\u79cd\u505a\u6cd5\u5e76\u4e0d\u89c4\u8303\u3002\u5728\u672c\u4e66\u548c\u5176\u4ed6\u8d44\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u7c7b\u4f3c\u201c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8bf7\u5c06\u5176\u76f4\u63a5\u7406\u89e3\u4e3a \\(\\Theta(n)\\) \u3002

    "},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u6570\u636e\u7ed3\u6784","text":"

    Abstract

    \u6570\u636e\u7ed3\u6784\u5982\u540c\u4e00\u526f\u7a33\u56fa\u800c\u591a\u6837\u7684\u6846\u67b6\u3002

    \u5b83\u4e3a\u6570\u636e\u7684\u6709\u5e8f\u7ec4\u7ec7\u63d0\u4f9b\u4e86\u84dd\u56fe\uff0c\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u7840\u4e0a\u751f\u52a8\u8d77\u6765\u3002

    "},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b
    • 3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b
    • 3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *
    • 3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *
    • 3.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b","text":"

    \u5f53\u8c08\u53ca\u8ba1\u7b97\u673a\u4e2d\u7684\u6570\u636e\u65f6\uff0c\u6211\u4eec\u4f1a\u60f3\u5230\u6587\u672c\u3001\u56fe\u7247\u3001\u89c6\u9891\u3001\u8bed\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u79cd\u5f62\u5f0f\u3002\u5c3d\u7ba1\u8fd9\u4e9b\u6570\u636e\u7684\u7ec4\u7ec7\u5f62\u5f0f\u5404\u5f02\uff0c\u4f46\u5b83\u4eec\u90fd\u7531\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6784\u6210\u3002

    \u57fa\u672c\u6570\u636e\u7c7b\u578b\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u8fdb\u884c\u8fd0\u7b97\u7684\u7c7b\u578b\uff0c\u5728\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

    • \u6574\u6570\u7c7b\u578b byte\u3001short\u3001int\u3001long \u3002
    • \u6d6e\u70b9\u6570\u7c7b\u578b float\u3001double \uff0c\u7528\u4e8e\u8868\u793a\u5c0f\u6570\u3002
    • \u5b57\u7b26\u7c7b\u578b char \uff0c\u7528\u4e8e\u8868\u793a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u6bcd\u3001\u6807\u70b9\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002
    • \u5e03\u5c14\u7c7b\u578b bool \uff0c\u7528\u4e8e\u8868\u793a\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\u5224\u65ad\u3002

    \u57fa\u672c\u6570\u636e\u7c7b\u578b\u4ee5\u4e8c\u8fdb\u5236\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u3002\u4e00\u4e2a\u4e8c\u8fdb\u5236\u4f4d\u5373\u4e3a \\(1\\) \u6bd4\u7279\u3002\u5728\u7edd\u5927\u591a\u6570\u73b0\u4ee3\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\\(1\\) \u5b57\u8282\uff08byte\uff09\u7531 \\(8\\) \u6bd4\u7279\uff08bit\uff09\u7ec4\u6210\u3002

    \u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5176\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u4e3a\u4f8b\u3002

    • \u6574\u6570\u7c7b\u578b byte \u5360\u7528 \\(1\\) \u5b57\u8282 = \\(8\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u4e2a\u6570\u5b57\u3002
    • \u6574\u6570\u7c7b\u578b int \u5360\u7528 \\(4\\) \u5b57\u8282 = \\(32\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u6570\u5b57\u3002

    \u8868 3-1 \u5217\u4e3e\u4e86 Java \u4e2d\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u3002\u6b64\u8868\u683c\u65e0\u987b\u6b7b\u8bb0\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

    \u8868 3-1 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u548c\u53d6\u503c\u8303\u56f4

    \u7c7b\u578b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 \u5b57\u8282 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u5b57\u8282 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u5b57\u8282 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u5b57\u8282 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u70b9\u6570 float 4 \u5b57\u8282 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u5b57\u8282 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 \u5b57\u8282 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 \u5b57\u8282 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    \u8bf7\u6ce8\u610f\uff0c\u8868 3-1 \u9488\u5bf9\u7684\u662f Java \u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u60c5\u51b5\u3002\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u6709\u5404\u81ea\u7684\u6570\u636e\u7c7b\u578b\u5b9a\u4e49\uff0c\u5b83\u4eec\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002

    • \u5728 Python \u4e2d\uff0c\u6574\u6570\u7c7b\u578b int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\uff1b\u6d6e\u70b9\u6570 float \u662f\u53cc\u7cbe\u5ea6 64 \u4f4d\uff1b\u6ca1\u6709 char \u7c7b\u578b\uff0c\u5355\u4e2a\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32 str \u3002
    • C \u548c C++ \u672a\u660e\u786e\u89c4\u5b9a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5b9e\u73b0\u548c\u5e73\u53f0\u5404\u5f02\u3002\u8868 3-1 \u9075\u5faa LP64 \u6570\u636e\u6a21\u578b\uff0c\u5176\u7528\u4e8e\u5305\u62ec Linux \u548c macOS \u5728\u5185\u7684 Unix 64 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u3002
    • \u5b57\u7b26 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u4e3a 1 \u5b57\u8282\uff0c\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\u53d6\u51b3\u4e8e\u7279\u5b9a\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\uff0c\u8be6\u89c1\u201c\u5b57\u7b26\u7f16\u7801\u201d\u7ae0\u8282\u3002
    • \u5373\u4f7f\u8868\u793a\u5e03\u5c14\u91cf\u4ec5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u5185\u5b58\u4e2d\u901a\u5e38\u4e5f\u5b58\u50a8\u4e3a 1 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a\u73b0\u4ee3\u8ba1\u7b97\u673a CPU \u901a\u5e38\u5c06 1 \u5b57\u8282\u4f5c\u4e3a\u6700\u5c0f\u5bfb\u5740\u5185\u5b58\u5355\u5143\u3002

    \u90a3\u4e48\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u95f4\u6709\u4ec0\u4e48\u8054\u7cfb\u5462\uff1f\u6211\u4eec\u77e5\u9053\uff0c\u6570\u636e\u7ed3\u6784\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u4e0e\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u8fd9\u53e5\u8bdd\u7684\u4e3b\u8bed\u662f\u201c\u7ed3\u6784\u201d\u800c\u975e\u201c\u6570\u636e\u201d\u3002

    \u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6570\u5b57\u201d\uff0c\u6211\u4eec\u81ea\u7136\u4f1a\u60f3\u5230\u4f7f\u7528\u6570\u7ec4\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u7684\u7ebf\u6027\u7ed3\u6784\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u548c\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5b58\u50a8\u7684\u5185\u5bb9\u662f\u6574\u6570 int\u3001\u5c0f\u6570 float \u8fd8\u662f\u5b57\u7b26 char \uff0c\u5219\u4e0e\u201c\u6570\u636e\u7ed3\u6784\u201d\u65e0\u5173\u3002

    \u6362\u53e5\u8bdd\u8bf4\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u5185\u5bb9\u7c7b\u578b\u201d\uff0c\u800c\u6570\u636e\u7ed3\u6784\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u7ec4\u7ec7\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u7528\u76f8\u540c\u7684\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\uff09\u6765\u5b58\u50a8\u4e0e\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
    // JavaScript \u7684\u6570\u7ec4\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\nconst array = [0, 0.0, 'a', false];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0; 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
    # Ruby \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *","text":"

    \u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6240\u6709\u6570\u636e\u90fd\u662f\u4ee5\u4e8c\u8fdb\u5236\u6570\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\uff0c\u5b57\u7b26 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u4e3a\u4e86\u8868\u793a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u89c4\u5b9a\u6bcf\u4e2a\u5b57\u7b26\u548c\u4e8c\u8fdb\u5236\u6570\u4e4b\u95f4\u7684\u4e00\u4e00\u5bf9\u5e94\u5173\u7cfb\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u540e\uff0c\u8ba1\u7b97\u673a\u5c31\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u5b8c\u6210\u4e8c\u8fdb\u5236\u6570\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002

    "},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1 \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

    ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u79f0\u4e3a American Standard Code for Information Interchange\uff08\u7f8e\u56fd\u6807\u51c6\u4fe1\u606f\u4ea4\u6362\u4ee3\u7801\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u8fdb\u5236\u6570\uff08\u4e00\u4e2a\u5b57\u8282\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6700\u591a\u80fd\u591f\u8868\u793a 128 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u5982\u56fe 3-6 \u6240\u793a\uff0cASCII \u7801\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5199\u3001\u6570\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6807\u70b9\u7b26\u53f7\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u7b26\uff08\u5982\u6362\u884c\u7b26\u548c\u5236\u8868\u7b26\uff09\u3002

    \u56fe 3-6 \u00a0 ASCII \u7801

    \u7136\u800c\uff0cASCII \u7801\u4ec5\u80fd\u591f\u8868\u793a\u82f1\u6587\u3002\u968f\u7740\u8ba1\u7b97\u673a\u7684\u5168\u7403\u5316\uff0c\u8bde\u751f\u4e86\u4e00\u79cd\u80fd\u591f\u8868\u793a\u66f4\u591a\u8bed\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u7840\u4e0a\u6269\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u591f\u8868\u793a 256 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002

    \u5728\u4e16\u754c\u8303\u56f4\u5185\uff0c\u9646\u7eed\u51fa\u73b0\u4e86\u4e00\u6279\u9002\u7528\u4e8e\u4e0d\u540c\u5730\u533a\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u8fd9\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u4e2a\u5b57\u7b26\u7edf\u4e00\u4e3a ASCII \u7801\uff0c\u540e 128 \u4e2a\u5b57\u7b26\u5b9a\u4e49\u4e0d\u540c\uff0c\u4ee5\u9002\u5e94\u4e0d\u540c\u8bed\u8a00\u7684\u9700\u6c42\u3002

    "},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2 \u00a0 GBK \u5b57\u7b26\u96c6","text":"

    \u540e\u6765\u4eba\u4eec\u53d1\u73b0\uff0cEASCII \u7801\u4ecd\u7136\u65e0\u6cd5\u6ee1\u8db3\u8bb8\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u6570\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6c49\u5b57\u6709\u8fd1\u5341\u4e07\u4e2a\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u51e0\u5343\u4e2a\u3002\u4e2d\u56fd\u56fd\u5bb6\u6807\u51c6\u603b\u5c40\u4e8e 1980 \u5e74\u53d1\u5e03\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u5f55\u4e86 6763 \u4e2a\u6c49\u5b57\uff0c\u57fa\u672c\u6ee1\u8db3\u4e86\u6c49\u5b57\u7684\u8ba1\u7b97\u673a\u5904\u7406\u9700\u8981\u3002

    \u7136\u800c\uff0cGB2312 \u65e0\u6cd5\u5904\u7406\u90e8\u5206\u7f55\u89c1\u5b57\u548c\u7e41\u4f53\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u7840\u4e0a\u6269\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u5f55\u4e86 21886 \u4e2a\u6c49\u5b57\u3002\u5728 GBK \u7684\u7f16\u7801\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u7b26\u4f7f\u7528\u4e00\u4e2a\u5b57\u8282\u8868\u793a\uff0c\u6c49\u5b57\u4f7f\u7528\u4e24\u4e2a\u5b57\u8282\u8868\u793a\u3002

    "},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3 \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

    \u968f\u7740\u8ba1\u7b97\u673a\u6280\u672f\u7684\u84ec\u52c3\u53d1\u5c55\uff0c\u5b57\u7b26\u96c6\u4e0e\u7f16\u7801\u6807\u51c6\u767e\u82b1\u9f50\u653e\uff0c\u800c\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u95ee\u9898\u3002\u4e00\u65b9\u9762\uff0c\u8fd9\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u4e49\u4e86\u7279\u5b9a\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u65e0\u6cd5\u5728\u591a\u8bed\u8a00\u73af\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u79cd\u8bed\u8a00\u5b58\u5728\u591a\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u5982\u679c\u4e24\u53f0\u8ba1\u7b97\u673a\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7f16\u7801\u6807\u51c6\uff0c\u5219\u5728\u4fe1\u606f\u4f20\u9012\u65f6\u5c31\u4f1a\u51fa\u73b0\u4e71\u7801\u3002

    \u90a3\u4e2a\u65f6\u4ee3\u7684\u7814\u7a76\u4eba\u5458\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u4e2a\u8db3\u591f\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c06\u4e16\u754c\u8303\u56f4\u5185\u7684\u6240\u6709\u8bed\u8a00\u548c\u7b26\u53f7\u90fd\u6536\u5f55\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u51b3\u8de8\u8bed\u8a00\u73af\u5883\u548c\u4e71\u7801\u95ee\u9898\u4e86\u5417\uff1f\u5728\u8fd9\u79cd\u60f3\u6cd5\u7684\u9a71\u52a8\u4e0b\uff0c\u4e00\u4e2a\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u5e94\u8fd0\u800c\u751f\u3002

    Unicode \u7684\u4e2d\u6587\u540d\u79f0\u4e3a\u201c\u7edf\u4e00\u7801\u201d\uff0c\u7406\u8bba\u4e0a\u80fd\u5bb9\u7eb3 100 \u591a\u4e07\u4e2a\u5b57\u7b26\u3002\u5b83\u81f4\u529b\u4e8e\u5c06\u5168\u7403\u8303\u56f4\u5185\u7684\u5b57\u7b26\u7eb3\u5165\u7edf\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u79cd\u901a\u7528\u7684\u5b57\u7b26\u96c6\u6765\u5904\u7406\u548c\u663e\u793a\u5404\u79cd\u8bed\u8a00\u6587\u5b57\uff0c\u51cf\u5c11\u56e0\u4e3a\u7f16\u7801\u6807\u51c6\u4e0d\u540c\u800c\u4ea7\u751f\u7684\u4e71\u7801\u95ee\u9898\u3002

    \u81ea 1991 \u5e74\u53d1\u5e03\u4ee5\u6765\uff0cUnicode \u4e0d\u65ad\u6269\u5145\u65b0\u7684\u8bed\u8a00\u4e0e\u5b57\u7b26\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7ecf\u5305\u542b 149186 \u4e2a\u5b57\u7b26\uff0c\u5305\u62ec\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\u3001\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002\u5728\u5e9e\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u7b26\u5360\u7528 3 \u5b57\u8282\u751a\u81f3 4 \u5b57\u8282\u3002

    Unicode \u662f\u4e00\u79cd\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8d28\u4e0a\u662f\u7ed9\u6bcf\u4e2a\u5b57\u7b26\u5206\u914d\u4e00\u4e2a\u7f16\u53f7\uff08\u79f0\u4e3a\u201c\u7801\u70b9\u201d\uff09\uff0c\u4f46\u5b83\u5e76\u6ca1\u6709\u89c4\u5b9a\u5728\u8ba1\u7b97\u673a\u4e2d\u5982\u4f55\u5b58\u50a8\u8fd9\u4e9b\u5b57\u7b26\u7801\u70b9\u3002\u6211\u4eec\u4e0d\u7981\u4f1a\u95ee\uff1a\u5f53\u591a\u79cd\u957f\u5ea6\u7684 Unicode \u7801\u70b9\u540c\u65f6\u51fa\u73b0\u5728\u4e00\u4e2a\u6587\u672c\u4e2d\u65f6\uff0c\u7cfb\u7edf\u5982\u4f55\u89e3\u6790\u5b57\u7b26\uff1f\u4f8b\u5982\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u7684\u7f16\u7801\uff0c\u7cfb\u7edf\u5982\u4f55\u786e\u8ba4\u5b83\u662f\u4e00\u4e2a 2 \u5b57\u8282\u7684\u5b57\u7b26\u8fd8\u662f\u4e24\u4e2a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff1f

    \u5bf9\u4e8e\u4ee5\u4e0a\u95ee\u9898\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u6240\u6709\u5b57\u7b26\u5b58\u50a8\u4e3a\u7b49\u957f\u7684\u7f16\u7801\u3002\u5982\u56fe 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff0c\u201c\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9ad8\u4f4d\u586b 0 \u5c06\u201cHello \u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u7b26\u90fd\u7f16\u7801\u4e3a 2 \u5b57\u8282\u957f\u5ea6\u3002\u8fd9\u6837\u7cfb\u7edf\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u5b57\u8282\u89e3\u6790\u4e00\u4e2a\u5b57\u7b26\uff0c\u6062\u590d\u8fd9\u4e2a\u77ed\u8bed\u7684\u5185\u5bb9\u4e86\u3002

    \u56fe 3-7 \u00a0 Unicode \u7f16\u7801\u793a\u4f8b

    \u7136\u800c ASCII \u7801\u5df2\u7ecf\u5411\u6211\u4eec\u8bc1\u660e\uff0c\u7f16\u7801\u82f1\u6587\u53ea\u9700 1 \u5b57\u8282\u3002\u82e5\u91c7\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u672c\u5360\u7528\u7a7a\u95f4\u7684\u5927\u5c0f\u5c06\u4f1a\u662f ASCII \u7f16\u7801\u4e0b\u7684\u4e24\u500d\uff0c\u975e\u5e38\u6d6a\u8d39\u5185\u5b58\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002

    "},{"location":"chapter_data_structure/character_encoding/#344-utf-8","title":"3.4.4 \u00a0 UTF-8 \u7f16\u7801","text":"

    \u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u4e3a\u56fd\u9645\u4e0a\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u79cd\u53ef\u53d8\u957f\u5ea6\u7684\u7f16\u7801\uff0c\u4f7f\u7528 1 \u5230 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6839\u636e\u5b57\u7b26\u7684\u590d\u6742\u6027\u800c\u53d8\u3002ASCII \u5b57\u7b26\u53ea\u9700 1 \u5b57\u8282\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u814a\u5b57\u6bcd\u9700\u8981 2 \u5b57\u8282\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u9700\u8981 3 \u5b57\u8282\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u7b26\u9700\u8981 4 \u5b57\u8282\u3002

    UTF-8 \u7684\u7f16\u7801\u89c4\u5219\u5e76\u4e0d\u590d\u6742\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff0c\u5c06\u6700\u9ad8\u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff0c\u5176\u4f59 7 \u4f4d\u8bbe\u7f6e\u4e3a Unicode \u7801\u70b9\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u7b26\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u5360\u636e\u4e86\u524d 128 \u4e2a\u7801\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cUTF-8 \u7f16\u7801\u53ef\u4ee5\u5411\u4e0b\u517c\u5bb9 ASCII \u7801\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u6765\u89e3\u6790\u5e74\u4ee3\u4e45\u8fdc\u7684 ASCII \u7801\u6587\u672c\u3002
    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a \\(n\\) \u5b57\u8282\u7684\u5b57\u7b26\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c06\u9996\u4e2a\u5b57\u8282\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff1b\u4ece\u7b2c\u4e8c\u4e2a\u5b57\u8282\u5f00\u59cb\uff0c\u5c06\u6bcf\u4e2a\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \uff1b\u5176\u4f59\u6240\u6709\u4f4d\u7528\u4e8e\u586b\u5145\u5b57\u7b26\u7684 Unicode \u7801\u70b9\u3002

    \u56fe 3-8 \u5c55\u793a\u4e86\u201cHello\u7b97\u6cd5\u201d\u5bf9\u5e94\u7684 UTF-8 \u7f16\u7801\u3002\u89c2\u5bdf\u53d1\u73b0\uff0c\u7531\u4e8e\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7edf\u53ef\u4ee5\u901a\u8fc7\u8bfb\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u4e2a\u6570\u6765\u89e3\u6790\u51fa\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(n\\) \u3002

    \u4f46\u4e3a\u4ec0\u4e48\u8981\u5c06\u5176\u4f59\u6240\u6709\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a \\(10\\) \u80fd\u591f\u8d77\u5230\u6821\u9a8c\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8bbe\u7cfb\u7edf\u4ece\u4e00\u4e2a\u9519\u8bef\u7684\u5b57\u8282\u5f00\u59cb\u89e3\u6790\u6587\u672c\uff0c\u5b57\u8282\u5934\u90e8\u7684 \\(10\\) \u80fd\u591f\u5e2e\u52a9\u7cfb\u7edf\u5feb\u901f\u5224\u65ad\u51fa\u5f02\u5e38\u3002

    \u4e4b\u6240\u4ee5\u5c06 \\(10\\) \u5f53\u4f5c\u6821\u9a8c\u7b26\uff0c\u662f\u56e0\u4e3a\u5728 UTF-8 \u7f16\u7801\u89c4\u5219\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \u3002\u8fd9\u4e2a\u7ed3\u8bba\u53ef\u4ee5\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\uff1a\u5047\u8bbe\u4e00\u4e2a\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \uff0c\u8bf4\u660e\u8be5\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(1\\) \uff0c\u5bf9\u5e94 ASCII \u7801\u3002\u800c ASCII \u7801\u7684\u6700\u9ad8\u4f4d\u5e94\u8be5\u662f \\(0\\) \uff0c\u4e0e\u5047\u8bbe\u77db\u76fe\u3002

    \u56fe 3-8 \u00a0 UTF-8 \u7f16\u7801\u793a\u4f8b

    \u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u89c1\u7684\u7f16\u7801\u65b9\u5f0f\u8fd8\u5305\u62ec\u4ee5\u4e0b\u4e24\u79cd\u3002

    • UTF-16 \u7f16\u7801\uff1a\u4f7f\u7528 2 \u6216 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\u3002\u6240\u6709\u7684 ASCII \u5b57\u7b26\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u7b26\uff0c\u90fd\u7528 2 \u5b57\u8282\u8868\u793a\uff1b\u5c11\u6570\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u5b57\u8282\u8868\u793a\u3002\u5bf9\u4e8e 2 \u5b57\u8282\u7684\u5b57\u7b26\uff0cUTF-16 \u7f16\u7801\u4e0e Unicode \u7801\u70b9\u76f8\u7b49\u3002
    • UTF-32 \u7f16\u7801\uff1a\u6bcf\u4e2a\u5b57\u7b26\u90fd\u4f7f\u7528 4 \u5b57\u8282\u3002\u8fd9\u610f\u5473\u7740 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u5360\u7528\u7a7a\u95f4\uff0c\u7279\u522b\u662f\u5bf9\u4e8e ASCII \u5b57\u7b26\u5360\u6bd4\u8f83\u9ad8\u7684\u6587\u672c\u3002

    \u4ece\u5b58\u50a8\u7a7a\u95f4\u5360\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u7b26\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 1 \u5b57\u8282\uff1b\u4f7f\u7528 UTF-16 \u7f16\u7801\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u7b26\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u4f1a\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 2 \u5b57\u8282\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u5b57\u8282\u3002

    \u4ece\u517c\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8bb8\u591a\u5de5\u5177\u548c\u5e93\u4f18\u5148\u652f\u6301 UTF-8 \u3002

    "},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801","text":"

    \u5bf9\u4e8e\u4ee5\u5f80\u7684\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff0c\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u7684\u5b57\u7b26\u4e32\u90fd\u91c7\u7528 UTF-16 \u6216 UTF-32 \u8fd9\u7c7b\u7b49\u957f\u7f16\u7801\u3002\u5728\u7b49\u957f\u7f16\u7801\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u7b26\u4e32\u770b\u4f5c\u6570\u7ec4\u6765\u5904\u7406\uff0c\u8fd9\u79cd\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

    • \u968f\u673a\u8bbf\u95ee\uff1aUTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u8fdb\u884c\u968f\u673a\u8bbf\u95ee\u3002UTF-8 \u662f\u4e00\u79cd\u53d8\u957f\u7f16\u7801\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u4ece\u5b57\u7b26\u4e32\u7684\u5f00\u59cb\u5904\u904d\u5386\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u8fd9\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u3002
    • \u5b57\u7b26\u8ba1\u6570\uff1a\u4e0e\u968f\u673a\u8bbf\u95ee\u7c7b\u4f3c\uff0c\u8ba1\u7b97 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8ba1\u7b97 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u9700\u8981\u904d\u5386\u6574\u4e2a\u5b57\u7b26\u4e32\u3002
    • \u5b57\u7b26\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u7b26\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u8fde\u63a5\u3001\u63d2\u5165\u3001\u5220\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u8fdb\u884c\u3002\u5728 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u8fdb\u884c\u8fd9\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u989d\u5916\u7684\u8ba1\u7b97\uff0c\u4ee5\u786e\u4fdd\u4e0d\u4f1a\u4ea7\u751f\u65e0\u6548\u7684 UTF-8 \u7f16\u7801\u3002

    \u5b9e\u9645\u4e0a\uff0c\u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6848\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5f88\u6709\u8da3\u7684\u8bdd\u9898\uff0c\u6d89\u53ca\u8bb8\u591a\u56e0\u7d20\u3002

    • Java \u7684 String \u7c7b\u578b\u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a Java \u8bed\u8a00\u8bbe\u8ba1\u4e4b\u521d\uff0c\u4eba\u4eec\u8ba4\u4e3a 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u7b26\u3002\u7136\u800c\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u6b63\u786e\u7684\u5224\u65ad\u3002\u540e\u6765 Unicode \u89c4\u8303\u6269\u5c55\u5230\u4e86\u8d85\u8fc7 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u7b26\u73b0\u5728\u53ef\u80fd\u7531\u4e00\u5bf9 16 \u4f4d\u7684\u503c\uff08\u79f0\u4e3a\u201c\u4ee3\u7406\u5bf9\u201d\uff09\u8868\u793a\u3002
    • JavaScript \u548c TypeScript \u7684\u5b57\u7b26\u4e32\u4f7f\u7528 UTF-16 \u7f16\u7801\u7684\u539f\u56e0\u4e0e Java \u7c7b\u4f3c\u3002\u5f53 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8bed\u8a00\u65f6\uff0cUnicode \u8fd8\u5904\u4e8e\u53d1\u5c55\u65e9\u671f\uff0c\u90a3\u65f6\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7f16\u7801\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u7b26\u4e86\u3002
    • C# \u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u4e3b\u8981\u662f\u56e0\u4e3a .NET \u5e73\u53f0\u662f\u7531 Microsoft \u8bbe\u8ba1\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u672f\uff08\u5305\u62ec Windows \u64cd\u4f5c\u7cfb\u7edf\uff09\u90fd\u5e7f\u6cdb\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002

    \u7531\u4e8e\u4ee5\u4e0a\u7f16\u7a0b\u8bed\u8a00\u5bf9\u5b57\u7b26\u6570\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u4eec\u4e0d\u5f97\u4e0d\u91c7\u53d6\u201c\u4ee3\u7406\u5bf9\u201d\u7684\u65b9\u5f0f\u6765\u8868\u793a\u8d85\u8fc7 16 \u4f4d\u957f\u5ea6\u7684 Unicode \u5b57\u7b26\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u5f97\u5df2\u4e3a\u4e4b\u7684\u65e0\u5948\u4e4b\u4e3e\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5bf9\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u4e00\u4e2a\u5b57\u7b26\u53ef\u80fd\u5360\u7528 2 \u5b57\u8282\u6216 4 \u5b57\u8282\uff0c\u4ece\u800c\u4e27\u5931\u4e86\u7b49\u957f\u7f16\u7801\u7684\u4f18\u52bf\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5904\u7406\u4ee3\u7406\u5bf9\u9700\u8981\u989d\u5916\u589e\u52a0\u4ee3\u7801\uff0c\u8fd9\u63d0\u9ad8\u4e86\u7f16\u7a0b\u7684\u590d\u6742\u6027\u548c\u8c03\u8bd5\u96be\u5ea6\u3002

    \u51fa\u4e8e\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6848\u3002

    • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7f16\u7801\uff0c\u5e76\u91c7\u7528\u4e00\u79cd\u7075\u6d3b\u7684\u5b57\u7b26\u4e32\u8868\u793a\uff0c\u5b58\u50a8\u7684\u5b57\u7b26\u957f\u5ea6\u53d6\u51b3\u4e8e\u5b57\u7b26\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u7801\u70b9\u3002\u82e5\u5b57\u7b26\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff1b\u5982\u679c\u6709\u5b57\u7b26\u8d85\u51fa\u4e86 ASCII \u8303\u56f4\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8bed\u8a00\u5e73\u9762\uff08BMP\uff09\u5185\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 4 \u5b57\u8282\u3002
    • Go \u8bed\u8a00\u7684 string \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Go \u8bed\u8a00\u8fd8\u63d0\u4f9b\u4e86 rune \u7c7b\u578b\uff0c\u5b83\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002
    • Rust \u8bed\u8a00\u7684 str \u548c String \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u7c7b\u578b\uff0c\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8ba8\u8bba\u7684\u90fd\u662f\u5b57\u7b26\u4e32\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u8fd9\u548c\u5b57\u7b26\u4e32\u5982\u4f55\u5728\u6587\u4ef6\u4e2d\u5b58\u50a8\u6216\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u662f\u4e0d\u540c\u7684\u95ee\u9898\u3002\u5728\u6587\u4ef6\u5b58\u50a8\u6216\u7f51\u7edc\u4f20\u8f93\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u5b57\u7b26\u4e32\u7f16\u7801\u4e3a UTF-8 \u683c\u5f0f\uff0c\u4ee5\u8fbe\u5230\u6700\u4f18\u7684\u517c\u5bb9\u6027\u548c\u7a7a\u95f4\u6548\u7387\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

    \u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\u5305\u62ec\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\uff0c\u5b83\u4eec\u53ef\u4ee5\u4ece\u201c\u903b\u8f91\u7ed3\u6784\u201d\u548c\u201c\u7269\u7406\u7ed3\u6784\u201d\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u903b\u8f91\u7ed3\u6784\uff1a\u7ebf\u6027\u4e0e\u975e\u7ebf\u6027","text":"

    \u903b\u8f91\u7ed3\u6784\u63ed\u793a\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\u3002\u5728\u6570\u7ec4\u548c\u94fe\u8868\u4e2d\uff0c\u6570\u636e\u6309\u7167\u4e00\u5b9a\u987a\u5e8f\u6392\u5217\uff0c\u4f53\u73b0\u4e86\u6570\u636e\u4e4b\u95f4\u7684\u7ebf\u6027\u5173\u7cfb\uff1b\u800c\u5728\u6811\u4e2d\uff0c\u6570\u636e\u4ece\u9876\u90e8\u5411\u4e0b\u6309\u5c42\u6b21\u6392\u5217\uff0c\u8868\u73b0\u51fa\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff1b\u56fe\u5219\u7531\u8282\u70b9\u548c\u8fb9\u6784\u6210\uff0c\u53cd\u6620\u4e86\u590d\u6742\u7684\u7f51\u7edc\u5173\u7cfb\u3002

    \u5982\u56fe 3-1 \u6240\u793a\uff0c\u903b\u8f91\u7ed3\u6784\u53ef\u5206\u4e3a\u201c\u7ebf\u6027\u201d\u548c\u201c\u975e\u7ebf\u6027\u201d\u4e24\u5927\u7c7b\u3002\u7ebf\u6027\u7ed3\u6784\u6bd4\u8f83\u76f4\u89c2\uff0c\u6307\u6570\u636e\u5728\u903b\u8f91\u5173\u7cfb\u4e0a\u5448\u7ebf\u6027\u6392\u5217\uff1b\u975e\u7ebf\u6027\u7ed3\u6784\u5219\u76f8\u53cd\uff0c\u5448\u975e\u7ebf\u6027\u6392\u5217\u3002

    • \u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u4e00\u7684\u987a\u5e8f\u5173\u7cfb\u3002
    • \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u56fe\u3001\u54c8\u5e0c\u8868\u3002

    \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u6811\u5f62\u7ed3\u6784\u548c\u7f51\u72b6\u7ed3\u6784\u3002

    • \u6811\u5f62\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u591a\u7684\u5173\u7cfb\u3002
    • \u7f51\u72b6\u7ed3\u6784\uff1a\u56fe\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u591a\u5bf9\u591a\u7684\u5173\u7cfb\u3002

    \u56fe 3-1 \u00a0 \u7ebf\u6027\u6570\u636e\u7ed3\u6784\u4e0e\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784

    "},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u5206\u6563","text":"

    \u5f53\u7b97\u6cd5\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u56fe 3-2 \u5c55\u793a\u4e86\u4e00\u4e2a\u8ba1\u7b97\u673a\u5185\u5b58\u6761\uff0c\u5176\u4e2d\u6bcf\u4e2a\u9ed1\u8272\u65b9\u5757\u90fd\u5305\u542b\u4e00\u5757\u5185\u5b58\u7a7a\u95f4\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u5185\u5b58\u60f3\u8c61\u6210\u4e00\u4e2a\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5355\u5143\u683c\u90fd\u53ef\u4ee5\u5b58\u50a8\u4e00\u5b9a\u5927\u5c0f\u7684\u6570\u636e\u3002

    \u7cfb\u7edf\u901a\u8fc7\u5185\u5b58\u5730\u5740\u6765\u8bbf\u95ee\u76ee\u6807\u4f4d\u7f6e\u7684\u6570\u636e\u3002\u5982\u56fe 3-2 \u6240\u793a\uff0c\u8ba1\u7b97\u673a\u6839\u636e\u7279\u5b9a\u89c4\u5219\u4e3a\u8868\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5206\u914d\u7f16\u53f7\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u6709\u552f\u4e00\u7684\u5185\u5b58\u5730\u5740\u3002\u6709\u4e86\u8fd9\u4e9b\u5730\u5740\uff0c\u7a0b\u5e8f\u4fbf\u53ef\u4ee5\u8bbf\u95ee\u5185\u5b58\u4e2d\u7684\u6570\u636e\u3002

    \u56fe 3-2 \u00a0 \u5185\u5b58\u6761\u3001\u5185\u5b58\u7a7a\u95f4\u3001\u5185\u5b58\u5730\u5740

    Tip

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5c06\u5185\u5b58\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u4e2a\u7b80\u5316\u7684\u7c7b\u6bd4\uff0c\u5b9e\u9645\u5185\u5b58\u7684\u5de5\u4f5c\u673a\u5236\u6bd4\u8f83\u590d\u6742\uff0c\u6d89\u53ca\u5730\u5740\u7a7a\u95f4\u3001\u5185\u5b58\u7ba1\u7406\u3001\u7f13\u5b58\u673a\u5236\u3001\u865a\u62df\u5185\u5b58\u548c\u7269\u7406\u5185\u5b58\u7b49\u6982\u5ff5\u3002

    \u5185\u5b58\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u5171\u4eab\u8d44\u6e90\uff0c\u5f53\u67d0\u5757\u5185\u5b58\u88ab\u67d0\u4e2a\u7a0b\u5e8f\u5360\u7528\u65f6\uff0c\u5219\u65e0\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5e8f\u540c\u65f6\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8bbe\u8ba1\u4e2d\uff0c\u5185\u5b58\u8d44\u6e90\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u8003\u8651\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u7b97\u6cd5\u6240\u5360\u7528\u7684\u5185\u5b58\u5cf0\u503c\u4e0d\u5e94\u8d85\u8fc7\u7cfb\u7edf\u5269\u4f59\u7a7a\u95f2\u5185\u5b58\uff1b\u5982\u679c\u7f3a\u5c11\u8fde\u7eed\u5927\u5757\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u90a3\u4e48\u6240\u9009\u7528\u7684\u6570\u636e\u7ed3\u6784\u5fc5\u987b\u80fd\u591f\u5b58\u50a8\u5728\u5206\u6563\u7684\u5185\u5b58\u7a7a\u95f4\u5185\u3002

    \u5982\u56fe 3-3 \u6240\u793a\uff0c\u7269\u7406\u7ed3\u6784\u53cd\u6620\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u7269\u7406\u7ed3\u6784\u4ece\u5e95\u5c42\u51b3\u5b9a\u4e86\u6570\u636e\u7684\u8bbf\u95ee\u3001\u66f4\u65b0\u3001\u589e\u5220\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u65b9\u9762\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u70b9\u3002

    \u56fe 3-3 \u00a0 \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u4e0e\u5206\u6563\u7a7a\u95f4\u5b58\u50a8

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u57fa\u4e8e\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e8c\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002\u4f8b\u5982\uff0c\u6808\u548c\u961f\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff1b\u800c\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u6570\u7ec4\u548c\u94fe\u8868\u3002

    • \u57fa\u4e8e\u6570\u7ec4\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u3001\u77e9\u9635\u3001\u5f20\u91cf\uff08\u7ef4\u5ea6 \\(\\geq 3\\) \u7684\u6570\u7ec4\uff09\u7b49\u3002
    • \u57fa\u4e8e\u94fe\u8868\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u3002

    \u94fe\u8868\u5728\u521d\u59cb\u5316\u540e\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u5bf9\u5176\u957f\u5ea6\u8fdb\u884c\u8c03\u6574\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u52a8\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u7ec4\u53ef\u901a\u8fc7\u91cd\u65b0\u5206\u914d\u5185\u5b58\u5b9e\u73b0\u957f\u5ea6\u53d8\u5316\uff0c\u4ece\u800c\u5177\u5907\u4e00\u5b9a\u7684\u201c\u52a8\u6001\u6027\u201d\u3002

    Tip

    \u5982\u679c\u4f60\u611f\u89c9\u7269\u7406\u7ed3\u6784\u7406\u89e3\u8d77\u6765\u6709\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u9605\u8bfb\u4e0b\u4e00\u7ae0\uff0c\u7136\u540e\u518d\u56de\u987e\u672c\u8282\u5185\u5bb9\u3002

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *","text":"

    Tip

    \u5728\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u5e26\u6709 * \u7b26\u53f7\u7684\u662f\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u65f6\u95f4\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\uff0c\u7b49\u5b66\u5b8c\u5fc5\u8bfb\u7ae0\u8282\u540e\u518d\u5355\u72ec\u653b\u514b\u3002

    "},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801","text":"

    \u5728\u4e0a\u4e00\u8282\u7684\u8868\u683c\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6240\u6709\u6574\u6570\u7c7b\u578b\u80fd\u591f\u8868\u793a\u7684\u8d1f\u6570\u90fd\u6bd4\u6b63\u6570\u591a\u4e00\u4e2a\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \u3002\u8fd9\u4e2a\u73b0\u8c61\u6bd4\u8f83\u53cd\u76f4\u89c9\uff0c\u5b83\u7684\u5185\u5728\u539f\u56e0\u6d89\u53ca\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u76f8\u5173\u77e5\u8bc6\u3002

    \u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6570\u5b57\u662f\u4ee5\u201c\u8865\u7801\u201d\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u7684\u3002\u5728\u5206\u6790\u8fd9\u6837\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7ed9\u51fa\u4e09\u8005\u7684\u5b9a\u4e49\u3002

    • \u539f\u7801\uff1a\u6211\u4eec\u5c06\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6570\uff0c\\(1\\) \u8868\u793a\u8d1f\u6570\uff0c\u5176\u4f59\u4f4d\u8868\u793a\u6570\u5b57\u7684\u503c\u3002
    • \u53cd\u7801\uff1a\u6b63\u6570\u7684\u53cd\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u53cd\u7801\u662f\u5bf9\u5176\u539f\u7801\u9664\u7b26\u53f7\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
    • \u8865\u7801\uff1a\u6b63\u6570\u7684\u8865\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u8865\u7801\u662f\u5728\u5176\u53cd\u7801\u7684\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u3002

    \u56fe 3-4 \u5c55\u793a\u4e86\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u4e4b\u95f4\u7684\u8f6c\u6362\u65b9\u6cd5\u3002

    \u56fe 3-4 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u4e0e\u8865\u7801\u4e4b\u95f4\u7684\u76f8\u4e92\u8f6c\u6362

    \u539f\u7801\uff08sign-magnitude\uff09\u867d\u7136\u6700\u76f4\u89c2\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8d1f\u6570\u7684\u539f\u7801\u4e0d\u80fd\u76f4\u63a5\u7528\u4e8e\u8fd0\u7b97\u3002\u4f8b\u5982\u5728\u539f\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7ed3\u679c\u662f \\(-3\\) \uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

    \u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u8ba1\u7b97\u673a\u5f15\u5165\u4e86\u53cd\u7801\uff081's complement\uff09\u3002\u5982\u679c\u6211\u4eec\u5148\u5c06\u539f\u7801\u8f6c\u6362\u4e3a\u53cd\u7801\uff0c\u5e76\u5728\u53cd\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u540e\u5c06\u7ed3\u679c\u4ece\u53cd\u7801\u8f6c\u6362\u56de\u539f\u7801\uff0c\u5219\u53ef\u5f97\u5230\u6b63\u786e\u7ed3\u679c \\(-1\\) \u3002

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(\u539f\u7801)} + 1000 \\; 0010 \\; \\text{(\u539f\u7801)} \\newline & = 0000 \\; 0001 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1101 \\; \\text{(\u53cd\u7801)} \\newline & = 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & \\rightarrow -1 \\end{aligned} \\]

    \u53e6\u4e00\u65b9\u9762\uff0c\u6570\u5b57\u96f6\u7684\u539f\u7801\u6709 \\(+0\\) \u548c \\(-0\\) \u4e24\u79cd\u8868\u793a\u65b9\u5f0f\u3002\u8fd9\u610f\u5473\u7740\u6570\u5b57\u96f6\u5bf9\u5e94\u4e24\u4e2a\u4e0d\u540c\u7684\u4e8c\u8fdb\u5236\u7f16\u7801\uff0c\u8fd9\u53ef\u80fd\u4f1a\u5e26\u6765\u6b67\u4e49\u3002\u6bd4\u5982\u5728\u6761\u4ef6\u5224\u65ad\u4e2d\uff0c\u5982\u679c\u6ca1\u6709\u533a\u5206\u6b63\u96f6\u548c\u8d1f\u96f6\uff0c\u5219\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5224\u65ad\u7ed3\u679c\u51fa\u9519\u3002\u800c\u5982\u679c\u6211\u4eec\u60f3\u5904\u7406\u6b63\u96f6\u548c\u8d1f\u96f6\u6b67\u4e49\uff0c\u5219\u9700\u8981\u5f15\u5165\u989d\u5916\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u8fd9\u53ef\u80fd\u4f1a\u964d\u4f4e\u8ba1\u7b97\u673a\u7684\u8fd0\u7b97\u6548\u7387\u3002

    \\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

    \u4e0e\u539f\u7801\u4e00\u6837\uff0c\u53cd\u7801\u4e5f\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\uff0c\u56e0\u6b64\u8ba1\u7b97\u673a\u8fdb\u4e00\u6b65\u5f15\u5165\u4e86\u8865\u7801\uff082's complement\uff09\u3002\u6211\u4eec\u5148\u6765\u89c2\u5bdf\u4e00\u4e0b\u8d1f\u96f6\u7684\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u8f6c\u6362\u8fc7\u7a0b\uff1a

    \\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u7801)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u53cd\u7801)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline \\end{aligned} \\]

    \u5728\u8d1f\u96f6\u7684\u53cd\u7801\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u4f1a\u4ea7\u751f\u8fdb\u4f4d\uff0c\u4f46 byte \u7c7b\u578b\u7684\u957f\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u51fa\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u4f1a\u88ab\u820d\u5f03\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8d1f\u96f6\u7684\u8865\u7801\u4e3a \\(0000 \\; 0000\\) \uff0c\u4e0e\u6b63\u96f6\u7684\u8865\u7801\u76f8\u540c\u3002\u8fd9\u610f\u5473\u7740\u5728\u8865\u7801\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u4e2a\u96f6\uff0c\u6b63\u8d1f\u96f6\u6b67\u4e49\u4ece\u800c\u5f97\u5230\u89e3\u51b3\u3002

    \u8fd8\u5269\u6700\u540e\u4e00\u4e2a\u7591\u60d1\uff1abyte \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u6765\u7684\u4e00\u4e2a\u8d1f\u6570 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u4eec\u6ce8\u610f\u5230\uff0c\u533a\u95f4 \\([-127, +127]\\) \u5185\u7684\u6240\u6709\u6574\u6570\u90fd\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\uff0c\u5e76\u4e14\u539f\u7801\u548c\u8865\u7801\u4e4b\u95f4\u53ef\u4ee5\u4e92\u76f8\u8f6c\u6362\u3002

    \u7136\u800c\uff0c\u8865\u7801 \\(1000 \\; 0000\\) \u662f\u4e00\u4e2a\u4f8b\u5916\uff0c\u5b83\u5e76\u6ca1\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3002\u6839\u636e\u8f6c\u6362\u65b9\u6cd5\uff0c\u6211\u4eec\u5f97\u5230\u8be5\u8865\u7801\u7684\u539f\u7801\u4e3a \\(0000 \\; 0000\\) \u3002\u8fd9\u663e\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u4e3a\u8be5\u539f\u7801\u8868\u793a\u6570\u5b57 \\(0\\) \uff0c\u5b83\u7684\u8865\u7801\u5e94\u8be5\u662f\u81ea\u8eab\u3002\u8ba1\u7b97\u673a\u89c4\u5b9a\u8fd9\u4e2a\u7279\u6b8a\u7684\u8865\u7801 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5b9e\u9645\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u8865\u7801\u4e0b\u7684\u8ba1\u7b97\u7ed3\u679c\u5c31\u662f \\(-128\\) \u3002

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u7801)} + 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u8865\u7801)} + 1111 \\; 1111 \\; \\text{(\u8865\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline & \\rightarrow -128 \\end{aligned} \\]

    \u4f60\u53ef\u80fd\u5df2\u7ecf\u53d1\u73b0\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8ba1\u7b97\u90fd\u662f\u52a0\u6cd5\u8fd0\u7b97\u3002\u8fd9\u6697\u793a\u7740\u4e00\u4e2a\u91cd\u8981\u4e8b\u5b9e\uff1a\u8ba1\u7b97\u673a\u5185\u90e8\u7684\u786c\u4ef6\u7535\u8def\u4e3b\u8981\u662f\u57fa\u4e8e\u52a0\u6cd5\u8fd0\u7b97\u8bbe\u8ba1\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u52a0\u6cd5\u8fd0\u7b97\u76f8\u5bf9\u4e8e\u5176\u4ed6\u8fd0\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u51cf\u6cd5\uff09\u6765\u8bf4\uff0c\u786c\u4ef6\u5b9e\u73b0\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u66f4\u5bb9\u6613\u8fdb\u884c\u5e76\u884c\u5316\u5904\u7406\uff0c\u8fd0\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

    \u8bf7\u6ce8\u610f\uff0c\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8ba1\u7b97\u673a\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u901a\u8fc7\u5c06\u52a0\u6cd5\u4e0e\u4e00\u4e9b\u57fa\u672c\u903b\u8f91\u8fd0\u7b97\u7ed3\u5408\uff0c\u8ba1\u7b97\u673a\u80fd\u591f\u5b9e\u73b0\u5404\u79cd\u5176\u4ed6\u7684\u6570\u5b66\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u8ba1\u7b97\u51cf\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8ba1\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u51cf\u6cd5\u3002

    \u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u8ba1\u7b97\u673a\u4f7f\u7528\u8865\u7801\u7684\u539f\u56e0\uff1a\u57fa\u4e8e\u8865\u7801\u8868\u793a\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u7528\u540c\u6837\u7684\u7535\u8def\u548c\u64cd\u4f5c\u6765\u5904\u7406\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\u6765\u5904\u7406\u51cf\u6cd5\uff0c\u5e76\u4e14\u65e0\u987b\u7279\u522b\u5904\u7406\u6b63\u8d1f\u96f6\u7684\u6b67\u4e49\u95ee\u9898\u3002\u8fd9\u5927\u5927\u7b80\u5316\u4e86\u786c\u4ef6\u8bbe\u8ba1\uff0c\u63d0\u9ad8\u4e86\u8fd0\u7b97\u6548\u7387\u3002

    \u8865\u7801\u7684\u8bbe\u8ba1\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u5173\u7cfb\u6211\u4eec\u5c31\u5148\u4ecb\u7ecd\u5230\u8fd9\u91cc\uff0c\u5efa\u8bae\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8fdb\u4e00\u6b65\u6df1\u5165\u4e86\u89e3\u3002

    "},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u70b9\u6570\u7f16\u7801","text":"

    \u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u5b57\u8282 \uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\u8fd9\u975e\u5e38\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u6309\u7406\u8bf4 float \u9700\u8981\u8868\u793a\u5c0f\u6570\uff0c\u53d6\u503c\u8303\u56f4\u5e94\u8be5\u53d8\u5c0f\u624d\u5bf9\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8fd9\u662f\u56e0\u4e3a\u6d6e\u70b9\u6570 float \u91c7\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8bb0\u4e00\u4e2a 32 \u6bd4\u7279\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570\u4e3a\uff1a

    \\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

    \u6839\u636e IEEE 754 \u6807\u51c6\uff0c32-bit \u957f\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u4e2a\u90e8\u5206\u6784\u6210\u3002

    • \u7b26\u53f7\u4f4d \\(\\mathrm{S}\\) \uff1a\u5360 1 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{31}\\) \u3002
    • \u6307\u6570\u4f4d \\(\\mathrm{E}\\) \uff1a\u5360 8 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
    • \u5206\u6570\u4f4d \\(\\mathrm{N}\\) \uff1a\u5360 23 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

    \u4e8c\u8fdb\u5236\u6570 float \u5bf9\u5e94\u503c\u7684\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff1a

    \\[ \\text {val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2-127} \\times\\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

    \u8f6c\u5316\u5230\u5341\u8fdb\u5236\u4e0b\u7684\u8ba1\u7b97\u516c\u5f0f\u4e3a\uff1a

    \\[ \\text {val}=(-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} -127} \\times (1 + \\mathrm{N}) \\]

    \u5176\u4e2d\u5404\u9879\u7684\u53d6\u503c\u8303\u56f4\u4e3a\uff1a

    \\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

    \u56fe 3-5 \u00a0 IEEE 754 \u6807\u51c6\u4e0b\u7684 float \u7684\u8ba1\u7b97\u793a\u4f8b

    \u89c2\u5bdf\u56fe 3-5 \uff0c\u7ed9\u5b9a\u4e00\u4e2a\u793a\u4f8b\u6570\u636e \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5219\u6709\uff1a

    \\[ \\text { val } = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

    \u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u95ee\u9898\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6570\u4f4d\uff0c\u5bfc\u81f4\u5176\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \u3002\u6839\u636e\u4ee5\u4e0a\u8ba1\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6570\u4e3a \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u6362\u7b26\u53f7\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8d1f\u6570\u3002

    \u5c3d\u7ba1\u6d6e\u70b9\u6570 float \u6269\u5c55\u4e86\u53d6\u503c\u8303\u56f4\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6570\u7c7b\u578b int \u5c06\u5168\u90e8 32 \u6bd4\u7279\u7528\u4e8e\u8868\u793a\u6570\u5b57\uff0c\u6570\u5b57\u662f\u5747\u5300\u5206\u5e03\u7684\uff1b\u800c\u7531\u4e8e\u6307\u6570\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u70b9\u6570 float \u7684\u6570\u503c\u8d8a\u5927\uff0c\u76f8\u90bb\u4e24\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u5dee\u503c\u5c31\u4f1a\u8d8b\u5411\u8d8a\u5927\u3002

    \u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6570\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u4e49\uff0c\u7528\u4e8e\u8868\u793a\u96f6\u3001\u65e0\u7a77\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

    \u8868 3-2 \u00a0 \u6307\u6570\u4f4d\u542b\u4e49

    \u6307\u6570\u4f4d E \u5206\u6570\u4f4d \\(\\mathrm{N} = 0\\) \u5206\u6570\u4f4d \\(\\mathrm{N} \\ne 0\\) \u8ba1\u7b97\u516c\u5f0f \\(0\\) \\(\\pm 0\\) \u6b21\u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) \u6b63\u89c4\u6570 \u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6b21\u6b63\u89c4\u6570\u663e\u8457\u63d0\u5347\u4e86\u6d6e\u70b9\u6570\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u89c4\u6570\u4e3a \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\times 2^{-23}\\) \u3002

    \u53cc\u7cbe\u5ea6 double \u4e5f\u91c7\u7528\u7c7b\u4f3c\u4e8e float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d58\u8ff0\u3002

    "},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u4ece\u903b\u8f91\u7ed3\u6784\u548c\u7269\u7406\u7ed3\u6784\u4e24\u4e2a\u89d2\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002\u903b\u8f91\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\uff0c\u800c\u7269\u7406\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\u3002
    • \u5e38\u89c1\u7684\u903b\u8f91\u7ed3\u6784\u5305\u62ec\u7ebf\u6027\u3001\u6811\u72b6\u548c\u7f51\u72b6\u7b49\u3002\u901a\u5e38\u6211\u4eec\u6839\u636e\u903b\u8f91\u7ed3\u6784\u5c06\u6570\u636e\u7ed3\u6784\u5206\u4e3a\u7ebf\u6027\uff08\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\uff09\u548c\u975e\u7ebf\u6027\uff08\u6811\u3001\u56fe\u3001\u5806\uff09\u4e24\u79cd\u3002\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002
    • \u5f53\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u88ab\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u3002\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u62e5\u6709\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\uff0c\u7a0b\u5e8f\u901a\u8fc7\u8fd9\u4e9b\u5185\u5b58\u5730\u5740\u8bbf\u95ee\u6570\u636e\u3002
    • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u7531\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e24\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002
    • \u8ba1\u7b97\u673a\u4e2d\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u5305\u62ec\u6574\u6570 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u70b9\u6570 float\u3001double \uff0c\u5b57\u7b26 char \u548c\u5e03\u5c14 bool \u3002\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
    • \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7f16\u7801\u6570\u5b57\u7684\u4e09\u79cd\u65b9\u6cd5\uff0c\u5b83\u4eec\u4e4b\u95f4\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\u3002\u6574\u6570\u7684\u539f\u7801\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u53f7\u4f4d\uff0c\u5176\u4f59\u4f4d\u662f\u6570\u5b57\u7684\u503c\u3002
    • \u6574\u6570\u5728\u8ba1\u7b97\u673a\u4e2d\u662f\u4ee5\u8865\u7801\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\u3002\u5728\u8865\u7801\u8868\u793a\u4e0b\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u5bf9\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\u4e00\u89c6\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u4e3a\u51cf\u6cd5\u64cd\u4f5c\u5355\u72ec\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\uff0c\u5e76\u4e14\u4e0d\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u7684\u95ee\u9898\u3002
    • \u6d6e\u70b9\u6570\u7684\u7f16\u7801\u7531 1 \u4f4d\u7b26\u53f7\u4f4d\u30018 \u4f4d\u6307\u6570\u4f4d\u548c 23 \u4f4d\u5206\u6570\u4f4d\u6784\u6210\u3002\u7531\u4e8e\u5b58\u5728\u6307\u6570\u4f4d\uff0c\u56e0\u6b64\u6d6e\u70b9\u6570\u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e\u6574\u6570\uff0c\u4ee3\u4ef7\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002
    • ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u957f\u5ea6\u4e3a 1 \u5b57\u8282\uff0c\u5171\u6536\u5f55 127 \u4e2a\u5b57\u7b26\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u5f55\u4e24\u4e07\u591a\u4e2a\u6c49\u5b57\u3002Unicode \u81f4\u529b\u4e8e\u63d0\u4f9b\u4e00\u4e2a\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u6536\u5f55\u4e16\u754c\u4e0a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u4ece\u800c\u89e3\u51b3\u7531\u4e8e\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5bfc\u81f4\u7684\u4e71\u7801\u95ee\u9898\u3002
    • UTF-8 \u662f\u6700\u53d7\u6b22\u8fce\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u79cd\u53d8\u957f\u7684\u7f16\u7801\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u6269\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5b58\u50a8\u7a7a\u95f4\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u957f\u7684\u7f16\u7801\u65b9\u6cd5\u3002\u5728\u7f16\u7801\u4e2d\u6587\u65f6\uff0cUTF-16 \u5360\u7528\u7684\u7a7a\u95f4\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7f16\u7a0b\u8bed\u8a00\u9ed8\u8ba4\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002
    "},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1f

    \u54c8\u5e0c\u8868\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u800c\u4e3a\u4e86\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u4f7f\u7528\u201c\u94fe\u5f0f\u5730\u5740\u201d\uff08\u540e\u7eed\u201c\u54c8\u5e0c\u51b2\u7a81\u201d\u7ae0\u8282\u4f1a\u8bb2\uff09\uff1a\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u6876\u6307\u5411\u4e00\u4e2a\u94fe\u8868\uff0c\u5f53\u94fe\u8868\u957f\u5ea6\u8d85\u8fc7\u4e00\u5b9a\u9608\u503c\u65f6\uff0c\u53c8\u53ef\u80fd\u88ab\u8f6c\u5316\u4e3a\u6811\uff08\u901a\u5e38\u4e3a\u7ea2\u9ed1\u6811\uff09\u3002

    \u4ece\u5b58\u50a8\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u54c8\u5e0c\u8868\u7684\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u94fe\u8868\u6216\u4e00\u68f5\u6811\u3002\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\u3001\u94fe\u8868\uff09\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6811\uff09\u3002

    Q\uff1achar \u7c7b\u578b\u7684\u957f\u5ea6\u662f 1 \u5b57\u8282\u5417\uff1f

    char \u7c7b\u578b\u7684\u957f\u5ea6\u7531\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u7f16\u7801\u65b9\u6cd5\u51b3\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u91c7\u7528 UTF-16 \u7f16\u7801\uff08\u4fdd\u5b58 Unicode \u7801\u70b9\uff09\uff0c\u56e0\u6b64 char \u7c7b\u578b\u7684\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u3002

    Q\uff1a\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d \u662f\u5426\u6709\u6b67\u4e49\uff1f\u6808\u4e5f\u53ef\u4ee5\u8fdb\u884c\u51fa\u6808\u548c\u5165\u6808\u7b49\u64cd\u4f5c\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52a8\u6001\u201d\u7684\u3002

    \u6808\u786e\u5b9e\u53ef\u4ee5\u5b9e\u73b0\u52a8\u6001\u7684\u6570\u636e\u64cd\u4f5c\uff0c\u4f46\u6570\u636e\u7ed3\u6784\u4ecd\u7136\u662f\u201c\u9759\u6001\u201d\uff08\u957f\u5ea6\u4e0d\u53ef\u53d8\uff09\u7684\u3002\u5c3d\u7ba1\u57fa\u4e8e\u6570\u7ec4\u7684\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u52a8\u6001\u5730\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u4eec\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u6570\u636e\u91cf\u8d85\u51fa\u4e86\u9884\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u65e7\u6570\u7ec4\u7684\u5185\u5bb9\u590d\u5236\u5230\u65b0\u6570\u7ec4\u4e2d\u3002

    Q\uff1a\u5728\u6784\u5efa\u6808\uff08\u961f\u5217\uff09\u7684\u65f6\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u4e3a\u4ec0\u4e48\u5b83\u4eec\u662f\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u5462\uff1f

    \u5728\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e0\u987b\u4eba\u5de5\u6307\u5b9a\u6808\uff08\u961f\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u8fd9\u4e2a\u5de5\u4f5c\u7531\u7c7b\u5185\u90e8\u81ea\u52a8\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u4e3a 10\u3002\u53e6\u5916\uff0c\u6269\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52a8\u5b9e\u73b0\u7684\u3002\u8be6\u89c1\u540e\u7eed\u7684\u201c\u5217\u8868\u201d\u7ae0\u8282\u3002

    Q\uff1a\u539f\u7801\u8f6c\u8865\u7801\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\uff0c\u90a3\u4e48\u8865\u7801\u8f6c\u539f\u7801\u5e94\u8be5\u662f\u9006\u8fd0\u7b97\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff0c\u800c\u8865\u7801\u8f6c\u539f\u7801\u4e5f\u4e00\u6837\u53ef\u4ee5\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff0c\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff1f

    \u8fd9\u662f\u56e0\u4e3a\u539f\u7801\u548c\u8865\u7801\u7684\u76f8\u4e92\u8f6c\u6362\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u201c\u8865\u6570\u201d\u7684\u8fc7\u7a0b\u3002\u6211\u4eec\u5148\u7ed9\u51fa\u8865\u6570\u7684\u5b9a\u4e49\uff1a\u5047\u8bbe \\(a + b = c\\) \uff0c\u90a3\u4e48\u6211\u4eec\u79f0 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u8865\u6570\uff0c\u53cd\u4e4b\u4e5f\u79f0 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u8865\u6570\u3002

    \u7ed9\u5b9a\u4e00\u4e2a \\(n = 4\\) \u4f4d\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570 \\(0010\\) \uff0c\u5982\u679c\u5c06\u8fd9\u4e2a\u6570\u5b57\u770b\u4f5c\u539f\u7801\uff08\u4e0d\u8003\u8651\u7b26\u53f7\u4f4d\uff09\uff0c\u90a3\u4e48\u5b83\u7684\u8865\u7801\u9700\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff1a

    \\[ 0010 \\rightarrow 1101 \\rightarrow 1110 \\]

    \u6211\u4eec\u4f1a\u53d1\u73b0\uff0c\u539f\u7801\u548c\u8865\u7801\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u8865\u7801 \\(1110\\) \u662f\u539f\u7801 \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\u7684\u8fc7\u7a0b\u3002

    \u90a3\u4e48\uff0c\u8865\u7801 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u4eec\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

    \\[ 1110 \\rightarrow 0001 \\rightarrow 0010 \\]

    \u6362\u53e5\u8bdd\u8bf4\uff0c\u539f\u7801\u548c\u8865\u7801\u4e92\u4e3a\u5bf9\u65b9\u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\uff0c\u56e0\u6b64\u201c\u539f\u7801\u8f6c\u8865\u7801\u201d\u548c\u201c\u8865\u7801\u8f6c\u539f\u7801\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u540e\u52a0 1 \uff09\u5b9e\u73b0\u3002

    \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u7528\u9006\u8fd0\u7b97\u6765\u6c42\u8865\u7801 \\(1110\\) \u7684\u539f\u7801\uff0c\u5373\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff1a

    \\[ 1110 \\rightarrow 1101 \\rightarrow 0010 \\]

    \u603b\u7ed3\u6765\u770b\uff0c\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u548c\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\u8fd9\u4e24\u79cd\u8fd0\u7b97\u90fd\u662f\u5728\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\uff0c\u5b83\u4eec\u662f\u7b49\u4ef7\u7684\u3002

    \u672c\u8d28\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u8865\u6570\uff08\u56e0\u4e3a\u6052\u6709 \u539f\u7801 + \u53cd\u7801 = 1111\uff09\uff1b\u800c\u5728\u53cd\u7801\u57fa\u7840\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u8865\u7801\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u8865\u6570\u3002

    \u4e0a\u8ff0\u4ee5 \\(n = 4\\) \u4e3a\u4f8b\uff0c\u5176\u53ef\u88ab\u63a8\u5e7f\u81f3\u4efb\u610f\u4f4d\u6570\u7684\u4e8c\u8fdb\u5236\u6570\u3002

    "},{"location":"chapter_divide_and_conquer/","title":"\u7b2c 12 \u7ae0 \u00a0 \u5206\u6cbb","text":"

    Abstract

    \u96be\u9898\u88ab\u9010\u5c42\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u53d8\u5f97\u66f4\u4e3a\u7b80\u5355\u3002

    \u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u4e2a\u91cd\u8981\u7684\u4e8b\u5b9e\uff1a\u4ece\u7b80\u5355\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u590d\u6742\u3002

    "},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5
    • 12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565
    • 12.3 \u00a0 \u6784\u5efa\u6811\u95ee\u9898
    • 12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898
    • 12.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565","text":"

    \u6211\u4eec\u5df2\u7ecf\u5b66\u8fc7\uff0c\u641c\u7d22\u7b97\u6cd5\u5206\u4e3a\u4e24\u5927\u7c7b\u3002

    • \u66b4\u529b\u641c\u7d22\uff1a\u5b83\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
    • \u81ea\u9002\u5e94\u641c\u7d22\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u6570\u636e\u7ec4\u7ec7\u5f62\u5f0f\u6216\u5148\u9a8c\u4fe1\u606f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u548c\u6811\u3002

    • \u4e8c\u5206\u67e5\u627e\u7684\u6bcf\u4e00\u6b65\u90fd\u5c06\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\u5206\u89e3\u4e3a\u4e00\u4e2a\u5c0f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4e00\u76f4\u6301\u7eed\u5230\u6570\u7ec4\u4e3a\u7a7a\u6216\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
    • \u6811\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u5806\u7b49\u6570\u636e\u7ed3\u6784\u4e2d\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7686\u4e3a \\(O(\\log n)\\) \u3002

    \u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

    • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u67e5\u627e\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\u5206\u89e3\u4e3a\u5b50\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\uff0c\u8fd9\u662f\u901a\u8fc7\u6bd4\u8f83\u4e2d\u95f4\u5143\u7d20\u548c\u76ee\u6807\u5143\u7d20\u6765\u5b9e\u73b0\u7684\u3002
    • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u5904\u7406\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u95ee\u9898\u7684\u5f71\u54cd\u3002
    • \u5b50\u95ee\u9898\u7684\u89e3\u65e0\u987b\u5408\u5e76\uff1a\u4e8c\u5206\u67e5\u627e\u65e8\u5728\u67e5\u627e\u4e00\u4e2a\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u3002\u5f53\u5b50\u95ee\u9898\u5f97\u5230\u89e3\u51b3\u65f6\uff0c\u539f\u95ee\u9898\u4e5f\u4f1a\u540c\u65f6\u5f97\u5230\u89e3\u51b3\u3002

    \u5206\u6cbb\u80fd\u591f\u63d0\u5347\u641c\u7d22\u6548\u7387\uff0c\u672c\u8d28\u4e0a\u662f\u56e0\u4e3a\u66b4\u529b\u641c\u7d22\u6bcf\u8f6e\u53ea\u80fd\u6392\u9664\u4e00\u4e2a\u9009\u9879\uff0c\u800c\u5206\u6cbb\u641c\u7d22\u6bcf\u8f6e\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9009\u9879\u3002

    "},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u4e8e\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e","text":"

    \u5728\u4e4b\u524d\u7684\u7ae0\u8282\u4e2d\uff0c\u4e8c\u5206\u67e5\u627e\u662f\u57fa\u4e8e\u9012\u63a8\uff08\u8fed\u4ee3\uff09\u5b9e\u73b0\u7684\u3002\u73b0\u5728\u6211\u4eec\u57fa\u4e8e\u5206\u6cbb\uff08\u9012\u5f52\uff09\u6765\u5b9e\u73b0\u5b83\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8bf7\u67e5\u627e\u5143\u7d20 target \u3002

    \u4ece\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u4eec\u5c06\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u8bb0\u4e3a \\(f(i, j)\\) \u3002

    \u4ee5\u539f\u95ee\u9898 \\(f(0, n-1)\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u901a\u8fc7\u4ee5\u4e0b\u6b65\u9aa4\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u3002

    1. \u8ba1\u7b97\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u7684\u4e2d\u70b9 \\(m\\) \uff0c\u6839\u636e\u5b83\u6392\u9664\u4e00\u534a\u641c\u7d22\u533a\u95f4\u3002
    2. \u9012\u5f52\u6c42\u89e3\u89c4\u6a21\u51cf\u5c0f\u4e00\u534a\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u80fd\u4e3a \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
    3. \u5faa\u73af\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u533a\u95f4\u4e3a\u7a7a\u65f6\u8fd4\u56de\u3002

    \u56fe 12-4 \u5c55\u793a\u4e86\u5728\u6570\u7ec4\u4e2d\u4e8c\u5206\u67e5\u627e\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u8fc7\u7a0b\u3002

    \u56fe 12-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u8fc7\u7a0b

    \u5728\u5b9e\u73b0\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \u6765\u6c42\u89e3\u95ee\u9898 \\(f(i, j)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_recur.py
    def dfs(nums: list[int], target: int, i: int, j: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j)\"\"\"\n    # \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
    binary_search_recur.cpp
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.java
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.cs
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
    binary_search_recur.go
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u6ca1\u6709\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8ba1\u7b97\u7d22\u5f15\u4e2d\u70b9\n    m := i + ((j - i) >> 1)\n    //\u5224\u65ad\u4e2d\u70b9\u4e0e\u76ee\u6807\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u53f3\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u5de6\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums []int, target int) int {\n    n := len(nums)\n    return dfs(nums, target, 0, n-1)\n}\n
    binary_search_recur.swift
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)\n}\n
    binary_search_recur.js
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.ts
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.dart
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.rs
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = i + (j - i) / 2;\n    if nums[m as usize] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.c
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.kt
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.rb
    ### \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) ###\ndef dfs(nums, target, i, j)\n  # \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n  return -1 if i > j\n\n  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n  m = (i + j) / 2\n\n  if nums[m] < target\n    # \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n    return dfs(nums, target, m + 1, j)\n  elsif nums[m] > target\n    # \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n    return dfs(nums, target, i, m - 1)\n  else\n    # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m\n  end\nend\n\n### \u4e8c\u5206\u67e5\u627e ###\ndef binary_search(nums, target)\n  n = nums.length\n  # \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n  dfs(nums, target, 0, n - 1)\nend\n
    binary_search_recur.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \uff0c\u8bf7\u4ece\u4e2d\u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u8fd4\u56de\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u3002\u5047\u8bbe\u4e8c\u53c9\u6811\u4e2d\u6ca1\u6709\u503c\u91cd\u590d\u7684\u8282\u70b9\uff08\u5982\u56fe 12-5 \u6240\u793a\uff09\u3002

    \u56fe 12-5 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65ad\u662f\u5426\u4e3a\u5206\u6cbb\u95ee\u9898","text":"

    \u539f\u95ee\u9898\u5b9a\u4e49\u4e3a\u4ece preorder \u548c inorder \u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u662f\u4e00\u4e2a\u5178\u578b\u7684\u5206\u6cbb\u95ee\u9898\u3002

    • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4ece\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\u3001\u6784\u5efa\u53f3\u5b50\u6811\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u8282\u70b9\u3002\u800c\u5bf9\u4e8e\u6bcf\u68f5\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u590d\u7528\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u5c06\u5176\u5212\u5206\u4e3a\u66f4\u5c0f\u7684\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u7a7a\u5b50\u6811\uff09\u65f6\u7ec8\u6b62\u3002
    • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u4ea4\u96c6\u3002\u5728\u6784\u5efa\u5de6\u5b50\u6811\u65f6\uff0c\u6211\u4eec\u53ea\u9700\u5173\u6ce8\u4e2d\u5e8f\u904d\u5386\u548c\u524d\u5e8f\u904d\u5386\u4e2d\u4e0e\u5de6\u5b50\u6811\u5bf9\u5e94\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6811\u540c\u7406\u3002
    • \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u5b83\u4eec\u94fe\u63a5\u5230\u6839\u8282\u70b9\u4e0a\uff0c\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5212\u5206\u5b50\u6811","text":"

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u8fd9\u9053\u9898\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u6765\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u901a\u8fc7\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u6765\u5212\u5206\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u5462\uff1f

    \u6839\u636e\u5b9a\u4e49\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

    • \u524d\u5e8f\u904d\u5386\uff1a[ \u6839\u8282\u70b9 | \u5de6\u5b50\u6811 | \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 3 | 9 | 2 1 7 ] \u3002
    • \u4e2d\u5e8f\u904d\u5386\uff1a[ \u5de6\u5b50\u6811 | \u6839\u8282\u70b9 \uff5c \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 9 | 3 | 1 2 7 ] \u3002

    \u4ee5\u4e0a\u56fe\u6570\u636e\u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u56fe 12-6 \u6240\u793a\u7684\u6b65\u9aa4\u5f97\u5230\u5212\u5206\u7ed3\u679c\u3002

    1. \u524d\u5e8f\u904d\u5386\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u8282\u70b9\u7684\u503c\u3002
    2. \u67e5\u627e\u6839\u8282\u70b9 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8be5\u7d22\u5f15\u53ef\u5c06 inorder \u5212\u5206\u4e3a [ 9 | 3 \uff5c 1 2 7 ] \u3002
    3. \u6839\u636e inorder \u7684\u5212\u5206\u7ed3\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u5206\u522b\u4e3a 1 \u548c 3 \uff0c\u4ece\u800c\u53ef\u5c06 preorder \u5212\u5206\u4e3a [ 3 | 9 | 2 1 7 ] \u3002

    \u56fe 12-6 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u5212\u5206\u5b50\u6811

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u4e8e\u53d8\u91cf\u63cf\u8ff0\u5b50\u6811\u533a\u95f4","text":"

    \u6839\u636e\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u6211\u4eec\u5df2\u7ecf\u5f97\u5230\u6839\u8282\u70b9\u3001\u5de6\u5b50\u6811\u3001\u53f3\u5b50\u6811\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002\u800c\u4e3a\u4e86\u63cf\u8ff0\u8fd9\u4e9b\u7d22\u5f15\u533a\u95f4\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u3002

    • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(i\\) \u3002
    • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(m\\) \u3002
    • \u5c06\u5f53\u524d\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u8bb0\u4e3a \\([l, r]\\) \u3002

    \u5982\u8868 12-1 \u6240\u793a\uff0c\u901a\u8fc7\u4ee5\u4e0a\u53d8\u91cf\u5373\u53ef\u8868\u793a\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002

    \u8868 12-1 \u00a0 \u6839\u8282\u70b9\u548c\u5b50\u6811\u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u7684\u7d22\u5f15

    \u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4 \u5f53\u524d\u6811 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6811 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6811 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

    \u8bf7\u6ce8\u610f\uff0c\u53f3\u5b50\u6811\u6839\u8282\u70b9\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u4e49\u662f\u201c\u5de6\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u201d\uff0c\u5efa\u8bae\u7ed3\u5408\u56fe 12-7 \u7406\u89e3\u3002

    \u56fe 12-7 \u00a0 \u6839\u8282\u70b9\u548c\u5de6\u53f3\u5b50\u6811\u7684\u7d22\u5f15\u533a\u95f4\u8868\u793a

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u4e3a\u4e86\u63d0\u5347\u67e5\u8be2 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 hmap \u6765\u5b58\u50a8\u6570\u7ec4 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig build_tree.py
    def dfs(\n    preorder: list[int],\n    inorder_map: dict[int, int],\n    i: int,\n    l: int,\n    r: int,\n) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root = TreeNode(preorder[i])\n    # \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m = inorder_map[preorder[i]]\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\"\"\"\n    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorder_map = {val: i for i, val in enumerate(inorder)}\n    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)\n    return root\n
    build_tree.cpp
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    unordered_map<int, int> inorderMap;\n    for (int i = 0; i < inorder.size(); i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);\n    return root;\n}\n
    build_tree.java
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Map<Integer, Integer> inorderMap = new HashMap<>();\n    for (int i = 0; i < inorder.length; i++) {\n        inorderMap.put(inorder[i], i);\n    }\n    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.cs
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Dictionary<int, int> inorderMap = [];\n    for (int i = 0; i < inorder.Length; i++) {\n        inorderMap.TryAdd(inorder[i], i);\n    }\n    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);\n    return root;\n}\n
    build_tree.go
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m := inorderMap[preorder[i]]\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorderMap := make(map[int]int, len(inorder))\n    for i := 0; i < len(inorder); i++ {\n        inorderMap[inorder[i]] = i\n    }\n\n    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)\n    return root\n}\n
    build_tree.swift
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }\n    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)\n}\n
    build_tree.js
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.ts
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(\n    preorder: number[],\n    inorderMap: Map<number, number>,\n    i: number,\n    l: number,\n    r: number\n): TreeNode | null {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map<number, number>();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.dart
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? dfs(\n  List<int> preorder,\n  Map<int, int> inorderMap,\n  int i,\n  int l,\n  int r,\n) {\n  // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u8282\u70b9\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u8282\u70b9\n  return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n  Map<int, int> inorderMap = {};\n  for (int i = 0; i < inorder.length; i++) {\n    inorderMap[inorder[i]] = i;\n  }\n  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n  return root;\n}\n
    build_tree.rs
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfn dfs(\n    preorder: &[i32],\n    inorder_map: &HashMap<i32, i32>,\n    i: i32,\n    l: i32,\n    r: i32,\n) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    Some(root)\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let mut inorder_map: HashMap<i32, i32> = HashMap::new();\n    for i in 0..inorder.len() {\n        inorder_map.insert(inorder[i], i as i32);\n    }\n    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);\n    root\n}\n
    build_tree.c
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);\n    for (int i = 0; i < inorderSize; i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);\n    free(inorderMap);\n    return root;\n}\n
    build_tree.kt
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfun dfs(\n    preorder: IntArray,\n    inorderMap: Map<Int?, Int?>,\n    i: Int,\n    l: Int,\n    r: Int\n): TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    val inorderMap = HashMap<Int?, Int?>()\n    for (i in inorder.indices) {\n        inorderMap[inorder[i]] = i\n    }\n    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)\n    return root\n}\n
    build_tree.rb
    ### \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb ###\ndef dfs(preorder, inorder_map, i, l, r)\n  # \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n  return if r - l < 0\n\n  # \u521d\u59cb\u5316\u6839\u8282\u70b9\n  root = TreeNode.new(preorder[i])\n  # \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n  m = inorder_map[preorder[i]]\n  # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n  root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n  # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n  root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n\n  # \u8fd4\u56de\u6839\u8282\u70b9\n  root\nend\n\n### \u6784\u5efa\u4e8c\u53c9\u6811 ###\ndef build_tree(preorder, inorder)\n  # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n  inorder_map = {}\n  inorder.each_with_index { |val, i| inorder_map[val] = i }\n  dfs(preorder, inorder_map, 0, 0, inorder.length - 1)\nend\n
    build_tree.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 12-8 \u5c55\u793a\u4e86\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5404\u4e2a\u8282\u70b9\u662f\u5728\u5411\u4e0b\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u6761\u8fb9\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

    <1><2><3><4><5><6><7><8><9>

    \u56fe 12-8 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b

    \u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u5185\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u7684\u5212\u5206\u7ed3\u679c\u5982\u56fe 12-9 \u6240\u793a\u3002

    \u56fe 12-9 \u00a0 \u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u7684\u5212\u5206\u7ed3\u679c

    \u8bbe\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u4e2a\u8282\u70b9\uff08\u6267\u884c\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    \u54c8\u5e0c\u8868\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5","text":"

    \u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u79f0\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u79cd\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u89c1\u7684\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u4e24\u4e2a\u6b65\u9aa4\u3002

    1. \u5206\uff08\u5212\u5206\u9636\u6bb5\uff09\uff1a\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u6216\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898\u65f6\u7ec8\u6b62\u3002
    2. \u6cbb\uff08\u5408\u5e76\u9636\u6bb5\uff09\uff1a\u4ece\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u95ee\u9898\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

    \u5982\u56fe 12-1 \u6240\u793a\uff0c\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\u4e4b\u4e00\u3002

    1. \u5206\uff1a\u9012\u5f52\u5730\u5c06\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u5230\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u95ee\u9898\uff09\u3002
    2. \u6cbb\uff1a\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u6709\u5e8f\u7684\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002

    \u56fe 12-1 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65ad\u5206\u6cbb\u95ee\u9898","text":"

    \u4e00\u4e2a\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u51b3\uff0c\u901a\u5e38\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b\u51e0\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

    1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u95ee\u9898\u53ef\u4ee5\u5206\u89e3\u6210\u89c4\u6a21\u66f4\u5c0f\u3001\u7c7b\u4f3c\u7684\u5b50\u95ee\u9898\uff0c\u4ee5\u53ca\u80fd\u591f\u4ee5\u76f8\u540c\u65b9\u5f0f\u9012\u5f52\u5730\u8fdb\u884c\u5212\u5206\u3002
    2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5b50\u95ee\u9898\u4e4b\u95f4\u6ca1\u6709\u91cd\u53e0\uff0c\u4e92\u4e0d\u4f9d\u8d56\uff0c\u53ef\u4ee5\u72ec\u7acb\u89e3\u51b3\u3002
    3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u539f\u95ee\u9898\u7684\u89e3\u901a\u8fc7\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\u5f97\u6765\u3002

    \u663e\u7136\uff0c\u5f52\u5e76\u6392\u5e8f\u6ee1\u8db3\u4ee5\u4e0a\u4e09\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

    1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u9012\u5f52\u5730\u5c06\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\u3002
    2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u53ef\u4ee5\u72ec\u7acb\u5730\u8fdb\u884c\u6392\u5e8f\uff08\u5b50\u95ee\u9898\u53ef\u4ee5\u72ec\u7acb\u8fdb\u884c\u6c42\u89e3\uff09\u3002
    3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e24\u4e2a\u6709\u5e8f\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002
    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u901a\u8fc7\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

    \u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\uff0c\u5f80\u5f80\u8fd8\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u76f8\u8f83\u4e8e\u9009\u62e9\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u4e3a\u5b83\u4eec\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

    \u90a3\u4e48\uff0c\u6211\u4eec\u4e0d\u7981\u53d1\u95ee\uff1a\u4e3a\u4ec0\u4e48\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c42\u903b\u8f91\u662f\u4ec0\u4e48\uff1f\u6362\u53e5\u8bdd\u8bf4\uff0c\u5c06\u5927\u95ee\u9898\u5206\u89e3\u4e3a\u591a\u4e2a\u5b50\u95ee\u9898\u3001\u89e3\u51b3\u5b50\u95ee\u9898\u3001\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u5408\u5e76\u4e3a\u539f\u95ee\u9898\u7684\u89e3\uff0c\u8fd9\u51e0\u6b65\u7684\u6548\u7387\u4e3a\u4ec0\u4e48\u6bd4\u76f4\u63a5\u89e3\u51b3\u539f\u95ee\u9898\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u8fd9\u4e2a\u95ee\u9898\u53ef\u4ee5\u4ece\u64cd\u4f5c\u6570\u91cf\u548c\u5e76\u884c\u8ba1\u7b97\u4e24\u65b9\u9762\u6765\u8ba8\u8bba\u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6570\u91cf\u4f18\u5316","text":"

    \u4ee5\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u4e3a\u4f8b\uff0c\u5176\u5904\u7406\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u9700\u8981 \\(O(n^2)\\) \u65f6\u95f4\u3002\u5047\u8bbe\u6211\u4eec\u6309\u7167\u56fe 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u5219\u5212\u5206\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6bcf\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O((n / 2)^2)\\) \u65f6\u95f4\uff0c\u5408\u5e76\u4e24\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

    \\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

    \u56fe 12-2 \u00a0 \u5212\u5206\u6570\u7ec4\u524d\u540e\u7684\u5192\u6ce1\u6392\u5e8f

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u8ba1\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u8fb9\u548c\u53f3\u8fb9\u5206\u522b\u4e3a\u5212\u5206\u524d\u548c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u603b\u6570\uff1a

    \\[ \\begin{aligned} n^2 & > \\frac{n^2}{2} + 2n \\newline n^2 - \\frac{n^2}{2} - 2n & > 0 \\newline n(n - 4) & > 0 \\end{aligned} \\]

    \u8fd9\u610f\u5473\u7740\u5f53 \\(n > 4\\) \u65f6\uff0c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u6570\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u5e94\u8be5\u66f4\u9ad8\u3002\u8bf7\u6ce8\u610f\uff0c\u5212\u5206\u540e\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u9636 \\(O(n^2)\\) \uff0c\u53ea\u662f\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\u4e86\u3002

    \u8fdb\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u4eec\u628a\u5b50\u6570\u7ec4\u4e0d\u65ad\u5730\u518d\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u505c\u6b62\u5212\u5206\u5462\uff1f\u8fd9\u79cd\u601d\u8def\u5b9e\u9645\u4e0a\u5c31\u662f\u201c\u5f52\u5e76\u6392\u5e8f\u201d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    \u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u4eec\u591a\u8bbe\u7f6e\u51e0\u4e2a\u5212\u5206\u70b9\uff0c\u5c06\u539f\u6570\u7ec4\u5e73\u5747\u5212\u5206\u4e3a \\(k\\) \u4e2a\u5b50\u6570\u7ec4\u5462\uff1f\u8fd9\u79cd\u60c5\u51b5\u4e0e\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u7c7b\u4f3c\uff0c\u5b83\u975e\u5e38\u9002\u5408\u6392\u5e8f\u6d77\u91cf\u6570\u636e\uff0c\u7406\u8bba\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230 \\(O(n + k)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e76\u884c\u8ba1\u7b97\u4f18\u5316","text":"

    \u6211\u4eec\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u5e76\u884c\u89e3\u51b3\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8fd8\u6709\u5229\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002

    \u5e76\u884c\u4f18\u5316\u5728\u591a\u6838\u6216\u591a\u5904\u7406\u5668\u7684\u73af\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u4e3a\u7cfb\u7edf\u53ef\u4ee5\u540c\u65f6\u5904\u7406\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8ba1\u7b97\u8d44\u6e90\uff0c\u4ece\u800c\u663e\u8457\u51cf\u5c11\u603b\u4f53\u7684\u8fd0\u884c\u65f6\u95f4\u3002

    \u6bd4\u5982\u5728\u56fe 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u4eec\u5c06\u6d77\u91cf\u7684\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u5219\u53ef\u5c06\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52a1\u5206\u6563\u5230\u5404\u4e2a\u8ba1\u7b97\u5355\u5143\uff0c\u5b8c\u6210\u540e\u518d\u5408\u5e76\u7ed3\u679c\u3002

    \u56fe 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e76\u884c\u8ba1\u7b97

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u89c1\u5e94\u7528","text":"

    \u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u6765\u89e3\u51b3\u8bb8\u591a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\u3002

    • \u5bfb\u627e\u6700\u8fd1\u70b9\u5bf9\uff1a\u8be5\u7b97\u6cd5\u9996\u5148\u5c06\u70b9\u96c6\u5206\u6210\u4e24\u90e8\u5206\uff0c\u7136\u540e\u5206\u522b\u627e\u51fa\u4e24\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u70b9\u5bf9\uff0c\u6700\u540e\u627e\u51fa\u8de8\u8d8a\u4e24\u90e8\u5206\u7684\u6700\u8fd1\u70b9\u5bf9\u3002
    • \u5927\u6574\u6570\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u6574\u6570\u4e58\u6cd5\u5206\u89e3\u4e3a\u51e0\u4e2a\u8f83\u5c0f\u7684\u6574\u6570\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u77e9\u9635\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u77e9\u9635\u4e58\u6cd5\u5206\u89e3\u4e3a\u591a\u4e2a\u5c0f\u77e9\u9635\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u6c49\u8bfa\u5854\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u89e3\u51b3\uff0c\u8fd9\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u5e94\u7528\u3002
    • \u6c42\u89e3\u9006\u5e8f\u5bf9\uff1a\u5728\u4e00\u4e2a\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6570\u5b57\u5927\u4e8e\u540e\u9762\u7684\u6570\u5b57\uff0c\u90a3\u4e48\u8fd9\u4e24\u4e2a\u6570\u5b57\u6784\u6210\u4e00\u4e2a\u9006\u5e8f\u5bf9\u3002\u6c42\u89e3\u9006\u5e8f\u5bf9\u95ee\u9898\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u501f\u52a9\u5f52\u5e76\u6392\u5e8f\u8fdb\u884c\u6c42\u89e3\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u8bbe\u8ba1\u4e2d\u5e94\u7528\u5f97\u975e\u5e38\u5e7f\u6cdb\u3002

    • \u4e8c\u5206\u67e5\u627e\uff1a\u4e8c\u5206\u67e5\u627e\u662f\u5c06\u6709\u5e8f\u6570\u7ec4\u4ece\u4e2d\u70b9\u7d22\u5f15\u5904\u5206\u4e3a\u4e24\u90e8\u5206\uff0c\u7136\u540e\u6839\u636e\u76ee\u6807\u503c\u4e0e\u4e2d\u95f4\u5143\u7d20\u503c\u6bd4\u8f83\u7ed3\u679c\uff0c\u51b3\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u533a\u95f4\uff0c\u5e76\u5728\u5269\u4f59\u533a\u95f4\u6267\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
    • \u5f52\u5e76\u6392\u5e8f\uff1a\u672c\u8282\u5f00\u5934\u5df2\u4ecb\u7ecd\uff0c\u4e0d\u518d\u8d58\u8ff0\u3002
    • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9009\u53d6\u4e00\u4e2a\u57fa\u51c6\u503c\uff0c\u7136\u540e\u628a\u6570\u7ec4\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5927\uff0c\u518d\u5bf9\u8fd9\u4e24\u90e8\u5206\u8fdb\u884c\u76f8\u540c\u7684\u5212\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e0b\u4e00\u4e2a\u5143\u7d20\u3002
    • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c06\u6570\u636e\u5206\u6563\u5230\u591a\u4e2a\u6876\uff0c\u7136\u540e\u5bf9\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u5404\u4e2a\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u4ece\u800c\u5f97\u5230\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002
    • \u6811\uff1a\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u7ea2\u9ed1\u6811\u3001B \u6811\u3001B+ \u6811\u7b49\uff0c\u5b83\u4eec\u7684\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u89c6\u4e3a\u5206\u6cbb\u7b56\u7565\u7684\u5e94\u7528\u3002
    • \u5806\uff1a\u5806\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u5176\u5404\u79cd\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u5220\u9664\u548c\u5806\u5316\uff0c\u5b9e\u9645\u4e0a\u90fd\u9690\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
    • \u54c8\u5e0c\u8868\uff1a\u867d\u7136\u54c8\u5e0c\u8868\u5e76\u4e0d\u76f4\u63a5\u5e94\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u54c8\u5e0c\u51b2\u7a81\u89e3\u51b3\u65b9\u6848\u95f4\u63a5\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u94fe\u5f0f\u5730\u5740\u4e2d\u7684\u957f\u94fe\u8868\u4f1a\u88ab\u8f6c\u5316\u4e3a\u7ea2\u9ed1\u6811\uff0c\u4ee5\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002

    \u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u79cd\u201c\u6da6\u7269\u7ec6\u65e0\u58f0\u201d\u7684\u7b97\u6cd5\u601d\u60f3\uff0c\u9690\u542b\u5728\u5404\u79cd\u7b97\u6cd5\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u4e2d\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898","text":"

    \u5728\u5f52\u5e76\u6392\u5e8f\u548c\u6784\u5efa\u4e8c\u53c9\u6811\u4e2d\uff0c\u6211\u4eec\u90fd\u662f\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a\u539f\u95ee\u9898\u4e00\u534a\u7684\u5b50\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u6c49\u8bfa\u5854\u95ee\u9898\uff0c\u6211\u4eec\u91c7\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

    Question

    \u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8bb0\u4e3a A\u3001B \u548c C \u3002\u8d77\u59cb\u72b6\u6001\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u7740 \\(n\\) \u4e2a\u5706\u76d8\uff0c\u5b83\u4eec\u4ece\u4e0a\u5230\u4e0b\u6309\u7167\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u3002\u6211\u4eec\u7684\u4efb\u52a1\u662f\u8981\u628a\u8fd9 \\(n\\) \u4e2a\u5706\u76d8\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u5e76\u4fdd\u6301\u5b83\u4eec\u7684\u539f\u6709\u987a\u5e8f\u4e0d\u53d8\uff08\u5982\u56fe 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52a8\u5706\u76d8\u7684\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u89c4\u5219\u3002

    1. \u5706\u76d8\u53ea\u80fd\u4ece\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u62ff\u51fa\uff0c\u4ece\u53e6\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u653e\u5165\u3002
    2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\u3002
    3. \u5c0f\u5706\u76d8\u5fc5\u987b\u65f6\u523b\u4f4d\u4e8e\u5927\u5706\u76d8\u4e4b\u4e0a\u3002

    \u56fe 12-10 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u793a\u4f8b

    \u6211\u4eec\u5c06\u89c4\u6a21\u4e3a \\(i\\) \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u8bb0\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c06 \\(3\\) \u4e2a\u5706\u76d8\u4ece A \u79fb\u52a8\u81f3 C \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u8651\u57fa\u672c\u60c5\u51b5","text":"

    \u5982\u56fe 12-11 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(1)\\) \uff0c\u5373\u5f53\u53ea\u6709\u4e00\u4e2a\u5706\u76d8\u65f6\uff0c\u6211\u4eec\u5c06\u5b83\u76f4\u63a5\u4ece A \u79fb\u52a8\u81f3 C \u5373\u53ef\u3002

    <1><2>

    \u56fe 12-11 \u00a0 \u89c4\u6a21\u4e3a 1 \u7684\u95ee\u9898\u7684\u89e3

    \u5982\u56fe 12-12 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(2)\\) \uff0c\u5373\u5f53\u6709\u4e24\u4e2a\u5706\u76d8\u65f6\uff0c\u7531\u4e8e\u8981\u65f6\u523b\u6ee1\u8db3\u5c0f\u5706\u76d8\u5728\u5927\u5706\u76d8\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u501f\u52a9 B \u6765\u5b8c\u6210\u79fb\u52a8\u3002

    1. \u5148\u5c06\u4e0a\u9762\u7684\u5c0f\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
    2. \u518d\u5c06\u5927\u5706\u76d8\u4ece A \u79fb\u81f3 C \u3002
    3. \u6700\u540e\u5c06\u5c0f\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u56fe 12-12 \u00a0 \u89c4\u6a21\u4e3a 2 \u7684\u95ee\u9898\u7684\u89e3

    \u89e3\u51b3\u95ee\u9898 \\(f(2)\\) \u7684\u8fc7\u7a0b\u53ef\u603b\u7ed3\u4e3a\uff1a\u5c06\u4e24\u4e2a\u5706\u76d8\u501f\u52a9 B \u4ece A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u79f0\u4e3a\u76ee\u6807\u67f1\u3001B \u79f0\u4e3a\u7f13\u51b2\u67f1\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u95ee\u9898\u5206\u89e3","text":"

    \u5bf9\u4e8e\u95ee\u9898 \\(f(3)\\) \uff0c\u5373\u5f53\u6709\u4e09\u4e2a\u5706\u76d8\u65f6\uff0c\u60c5\u51b5\u53d8\u5f97\u7a0d\u5fae\u590d\u6742\u4e86\u4e00\u4e9b\u3002

    \u56e0\u4e3a\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ece\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c06 A \u9876\u90e8\u7684\u4e24\u4e2a\u5706\u76d8\u770b\u4f5c\u4e00\u4e2a\u6574\u4f53\uff0c\u6267\u884c\u56fe 12-13 \u6240\u793a\u7684\u6b65\u9aa4\u3002\u8fd9\u6837\u4e09\u4e2a\u5706\u76d8\u5c31\u88ab\u987a\u5229\u5730\u4ece A \u79fb\u81f3 C \u4e86\u3002

    1. \u4ee4 B \u4e3a\u76ee\u6807\u67f1\u3001C \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
    2. \u5c06 A \u4e2d\u5269\u4f59\u7684\u4e00\u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u52a8\u81f3 C \u3002
    3. \u4ee4 C \u4e3a\u76ee\u6807\u67f1\u3001A \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u56fe 12-13 \u00a0 \u89c4\u6a21\u4e3a 3 \u7684\u95ee\u9898\u7684\u89e3

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u5c06\u95ee\u9898 \\(f(3)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(2)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u4e4b\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002\u8fd9\u8bf4\u660e\u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u5e76\u3002

    \u81f3\u6b64\uff0c\u6211\u4eec\u53ef\u603b\u7ed3\u51fa\u56fe 12-14 \u6240\u793a\u7684\u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c06\u539f\u95ee\u9898 \\(f(n)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \uff0c\u5e76\u6309\u7167\u4ee5\u4e0b\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u3002

    1. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 C \u4ece A \u79fb\u81f3 B \u3002
    2. \u5c06\u5269\u4f59 \\(1\\) \u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u81f3 C \u3002
    3. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 A \u4ece B \u79fb\u81f3 C \u3002

    \u5bf9\u4e8e\u8fd9\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u901a\u8fc7\u76f8\u540c\u7684\u65b9\u5f0f\u8fdb\u884c\u9012\u5f52\u5212\u5206\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52a8\u64cd\u4f5c\u5373\u53ef\u3002

    \u56fe 12-14 \u00a0 \u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c06\u67f1 src \u9876\u90e8\u7684 \\(i\\) \u4e2a\u5706\u76d8\u501f\u52a9\u7f13\u51b2\u67f1 buf \u79fb\u52a8\u81f3\u76ee\u6807\u67f1 tar \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
    def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\"\"\"\n    # \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan = src.pop()\n    # \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n\ndef solve_hanota(A: list[int], B: list[int], C: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898\"\"\"\n    n = len(A)\n    # \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
    hanota.cpp
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src.back();\n    src.pop_back();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.java
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.cs
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
    hanota.go
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src, tar *list.List) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan := src.Back()\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9876\u90e8\u5706\u76d8\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
    hanota.swift
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.popLast()!\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u5217\u8868\u5c3e\u90e8\u662f\u67f1\u5b50\u9876\u90e8\n    // \u5c06 src \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
    hanota.js
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src, tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.ts
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src: number[], tar: number[]): void {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.dart
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<int> src, List<int> tar) {\n  // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n  int pan = src.removeLast();\n  // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
    hanota.rs
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.pop().unwrap();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.c
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
    hanota.kt
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    val pan = src.removeAt(src.size - 1)\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
    hanota.rb
    ### \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 ###\ndef move(src, tar)\n  # \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n  pan = src.pop\n  # \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n  tar << pan\nend\n\n### \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) ###\ndef dfs(i, src, buf, tar)\n  # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n  if i == 1\n    move(src, tar)\n    return\n  end\n\n  # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf)\n  # \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n  move(src, tar)\n  # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar)\nend\n\n### \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 ###\ndef solve_hanota(_A, _B, _C)\n  n = _A.length\n  # \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n  dfs(n, _A, _B, _C)\nend\n
    hanota.zig
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 12-15 \u6240\u793a\uff0c\u6c49\u8bfa\u5854\u95ee\u9898\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5bf9\u5e94\u4e00\u4e2a\u5f00\u542f\u7684 dfs() \u51fd\u6570\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    \u56fe 12-15 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u7684\u9012\u5f52\u6811

    Quote

    \u6c49\u8bfa\u5854\u95ee\u9898\u6e90\u81ea\u4e00\u4e2a\u53e4\u8001\u7684\u4f20\u8bf4\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u4e2a\u5bfa\u5e99\u91cc\uff0c\u50e7\u4fa3\u4eec\u6709\u4e09\u6839\u9ad8\u5927\u7684\u94bb\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u4e2a\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5706\u76d8\u3002\u50e7\u4fa3\u4eec\u4e0d\u65ad\u5730\u79fb\u52a8\u5706\u76d8\uff0c\u4ed6\u4eec\u76f8\u4fe1\u5728\u6700\u540e\u4e00\u4e2a\u5706\u76d8\u88ab\u6b63\u786e\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u8fd9\u4e2a\u4e16\u754c\u5c31\u4f1a\u7ed3\u675f\u3002

    \u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fa3\u4eec\u6bcf\u79d2\u949f\u79fb\u52a8\u4e00\u6b21\uff0c\u603b\u5171\u9700\u8981\u5927\u7ea6 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7ea6 \\(5850\\) \u4ebf\u5e74\uff0c\u8fdc\u8fdc\u8d85\u8fc7\u4e86\u73b0\u5728\u5bf9\u5b87\u5b99\u5e74\u9f84\u7684\u4f30\u8ba1\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u8fd9\u4e2a\u4f20\u8bf4\u662f\u771f\u7684\uff0c\u6211\u4eec\u5e94\u8be5\u4e0d\u9700\u8981\u62c5\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u6765\u3002

    "},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7ed3","text":"
    • \u5206\u6cbb\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u7b97\u6cd5\u8bbe\u8ba1\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5212\u5206\uff09\u548c\u6cbb\uff08\u5408\u5e76\uff09\u4e24\u4e2a\u9636\u6bb5\uff0c\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002
    • \u5224\u65ad\u662f\u5426\u662f\u5206\u6cbb\u7b97\u6cd5\u95ee\u9898\u7684\u4f9d\u636e\u5305\u62ec\uff1a\u95ee\u9898\u80fd\u5426\u5206\u89e3\u3001\u5b50\u95ee\u9898\u662f\u5426\u72ec\u7acb\u3001\u5b50\u95ee\u9898\u80fd\u5426\u5408\u5e76\u3002
    • \u5f52\u5e76\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\uff0c\u5176\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u7b49\u957f\u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u5f00\u59cb\u9010\u5c42\u5408\u5e76\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002
    • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u51cf\u5c11\u4e86\u64cd\u4f5c\u6570\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u540e\u6709\u5229\u4e8e\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002
    • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u51b3\u8bb8\u591a\u7b97\u6cd5\u95ee\u9898\uff0c\u4e5f\u5e7f\u6cdb\u5e94\u7528\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u5904\u5904\u53ef\u89c1\u5176\u8eab\u5f71\u3002
    • \u76f8\u8f83\u4e8e\u66b4\u529b\u641c\u7d22\uff0c\u81ea\u9002\u5e94\u641c\u7d22\u6548\u7387\u66f4\u9ad8\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\u3002
    • \u4e8c\u5206\u67e5\u627e\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u4e2a\u5178\u578b\u5e94\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u7684\u6b65\u9aa4\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e\u3002
    • \u5728\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u95ee\u9898\u4e2d\uff0c\u6784\u5efa\u6811\uff08\u539f\u95ee\u9898\uff09\u53ef\u4ee5\u5212\u5206\u4e3a\u6784\u5efa\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5212\u5206\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u7684\u7d22\u5f15\u533a\u95f4\u6765\u5b9e\u73b0\u3002
    • \u5728\u6c49\u8bfa\u5854\u95ee\u9898\u4e2d\uff0c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(n\\) \u7684\u95ee\u9898\u53ef\u4ee5\u5212\u5206\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a \\(n-1\\) \u7684\u5b50\u95ee\u9898\u548c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(1\\) \u7684\u5b50\u95ee\u9898\u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002
    "},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52a8\u6001\u89c4\u5212","text":"

    Abstract

    \u5c0f\u6eaa\u6c47\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u6c47\u5165\u5927\u6d77\u3002

    \u52a8\u6001\u89c4\u5212\u5c06\u5c0f\u95ee\u9898\u7684\u89e3\u6c47\u96c6\u6210\u5927\u95ee\u9898\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9886\u6211\u4eec\u8d70\u5411\u89e3\u51b3\u95ee\u9898\u7684\u5f7c\u5cb8\u3002

    "},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212
    • 14.2 \u00a0 DP \u95ee\u9898\u7279\u6027
    • 14.3 \u00a0 DP \u89e3\u9898\u601d\u8def
    • 14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898
    • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898
    • 14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898
    • 14.7 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52a8\u6001\u89c4\u5212\u95ee\u9898\u7279\u6027","text":"

    \u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4e60\u4e86\u52a8\u6001\u89c4\u5212\u662f\u5982\u4f55\u901a\u8fc7\u5b50\u95ee\u9898\u5206\u89e3\u6765\u6c42\u89e3\u539f\u95ee\u9898\u7684\u3002\u5b9e\u9645\u4e0a\uff0c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u7684\u4fa7\u91cd\u70b9\u4e0d\u540c\u3002

    • \u5206\u6cbb\u7b97\u6cd5\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u591a\u4e2a\u76f8\u4e92\u72ec\u7acb\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u95ee\u9898\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6700\u7ec8\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
    • \u52a8\u6001\u89c4\u5212\u4e5f\u5bf9\u95ee\u9898\u8fdb\u884c\u9012\u5f52\u5206\u89e3\uff0c\u4f46\u4e0e\u5206\u6cbb\u7b97\u6cd5\u7684\u4e3b\u8981\u533a\u522b\u662f\uff0c\u52a8\u6001\u89c4\u5212\u4e2d\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u4f9d\u8d56\u7684\uff0c\u5728\u5206\u89e3\u8fc7\u7a0b\u4e2d\u4f1a\u51fa\u73b0\u8bb8\u591a\u91cd\u53e0\u5b50\u95ee\u9898\u3002
    • \u56de\u6eaf\u7b97\u6cd5\u5728\u5c1d\u8bd5\u548c\u56de\u9000\u4e2d\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u5e76\u901a\u8fc7\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\u3002\u539f\u95ee\u9898\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\u6784\u6210\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6bcf\u4e2a\u51b3\u7b56\u6b65\u9aa4\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u4e2a\u5b50\u95ee\u9898\u3002

    \u5b9e\u9645\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u5e38\u7528\u6765\u6c42\u89e3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5b83\u4eec\u4e0d\u4ec5\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u8fd8\u5177\u6709\u53e6\u5916\u4e24\u5927\u7279\u6027\uff1a\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784","text":"

    \u6211\u4eec\u5bf9\u722c\u697c\u68af\u95ee\u9898\u7a0d\u4f5c\u6539\u52a8\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9002\u5408\u5c55\u793a\u6700\u4f18\u5b50\u7ed3\u6784\u6982\u5ff5\u3002

    \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7

    \u7ed9\u5b9a\u4e00\u4e2a\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u6bcf\u4e00\u9636\u697c\u68af\u4e0a\u90fd\u8d34\u6709\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u4f60\u5728\u8be5\u53f0\u9636\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\u3002\u7ed9\u5b9a\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\u6570\u7ec4 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u4e2a\u53f0\u9636\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\\(cost[0]\\) \u4e3a\u5730\u9762\uff08\u8d77\u59cb\u70b9\uff09\u3002\u8bf7\u8ba1\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u4ef7\u624d\u80fd\u5230\u8fbe\u9876\u90e8\uff1f

    \u5982\u56fe 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9636\u7684\u4ee3\u4ef7\u5206\u522b\u4e3a \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5219\u4ece\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7\u4e3a \\(2\\) \u3002

    \u56fe 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7

    \u8bbe \\(dp[i]\\) \u4e3a\u722c\u5230\u7b2c \\(i\\) \u9636\u7d2f\u8ba1\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\u7531\u4e8e\u7b2c \\(i\\) \u9636\u53ea\u53ef\u80fd\u4ece \\(i - 1\\) \u9636\u6216 \\(i - 2\\) \u9636\u8d70\u6765\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u4e8e \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u4e3a\u4e86\u5c3d\u53ef\u80fd\u51cf\u5c11\u4ee3\u4ef7\uff0c\u6211\u4eec\u5e94\u8be5\u9009\u62e9\u4e24\u8005\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\uff1a

    \\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

    \u8fd9\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u542b\u4e49\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u662f\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\u7684\u3002

    \u672c\u9898\u663e\u7136\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6211\u4eec\u4ece\u4e24\u4e2a\u5b50\u95ee\u9898\u6700\u4f18\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9009\u51fa\u8f83\u4f18\u7684\u90a3\u4e00\u4e2a\uff0c\u5e76\u7528\u5b83\u6784\u5efa\u51fa\u539f\u95ee\u9898 \\(dp[i]\\) \u7684\u6700\u4f18\u89e3\u3002

    \u90a3\u4e48\uff0c\u4e0a\u4e00\u8282\u7684\u722c\u697c\u68af\u9898\u76ee\u6709\u6ca1\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u5462\uff1f\u5b83\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u4e2a\u8ba1\u6570\u95ee\u9898\uff0c\u4f46\u5982\u679c\u6362\u4e00\u79cd\u95ee\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6570\u91cf\u201d\u3002\u6211\u4eec\u610f\u5916\u5730\u53d1\u73b0\uff0c\u867d\u7136\u9898\u76ee\u4fee\u6539\u524d\u540e\u662f\u7b49\u4ef7\u7684\uff0c\u4f46\u6700\u4f18\u5b50\u7ed3\u6784\u6d6e\u73b0\u51fa\u6765\u4e86\uff1a\u7b2c \\(n\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u7b49\u4e8e\u7b2c \\(n-1\\) \u9636\u548c\u7b2c \\(n-2\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8bf4\uff0c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u89e3\u91ca\u65b9\u5f0f\u6bd4\u8f83\u7075\u6d3b\uff0c\u5728\u4e0d\u540c\u95ee\u9898\u4e2d\u4f1a\u6709\u4e0d\u540c\u7684\u542b\u4e49\u3002

    \u6839\u636e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72b6\u6001 \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f97\u5230\u52a8\u6001\u89c4\u5212\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    return dp[n]\n
    min_cost_climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.java
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDP(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.go
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.js
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n  }\n  return dp[n];\n}\n
    min_cost_climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    dp[n]\n}\n
    min_cost_climbing_stairs_dp.c
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    int res = dp[n];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDP(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1, 0)\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1], dp[2] = cost[1], cost[2]\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDP(comptime cost: []i32) i32 {\n    comptime var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = @min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\u3002

    \u56fe 14-7 \u00a0 \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u672c\u9898\u4e5f\u53ef\u4ee5\u8fdb\u884c\u7a7a\u95f4\u4f18\u5316\uff0c\u5c06\u4e00\u7ef4\u538b\u7f29\u81f3\u96f6\u7ef4\uff0c\u4f7f\u5f97\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    a, b = cost[1], cost[2]\n    for i in range(3, n + 1):\n        a, b = b, min(a, b) + cost[i]\n    return b\n
    min_cost_climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.java
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.Min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.go
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        tmp := b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    var (a, b) = (cost[1], cost[2])\n    for i in 3 ... n {\n        (a, b) = (b, min(a, b) + cost[i])\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.js
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  int a = cost[1], b = cost[2];\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = min(a, tmp) + cost[i];\n    a = tmp;\n  }\n  return b;\n}\n
    min_cost_climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    };\n    let (mut a, mut b) = (cost[1], cost[2]);\n    for i in 3..=n {\n        let tmp = b;\n        b = cmp::min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    b\n}\n
    min_cost_climbing_stairs_dp.c
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = myMin(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDPComp(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    var a = cost[1]\n    var b = cost[2]\n    for (i in 3..n) {\n        val tmp = b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1, 0)\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1], dp[2] = cost[1], cost[2]\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n\n# \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\ndef min_cost_climbing_stairs_dp_comp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  a, b = cost[1], cost[2]\n  (3...(n + 1)).each { |i| a, b = b, [a, b].min + cost[i] }\n  b\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDPComp(cost: []i32) i32 {\n    var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    var a = cost[1];\n    var b = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        var tmp = b;\n        b = @min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u65e0\u540e\u6548\u6027","text":"

    \u65e0\u540e\u6548\u6027\u662f\u52a8\u6001\u89c4\u5212\u80fd\u591f\u6709\u6548\u89e3\u51b3\u95ee\u9898\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u4e49\u4e3a\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u786e\u5b9a\u7684\u72b6\u6001\uff0c\u5b83\u7684\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u5f53\u524d\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002

    \u4ee5\u722c\u697c\u68af\u95ee\u9898\u4e3a\u4f8b\uff0c\u7ed9\u5b9a\u72b6\u6001 \\(i\\) \uff0c\u5b83\u4f1a\u53d1\u5c55\u51fa\u72b6\u6001 \\(i+1\\) \u548c\u72b6\u6001 \\(i+2\\) \uff0c\u5206\u522b\u5bf9\u5e94\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u8fd9\u4e24\u79cd\u9009\u62e9\u65f6\uff0c\u6211\u4eec\u65e0\u987b\u8003\u8651\u72b6\u6001 \\(i\\) \u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5b83\u4eec\u5bf9\u72b6\u6001 \\(i\\) \u7684\u672a\u6765\u6ca1\u6709\u5f71\u54cd\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u7ed9\u722c\u697c\u68af\u95ee\u9898\u6dfb\u52a0\u4e00\u4e2a\u7ea6\u675f\uff0c\u60c5\u51b5\u5c31\u4e0d\u4e00\u6837\u4e86\u3002

    \u5e26\u7ea6\u675f\u722c\u697c\u68af

    \u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u4f46\u4e0d\u80fd\u8fde\u7eed\u4e24\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

    \u5982\u56fe 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u9636\u4ec5\u5269 \\(2\\) \u79cd\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u8fde\u7eed\u4e09\u6b21\u8df3 \\(1\\) \u9636\u7684\u65b9\u6848\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\uff0c\u56e0\u6b64\u88ab\u820d\u5f03\u3002

    \u56fe 14-8 \u00a0 \u5e26\u7ea6\u675f\u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

    \u5728\u8be5\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\uff0c\u90a3\u4e48\u4e0b\u4e00\u8f6e\u5c31\u5fc5\u987b\u8df3 \\(2\\) \u9636\u3002\u8fd9\u610f\u5473\u7740\uff0c\u4e0b\u4e00\u6b65\u9009\u62e9\u4e0d\u80fd\u7531\u5f53\u524d\u72b6\u6001\uff08\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u72ec\u7acb\u51b3\u5b9a\uff0c\u8fd8\u548c\u524d\u4e00\u4e2a\u72b6\u6001\uff08\u4e0a\u4e00\u8f6e\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u6709\u5173\u3002

    \u4e0d\u96be\u53d1\u73b0\uff0c\u6b64\u95ee\u9898\u5df2\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u4e3a \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8bb8\u591a\u201c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\u201d\u65b9\u6848\uff0c\u800c\u4e3a\u4e86\u6ee1\u8db3\u7ea6\u675f\uff0c\u6211\u4eec\u5c31\u4e0d\u80fd\u5c06 \\(dp[i-1]\\) \u76f4\u63a5\u8ba1\u5165 \\(dp[i]\\) \u4e2d\u3002

    \u4e3a\u6b64\uff0c\u6211\u4eec\u9700\u8981\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff1a\u72b6\u6001 \\([i, j]\\) \u8868\u793a\u5904\u5728\u7b2c \\(i\\) \u9636\u5e76\u4e14\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(j\\) \u9636\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72b6\u6001\u5b9a\u4e49\u6709\u6548\u5730\u533a\u5206\u4e86\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u8fd8\u662f \\(2\\) \u9636\uff0c\u6211\u4eec\u53ef\u4ee5\u636e\u6b64\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u4ece\u4f55\u800c\u6765\u7684\u3002

    • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ea\u80fd\u9009\u62e9\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u4ece \\(dp[i-1, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002
    • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(2\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ef\u9009\u62e9\u8df3 \\(1\\) \u9636\u6216\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u4ece \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002

    \u5982\u56fe 14-9 \u6240\u793a\uff0c\u5728\u8be5\u5b9a\u4e49\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u65b9\u6848\u6570\u3002\u6b64\u65f6\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

    \u56fe 14-9 \u00a0 \u8003\u8651\u7ea6\u675f\u4e0b\u7684\u9012\u63a8\u5173\u7cfb

    \u6700\u7ec8\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u4e24\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u9636\u7684\u65b9\u6848\u603b\u6570\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
    def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    return dp[n][1] + dp[n][2]\n
    climbing_stairs_constraint_dp.cpp
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.java
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.cs
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i, 1] = dp[i - 1, 2];\n        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];\n    }\n    return dp[n, 1] + dp[n, 2];\n}\n
    climbing_stairs_constraint_dp.go
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i][1] = dp[i-1][2]\n        dp[i][2] = dp[i-2][1] + dp[i-2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.swift
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.js
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.ts
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.dart
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i][1] = dp[i - 1][2];\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n  }\n  return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.rs
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_constraint_dp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return 1;\n    };\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.c
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(3, sizeof(int));\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    int res = dp[n][1] + dp[n][2];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    climbing_stairs_constraint_dp.kt
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.rb
    ### \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef climbing_stairs_constraint_dp(n)\n  return 1 if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1) { Array.new(3, 0) }\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1][1], dp[1][2] = 1, 0\n  dp[2][1], dp[2][2] = 0, 1\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for i in 3...(n + 1)\n    dp[i][1] = dp[i - 1][2]\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n  end\n\n  dp[n][1] + dp[n][2]\nend\n
    climbing_stairs_constraint_dp.zig
    // \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsConstraintDP(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u4e8e\u4ec5\u9700\u591a\u8003\u8651\u524d\u9762\u4e00\u4e2a\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff0c\u4f7f\u5f97\u95ee\u9898\u91cd\u65b0\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u95ee\u9898\u5177\u6709\u975e\u5e38\u4e25\u91cd\u7684\u201c\u6709\u540e\u6548\u6027\u201d\u3002

    \u722c\u697c\u68af\u4e0e\u969c\u788d\u751f\u6210

    \u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\u3002\u89c4\u5b9a\u5f53\u722c\u5230\u7b2c \\(i\\) \u9636\u65f6\uff0c\u7cfb\u7edf\u81ea\u52a8\u4f1a\u5728\u7b2c \\(2i\\) \u9636\u4e0a\u653e\u4e0a\u969c\u788d\u7269\uff0c\u4e4b\u540e\u6240\u6709\u8f6e\u90fd\u4e0d\u5141\u8bb8\u8df3\u5230\u7b2c \\(2i\\) \u9636\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u4e24\u8f6e\u5206\u522b\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u9636\u4e0a\uff0c\u5219\u4e4b\u540e\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u9636\u4e0a\u3002\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

    \u5728\u8fd9\u4e2a\u95ee\u9898\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8dc3\u4f9d\u8d56\u8fc7\u53bb\u6240\u6709\u7684\u72b6\u6001\uff0c\u56e0\u4e3a\u6bcf\u4e00\u6b21\u8df3\u8dc3\u90fd\u4f1a\u5728\u66f4\u9ad8\u7684\u9636\u68af\u4e0a\u8bbe\u7f6e\u969c\u788d\uff0c\u5e76\u5f71\u54cd\u672a\u6765\u7684\u8df3\u8dc3\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u52a8\u6001\u89c4\u5212\u5f80\u5f80\u96be\u4ee5\u89e3\u51b3\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u590d\u6742\u7684\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff08\u4f8b\u5982\u65c5\u884c\u5546\u95ee\u9898\uff09\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u542f\u53d1\u5f0f\u641c\u7d22\u3001\u9057\u4f20\u7b97\u6cd5\u3001\u5f3a\u5316\u5b66\u4e60\u7b49\uff0c\u4ece\u800c\u5728\u6709\u9650\u65f6\u95f4\u5185\u5f97\u5230\u53ef\u7528\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52a8\u6001\u89c4\u5212\u89e3\u9898\u601d\u8def","text":"

    \u4e0a\u4e24\u8282\u4ecb\u7ecd\u4e86\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4e3b\u8981\u7279\u5f81\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u4e00\u8d77\u63a2\u7a76\u4e24\u4e2a\u66f4\u52a0\u5b9e\u7528\u7684\u95ee\u9898\u3002

    1. \u5982\u4f55\u5224\u65ad\u4e00\u4e2a\u95ee\u9898\u662f\u4e0d\u662f\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff1f
    2. \u6c42\u89e3\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8be5\u4ece\u4f55\u5904\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9aa4\u662f\u4ec0\u4e48\uff1f
    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u95ee\u9898\u5224\u65ad","text":"

    \u603b\u7684\u6765\u8bf4\uff0c\u5982\u679c\u4e00\u4e2a\u95ee\u9898\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u90a3\u4e48\u5b83\u901a\u5e38\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u4eec\u5f88\u96be\u4ece\u95ee\u9898\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u8fd9\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u653e\u5bbd\u6761\u4ef6\uff0c\u5148\u89c2\u5bdf\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7a77\u4e3e\uff09\u89e3\u51b3\u3002

    \u9002\u5408\u7528\u56de\u6eaf\u89e3\u51b3\u7684\u95ee\u9898\u901a\u5e38\u6ee1\u8db3\u201c\u51b3\u7b56\u6811\u6a21\u578b\u201d\uff0c\u8fd9\u79cd\u95ee\u9898\u53ef\u4ee5\u4f7f\u7528\u6811\u5f62\u7ed3\u6784\u6765\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\uff0c\u6bcf\u4e00\u6761\u8def\u5f84\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\u3002

    \u6362\u53e5\u8bdd\u8bf4\uff0c\u5982\u679c\u95ee\u9898\u5305\u542b\u660e\u786e\u7684\u51b3\u7b56\u6982\u5ff5\uff0c\u5e76\u4e14\u89e3\u662f\u901a\u8fc7\u4e00\u7cfb\u5217\u51b3\u7b56\u4ea7\u751f\u7684\uff0c\u90a3\u4e48\u5b83\u5c31\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u6765\u89e3\u51b3\u3002

    \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8fd8\u6709\u4e00\u4e9b\u5224\u65ad\u7684\u201c\u52a0\u5206\u9879\u201d\u3002

    • \u95ee\u9898\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u4f18\u5316\u63cf\u8ff0\u3002
    • \u95ee\u9898\u7684\u72b6\u6001\u80fd\u591f\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u3001\u591a\u7ef4\u77e9\u9635\u6216\u6811\u6765\u8868\u793a\uff0c\u5e76\u4e14\u4e00\u4e2a\u72b6\u6001\u4e0e\u5176\u5468\u56f4\u7684\u72b6\u6001\u5b58\u5728\u9012\u63a8\u5173\u7cfb\u3002

    \u76f8\u5e94\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u51cf\u5206\u9879\u201d\u3002

    • \u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u4f18\u89e3\u3002
    • \u95ee\u9898\u63cf\u8ff0\u4e2d\u6709\u660e\u663e\u7684\u6392\u5217\u7ec4\u5408\u7684\u7279\u5f81\uff0c\u9700\u8981\u8fd4\u56de\u5177\u4f53\u7684\u591a\u4e2a\u65b9\u6848\u3002

    \u5982\u679c\u4e00\u4e2a\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u5e76\u5177\u6709\u8f83\u4e3a\u660e\u663e\u7684\u201c\u52a0\u5206\u9879\u201d\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5047\u8bbe\u5b83\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff0c\u5e76\u5728\u6c42\u89e3\u8fc7\u7a0b\u4e2d\u9a8c\u8bc1\u5b83\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u95ee\u9898\u6c42\u89e3\u6b65\u9aa4","text":"

    \u52a8\u6001\u89c4\u5212\u7684\u89e3\u9898\u6d41\u7a0b\u4f1a\u56e0\u95ee\u9898\u7684\u6027\u8d28\u548c\u96be\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9aa4\uff1a\u63cf\u8ff0\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5bfc\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u7b49\u3002

    \u4e3a\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u9898\u6b65\u9aa4\uff0c\u6211\u4eec\u4f7f\u7528\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\u201c\u6700\u5c0f\u8def\u5f84\u548c\u201d\u6765\u4e3e\u4f8b\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a \\(n \\times m\\) \u7684\u4e8c\u7ef4\u7f51\u683c grid \uff0c\u7f51\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5305\u542b\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u8be5\u5355\u5143\u683c\u7684\u4ee3\u4ef7\u3002\u673a\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u5355\u5143\u683c\u4e3a\u8d77\u59cb\u70b9\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52a8\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u8fbe\u53f3\u4e0b\u89d2\u5355\u5143\u683c\u3002\u8bf7\u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f84\u548c\u3002

    \u56fe 14-10 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u7f51\u683c\u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e3a \\(13\\) \u3002

    \u56fe 14-10 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u793a\u4f8b\u6570\u636e

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u672c\u9898\u7684\u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u5c31\u662f\u4ece\u5f53\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8bbe\u5f53\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\([i, j]\\) \uff0c\u5219\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u540e\uff0c\u7d22\u5f15\u53d8\u4e3a \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72b6\u6001\u5e94\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u4e24\u4e2a\u53d8\u91cf\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

    \u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u4ece\u8d77\u59cb\u70b9 \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\uff0c\u89e3\u8bb0\u4e3a \\(dp[i, j]\\) \u3002

    \u81f3\u6b64\uff0c\u6211\u4eec\u5c31\u5f97\u5230\u4e86\u56fe 14-11 \u6240\u793a\u7684\u4e8c\u7ef4 \\(dp\\) \u77e9\u9635\uff0c\u5176\u5c3a\u5bf8\u4e0e\u8f93\u5165\u7f51\u683c \\(grid\\) \u76f8\u540c\u3002

    \u56fe 14-11 \u00a0 \u72b6\u6001\u5b9a\u4e49\u4e0e dp \u8868

    Note

    \u52a8\u6001\u89c4\u5212\u548c\u56de\u6eaf\u8fc7\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u4e3a\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\uff0c\u800c\u72b6\u6001\u7531\u6240\u6709\u51b3\u7b56\u53d8\u91cf\u6784\u6210\u3002\u5b83\u5e94\u5f53\u5305\u542b\u63cf\u8ff0\u89e3\u9898\u8fdb\u5ea6\u7684\u6240\u6709\u53d8\u91cf\uff0c\u5176\u5305\u542b\u4e86\u8db3\u591f\u7684\u4fe1\u606f\uff0c\u80fd\u591f\u7528\u6765\u63a8\u5bfc\u51fa\u4e0b\u4e00\u4e2a\u72b6\u6001\u3002

    \u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5b9a\u4e49\u4e00\u4e2a \\(dp\\) \u8868\u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u72b6\u6001\u7684\u6bcf\u4e2a\u72ec\u7acb\u53d8\u91cf\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\u3002\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72b6\u6001\u548c\u5b50\u95ee\u9898\u7684\u89e3\u4e4b\u95f4\u7684\u6620\u5c04\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u5bf9\u4e8e\u72b6\u6001 \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u4ece\u4e0a\u8fb9\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u8fb9\u683c\u5b50 \\([i, j-1]\\) \u8f6c\u79fb\u800c\u6765\u3002\u56e0\u6b64\u6700\u4f18\u5b50\u7ed3\u6784\u4e3a\uff1a\u5230\u8fbe \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e0e \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\u51b3\u5b9a\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u56fe 14-12 \u6240\u793a\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

    \\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

    \u56fe 14-12 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    Note

    \u6839\u636e\u5b9a\u4e49\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u95ee\u9898\u548c\u5b50\u95ee\u9898\u7684\u5173\u7cfb\uff0c\u627e\u51fa\u901a\u8fc7\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6765\u6784\u9020\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u4f18\u5b50\u7ed3\u6784\u3002

    \u4e00\u65e6\u6211\u4eec\u627e\u5230\u4e86\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5728\u672c\u9898\u4e2d\uff0c\u5904\u5728\u9996\u884c\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u5de6\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u5904\u5728\u9996\u5217\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u4e0a\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u8fb9\u754c\u6761\u4ef6\u3002

    \u5982\u56fe 14-13 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u6211\u4eec\u4f7f\u7528\u5faa\u73af\u6765\u904d\u5386\u77e9\u9635\uff0c\u5916\u5faa\u73af\u904d\u5386\u5404\u884c\uff0c\u5185\u5faa\u73af\u904d\u5386\u5404\u5217\u3002

    \u56fe 14-13 \u00a0 \u8fb9\u754c\u6761\u4ef6\u4e0e\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    Note

    \u8fb9\u754c\u6761\u4ef6\u5728\u52a8\u6001\u89c4\u5212\u4e2d\u7528\u4e8e\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u7d22\u4e2d\u7528\u4e8e\u526a\u679d\u3002

    \u72b6\u6001\u8f6c\u79fb\u987a\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8bc1\u5728\u8ba1\u7b97\u5f53\u524d\u95ee\u9898\u7684\u89e3\u65f6\uff0c\u6240\u6709\u5b83\u4f9d\u8d56\u7684\u66f4\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u90fd\u5df2\u7ecf\u88ab\u6b63\u786e\u5730\u8ba1\u7b97\u51fa\u6765\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u5df2\u7ecf\u53ef\u4ee5\u76f4\u63a5\u5199\u51fa\u52a8\u6001\u89c4\u5212\u4ee3\u7801\u3002\u7136\u800c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u7d22 \\(\\rightarrow\\) \u8bb0\u5fc6\u5316\u641c\u7d22 \\(\\rightarrow\\) \u52a8\u6001\u89c4\u5212\u201d\u7684\u987a\u5e8f\u5b9e\u73b0\u66f4\u52a0\u7b26\u5408\u601d\u7ef4\u4e60\u60ef\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

    \u4ece\u72b6\u6001 \\([i, j]\\) \u5f00\u59cb\u641c\u7d22\uff0c\u4e0d\u65ad\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u72b6\u6001 \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u9012\u5f52\u51fd\u6570\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, j]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u4ece \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c \\(dp[i, j]\\) \u3002
    • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53 \\(i = 0\\) \u4e14 \\(j = 0\\) \u65f6\uff0c\u8fd4\u56de\u4ee3\u4ef7 \\(grid[0, 0]\\) \u3002
    • \u526a\u679d\uff1a\u5f53 \\(i < 0\\) \u65f6\u6216 \\(j < 0\\) \u65f6\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u65f6\u8fd4\u56de\u4ee3\u4ef7 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.Min(left, up) + grid[i][j];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)\n    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  return min(left, up) + grid[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs(grid, i - 1, j);\n    let left = min_path_sum_dfs(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  return grid[i][j] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  return Float::INFINITY if i < 0 || j < 0\n  # \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  up = min_path_sum_dfs(grid, i - 1, j)\n  left = min_path_sum_dfs(grid, i, j - 1)\n  # \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  [left, up].min + grid[i][j]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-14 \u7ed9\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u4e3a\u6839\u8282\u70b9\u7684\u9012\u5f52\u6811\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5176\u6570\u91cf\u4f1a\u968f\u7740\u7f51\u683c grid \u7684\u5c3a\u5bf8\u53d8\u5927\u800c\u6025\u5267\u589e\u591a\u3002

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u539f\u56e0\u4e3a\uff1a\u5b58\u5728\u591a\u6761\u8def\u5f84\u53ef\u4ee5\u4ece\u5de6\u4e0a\u89d2\u5230\u8fbe\u67d0\u4e00\u5355\u5143\u683c\u3002

    \u56fe 14-14 \u00a0 \u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

    \u6bcf\u4e2a\u72b6\u6001\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u4e24\u79cd\u9009\u62e9\uff0c\u4ece\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u603b\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^{m + n})\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u79cd\u8ba1\u7b97\u65b9\u5f0f\u672a\u8003\u8651\u4e34\u8fd1\u7f51\u683c\u8fb9\u754c\u7684\u60c5\u51b5\uff0c\u5f53\u5230\u8fbe\u7f51\u7edc\u8fb9\u754c\u65f6\u53ea\u5269\u4e0b\u4e00\u79cd\u9009\u62e9\uff0c\u56e0\u6b64\u5b9e\u9645\u7684\u8def\u5f84\u6570\u91cf\u4f1a\u5c11\u4e00\u4e9b\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

    \u6211\u4eec\u5f15\u5165\u4e00\u4e2a\u548c\u7f51\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8bb0\u5fc6\u5217\u8868 mem \uff0c\u7528\u4e8e\u8bb0\u5f55\u5404\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u8fdb\u884c\u526a\u679d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dfs_mem(\n    grid: list[list[int]], mem: list[list[int]], i: int, j: int\n) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.Min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)\n    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i as usize][j as usize] != -1 {\n        return mem[i as usize][j as usize];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);\n    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];\n    mem[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef min_path_sum_dfs_mem(grid, mem, i, j)\n  # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  return grid[0][0] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  return Float::INFINITY if i < 0 || j < 0\n  # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return mem[i][j] if mem[i][j] != -1\n  # \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n  # \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  mem[i][j] = [left, up].min + grid[i][j]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] != -1) {\n        return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] = @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8bb0\u5fc6\u5316\u540e\uff0c\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u72b6\u6001\u603b\u6570\uff0c\u5373\u7f51\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

    \u56fe 14-15 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

    \u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * m for _ in range(n)]\n    dp[0][0] = grid[0][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n):\n        for j in range(1, m):\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n    return dp[n - 1][m - 1]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n, vector<int>(m));\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n][m];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDP(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n, m];\n    dp[0, 0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0, j] = dp[0, j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i, 0] = dp[i - 1, 0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1, m - 1];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n)\n    for i := 0; i < n; i++ {\n        dp[i] = make([]int, m)\n    }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        for j := 1; j < m; j++ {\n            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]\n        }\n    }\n    return dp[n-1][m-1]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ..< n {\n        for j in 1 ..< m {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j: number = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));\n  dp[0][0] = grid[0][0];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j < m; j++) {\n    dp[0][j] = dp[0][j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n  for (int i = 1; i < n; i++) {\n    dp[i][0] = dp[i - 1][0] + grid[i][0];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i < n; i++) {\n    for (int j = 1; j < m; j++) {\n      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n    }\n  }\n  return dp[n - 1][m - 1];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; m]; n];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..n {\n        for j in 1..m {\n            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    dp[n - 1][m - 1]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc(n * sizeof(int *));\n    for (int i = 0; i < n; i++) {\n        dp[i] = calloc(m, sizeof(int));\n    }\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    int res = dp[n - 1][m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i < n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDP(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n) { IntArray(m) }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..<n) {\n        for (j in 1..<m) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef min_path_sum_dp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n) { Array.new(m, 0) }\n  dp[0][0] = grid[0][0]\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n  (1...n).each { |i| dp[i][0] = dp[i - 1][0] + grid[i][0] }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for i in 1...n\n    for j in 1...m\n      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]\n    end\n  end\n  dp[n -1][m -1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\nfn minPathSumDP(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][m]i32{[_]i32{0} ** m} ** n;\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n) |i| {\n        for (1..m) |j| {\n            dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f84\u548c\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\uff0c\u5176\u904d\u5386\u4e86\u6574\u4e2a\u7f51\u683c\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

    \u6570\u7ec4 dp \u5927\u5c0f\u4e3a \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

    <1><2><3><4><5><6><7><8><9><10><11><12>

    \u56fe 14-16 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u53ea\u4e0e\u5176\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u683c\u5b50\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u53ea\u7528\u4e00\u4e2a\u5355\u884c\u6570\u7ec4\u6765\u5b9e\u73b0 \\(dp\\) \u8868\u3002

    \u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u6570\u7ec4 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72b6\u6001\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72b6\u6001\uff0c\u800c\u662f\u5728\u904d\u5386\u6bcf\u884c\u65f6\u66f4\u65b0\u5b83\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dp_comp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in range(1, m):\n        dp[j] = dp[j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m):\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n    return dp[m - 1]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDPComp(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    dp[0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j := 1; j < m; j++ {\n        dp[j] = dp[j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j < m; j++ {\n            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]\n        }\n    }\n    return dp[m-1]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in 1 ..< m {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ..< n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ..< m {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(m, 0);\n  dp[0] = grid[0][0];\n  for (int j = 1; j < m; j++) {\n    dp[j] = dp[j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j < m; j++) {\n      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n    }\n  }\n  return dp[m - 1];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for j in 1..m {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..m {\n            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    dp[m - 1]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(m, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    int res = dp[m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDPComp(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for (j in 1..<m) {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..<n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..<m) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef min_path_sum_dp_comp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(m, 0)\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  dp[0] = grid[0][0]\n  (1...m).each { |j| dp[j] = dp[j - 1] + grid[0][j] }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for i in 1...n\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    (1...m).each { |j| dp[j] = [dp[j - 1], dp[j]].min + grid[i][j] }\n  end\n  dp[m - 1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minPathSumDPComp(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** m;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (1..m) |j| {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        for (1..m) |j| {\n            dp[j] = @min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898","text":"

    \u7f16\u8f91\u8ddd\u79bb\uff0c\u4e5f\u79f0 Levenshtein \u8ddd\u79bb\uff0c\u6307\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u4e92\u76f8\u8f6c\u6362\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6570\uff0c\u901a\u5e38\u7528\u4e8e\u5728\u4fe1\u606f\u68c0\u7d22\u548c\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4e2d\u5ea6\u91cf\u4e24\u4e2a\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

    Question

    \u8f93\u5165\u4e24\u4e2a\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c06 \\(s\\) \u8f6c\u6362\u4e3a \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

    \u4f60\u53ef\u4ee5\u5728\u4e00\u4e2a\u5b57\u7b26\u4e32\u4e2d\u8fdb\u884c\u4e09\u79cd\u7f16\u8f91\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u4e2a\u5b57\u7b26\u3001\u5220\u9664\u4e00\u4e2a\u5b57\u7b26\u3001\u5c06\u5b57\u7b26\u66ff\u6362\u4e3a\u4efb\u610f\u4e00\u4e2a\u5b57\u7b26\u3002

    \u5982\u56fe 14-27 \u6240\u793a\uff0c\u5c06 kitten \u8f6c\u6362\u4e3a sitting \u9700\u8981\u7f16\u8f91 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u4e0e 1 \u6b21\u6dfb\u52a0\u64cd\u4f5c\uff1b\u5c06 hello \u8f6c\u6362\u4e3a algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u548c 1 \u6b21\u5220\u9664\u64cd\u4f5c\u3002

    \u56fe 14-27 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u793a\u4f8b\u6570\u636e

    \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u51b3\u7b56\u6811\u6a21\u578b\u6765\u89e3\u91ca\u3002\u5b57\u7b26\u4e32\u5bf9\u5e94\u6811\u8282\u70b9\uff0c\u4e00\u8f6e\u51b3\u7b56\uff08\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\uff09\u5bf9\u5e94\u6811\u7684\u4e00\u6761\u8fb9\u3002

    \u5982\u56fe 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u51b5\u4e0b\uff0c\u6bcf\u4e2a\u8282\u70b9\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8bb8\u591a\u6761\u8fb9\uff0c\u6bcf\u6761\u8fb9\u5bf9\u5e94\u4e00\u79cd\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u4ece hello \u8f6c\u6362\u5230 algo \u6709\u8bb8\u591a\u79cd\u53ef\u80fd\u7684\u8def\u5f84\u3002

    \u4ece\u51b3\u7b56\u6811\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u8282\u70b9 hello \u548c\u8282\u70b9 algo \u4e4b\u95f4\u7684\u6700\u77ed\u8def\u5f84\u3002

    \u56fe 14-28 \u00a0 \u57fa\u4e8e\u51b3\u7b56\u6811\u6a21\u578b\u8868\u793a\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u662f\u5bf9\u5b57\u7b26\u4e32 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\u3002

    \u6211\u4eec\u5e0c\u671b\u5728\u7f16\u8f91\u64cd\u4f5c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u95ee\u9898\u7684\u89c4\u6a21\u9010\u6e10\u7f29\u5c0f\uff0c\u8fd9\u6837\u624d\u80fd\u6784\u5efa\u5b50\u95ee\u9898\u3002\u8bbe\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \uff0c\u6211\u4eec\u5148\u8003\u8651\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u4eec\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u76f4\u63a5\u8003\u8651 \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u4eec\u9700\u8981\u5bf9 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\uff08\u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\uff09\uff0c\u4f7f\u5f97\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26\u76f8\u540c\uff0c\u4ece\u800c\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u8003\u8651\u89c4\u6a21\u66f4\u5c0f\u7684\u95ee\u9898\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u5728\u5b57\u7b26\u4e32 \\(s\\) \u4e2d\u8fdb\u884c\u7684\u6bcf\u4e00\u8f6e\u51b3\u7b56\uff08\u7f16\u8f91\u64cd\u4f5c\uff09\uff0c\u90fd\u4f1a\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u4f59\u7684\u5f85\u5339\u914d\u5b57\u7b26\u53d1\u751f\u53d8\u5316\u3002\u56e0\u6b64\uff0c\u72b6\u6001\u4e3a\u5f53\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u8651\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u4e2a\u5b57\u7b26\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

    \u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\uff1a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

    \u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u8003\u8651\u5b50\u95ee\u9898 \\(dp[i, j]\\) \uff0c\u5176\u5bf9\u5e94\u7684\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5c3e\u90e8\u5b57\u7b26\u4e3a \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u636e\u4e0d\u540c\u7f16\u8f91\u64cd\u4f5c\u5206\u4e3a\u56fe 14-29 \u6240\u793a\u7684\u4e09\u79cd\u60c5\u51b5\u3002

    1. \u5728 \\(s[i-1]\\) \u4e4b\u540e\u6dfb\u52a0 \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i, j-1]\\) \u3002
    2. \u5220\u9664 \\(s[i-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j]\\) \u3002
    3. \u5c06 \\(s[i-1]\\) \u66ff\u6362\u4e3a \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j-1]\\) \u3002

    \u56fe 14-29 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u72b6\u6001\u8f6c\u79fb

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7f16\u8f91\u6b65\u6570 \\(1\\) \u3002\u5bf9\u5e94\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

    \u8bf7\u6ce8\u610f\uff0c\u5f53 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ dp[i, j] = dp[i-1, j-1] \\]

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5f53\u4e24\u5b57\u7b26\u4e32\u90fd\u4e3a\u7a7a\u65f6\uff0c\u7f16\u8f91\u6b65\u6570\u4e3a \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u5f53 \\(s\\) \u4e3a\u7a7a\u4f46 \\(t\\) \u4e0d\u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(t\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u5f53 \\(s\\) \u4e0d\u4e3a\u7a7a\u4f46 \\(t\\) \u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(s\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

    \u89c2\u5bdf\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8d56\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in range(1, n + 1):\n        dp[i][0] = i\n    for j in range(1, m + 1):\n        dp[0][j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for j in range(1, m + 1):\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1\n    return dp[n][m]\n
    edit_distance.cpp
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.java
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.cs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i, 0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0, j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n, m];\n}\n
    edit_distance.go
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, m+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i := 1; i <= n; i++ {\n        dp[i][0] = i\n    }\n    for j := 1; j <= m; j++ {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= m; j++ {\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.swift
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1 ... n {\n        dp[i][0] = i\n    }\n    for j in 1 ... m {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for j in 1 ... m {\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.js
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.ts
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: m + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.dart
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n  int n = s.length, m = t.length;\n  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int i = 1; i <= n; i++) {\n    dp[i][0] = i;\n  }\n  for (int j = 1; j <= m; j++) {\n    dp[0][j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int j = 1; j <= m; j++) {\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n      }\n    }\n  }\n  return dp[n][m];\n}\n
    edit_distance.rs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![vec![0; m + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1..=n {\n        dp[i][0] = i as i32;\n    }\n    for j in 1..m {\n        dp[0][j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for j in 1..=m {\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    dp[n][m]\n}\n
    edit_distance.c
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(char *s, char *t, int n, int m) {\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(m + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    int res = dp[n][m];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    edit_distance.kt
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDP(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = Array(n + 1) { IntArray(m + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (i in 1..n) {\n        dp[i][0] = i\n    }\n    for (j in 1..m) {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (j in 1..m) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.rb
    ### \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef edit_distance_dp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(n + 1) { Array.new(m + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(n + 1)).each { |i| dp[i][0] = i }\n  (1...(m + 1)).each { |j| dp[0][j] = j }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for j in 1...(m +1)\n      if s[i - 1] == t[j - 1]\n        # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[i][j] = dp[i - 1][j - 1]\n      else\n        # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[i][j] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1\n      end\n    end\n  end\n  dp[n][m]\nend\n
    edit_distance.zig
    // \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\nfn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_][m + 1]i32{[_]i32{0} ** (m + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..n + 1) |i| {\n        dp[i][0] = @intCast(i);\n    }\n    for (1..m + 1) |j| {\n        dp[0][j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..m + 1) |j| {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = @min(@min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-30 \u6240\u793a\uff0c\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\u4e0e\u80cc\u5305\u95ee\u9898\u975e\u5e38\u7c7b\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5199\u4e00\u4e2a\u4e8c\u7ef4\u7f51\u683c\u7684\u8fc7\u7a0b\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u56fe 14-30 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e \\(dp[i,j]\\) \u662f\u7531\u4e0a\u65b9 \\(dp[i-1, j]\\)\u3001\u5de6\u65b9 \\(dp[i, j-1]\\)\u3001\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \u8f6c\u79fb\u800c\u6765\u7684\uff0c\u800c\u6b63\u5e8f\u904d\u5386\u4f1a\u4e22\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u904d\u5386\u65e0\u6cd5\u63d0\u524d\u6784\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u4e24\u79cd\u904d\u5386\u987a\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

    \u4e3a\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf leftup \u6765\u6682\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u4ece\u800c\u53ea\u9700\u8003\u8651\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u65f6\u7684\u60c5\u51b5\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u904d\u5386\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n + 1):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u6682\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    return dp[m]\n
    edit_distance.cpp
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.java
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.cs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.go
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i := 1; i <= n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.swift
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: 0, count: m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ... n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.js
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.ts
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.dart
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
    edit_distance.rs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp_comp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![0; m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..=n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..=m {\n            let temp = dp[j];\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
    edit_distance.c
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    edit_distance.kt
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.rb
    ### \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef edit_distance_dp_comp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(m + 1, 0)\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  (1...(m + 1)).each { |j| dp[j] = j }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for i in 1...(n + 1)\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    leftup = dp.first # \u6682\u5b58 dp[i-1, j-1]\n    dp[0] += 1\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for j in 1...(m + 1)\n      temp = dp[j]\n      if s[i - 1] == t[j - 1]\n        # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[j] = leftup\n      else\n        # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[j] = [dp[j - 1], dp[j], leftup].min + 1\n      end\n      leftup = temp # \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    end\n  end\n  dp[m]\nend\n
    edit_distance.zig
    // \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn editDistanceDPComp(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_]i32{0} ** (m + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n + 1) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212","text":"

    \u52a8\u6001\u89c4\u5212\uff08dynamic programming\uff09\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u7b97\u6cd5\u8303\u5f0f\uff0c\u5b83\u5c06\u4e00\u4e2a\u95ee\u9898\u5206\u89e3\u4e3a\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u907f\u514d\u91cd\u590d\u8ba1\u7b97\uff0c\u4ece\u800c\u5927\u5e45\u63d0\u5347\u65f6\u95f4\u6548\u7387\u3002

    \u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u4ece\u4e00\u4e2a\u7ecf\u5178\u4f8b\u9898\u5165\u624b\uff0c\u5148\u7ed9\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c2\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u518d\u9010\u6b65\u5bfc\u51fa\u66f4\u9ad8\u6548\u7684\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

    \u722c\u697c\u68af

    \u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

    \u5982\u56fe 14-1 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e00\u4e2a \\(3\\) \u9636\u697c\u68af\uff0c\u5171\u6709 \\(3\\) \u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\u3002

    \u56fe 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

    \u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u56de\u6eaf\u6765\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5c06\u722c\u697c\u68af\u60f3\u8c61\u4e3a\u4e00\u4e2a\u591a\u8f6e\u9009\u62e9\u7684\u8fc7\u7a0b\uff1a\u4ece\u5730\u9762\u51fa\u53d1\uff0c\u6bcf\u8f6e\u9009\u62e9\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u6bcf\u5f53\u5230\u8fbe\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u65b9\u6848\u6570\u91cf\u52a0 \\(1\\) \uff0c\u5f53\u8d8a\u8fc7\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u5176\u526a\u679d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_backtrack.py
    def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:\n    \"\"\"\u56de\u6eaf\"\"\"\n    # \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    state = 0  # \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n
    climbing_stairs_backtrack.cpp
    /* \u56de\u6eaf */\nvoid backtrack(vector<int> &choices, int state, int n, vector<int> &res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;                // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res[0];\n}\n
    climbing_stairs_backtrack.java
    /* \u56de\u6eaf */\nvoid backtrack(List<Integer> choices, int state, int n, List<Integer> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.cs
    /* \u56de\u6eaf */\nvoid Backtrack(List<int> choices, int state, int n, List<int> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    Backtrack(choices, state, n, res);\n    return res[0];\n}\n
    climbing_stairs_backtrack.go
    /* \u56de\u6eaf */\nfunc backtrack(choices []int, state, n int, res []int) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state+choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    choices := []int{1, 2}\n    // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    res[0] = 0\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.swift
    /* \u56de\u6eaf */\nfunc backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices: choices, state: state, n: n, res: &res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.js
    /* \u56de\u6eaf */\nfunction backtrack(choices, state, n, res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.ts
    /* \u56de\u6eaf */\nfunction backtrack(\n    choices: number[],\n    state: number,\n    n: number,\n    res: Map<0, any>\n): void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.dart
    /* \u56de\u6eaf */\nvoid backtrack(List<int> choices, int state, int n, List<int> res) {\n  // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n    if (state + choice > n) continue;\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n  int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n  backtrack(choices, state, n, res);\n  return res[0];\n}\n
    climbing_stairs_backtrack.rs
    /* \u56de\u6eaf */\nfn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, n as i32, &mut res);\n    res[0]\n}\n
    climbing_stairs_backtrack.c
    /* \u56de\u6eaf */\nvoid backtrack(int *choices, int state, int n, int *res, int len) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;           // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    int len = sizeof(choices) / sizeof(int);\n    backtrack(choices, state, n, res, len);\n    int result = *res;\n    free(res);\n    return result;\n}\n
    climbing_stairs_backtrack.kt
    /* \u56de\u6eaf */\nfun backtrack(\n    choices: MutableList<Int>,\n    state: Int,\n    n: Int,\n    res: MutableList<Int>\n) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    val state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.rb
    ### \u56de\u6eaf ###\ndef backtrack(choices, state, n, res)\n  # \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n  res[0] += 1 if state == n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  for choice in choices\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n    next if state + choice > n\n\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n    backtrack(choices, state + choice, n, res)\n  end\n  # \u56de\u9000\nend\n\n### \u722c\u697c\u68af\uff1a\u56de\u6eaf ###\ndef climbing_stairs_backtrack(n)\n  choices = [1, 2] # \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n  state = 0 # \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n  res = [0] # \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n  backtrack(choices, state, n, res)\n  res.first\nend\n
    climbing_stairs_backtrack.zig
    // \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u697c\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    var state: i32 = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer res.deinit();\n    try res.append(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

    \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u5e76\u4e0d\u663e\u5f0f\u5730\u5bf9\u95ee\u9898\u8fdb\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c06\u6c42\u89e3\u95ee\u9898\u770b\u4f5c\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\uff0c\u901a\u8fc7\u8bd5\u63a2\u548c\u526a\u679d\uff0c\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

    \u6211\u4eec\u53ef\u4ee5\u5c1d\u8bd5\u4ece\u95ee\u9898\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u8fd9\u9053\u9898\u3002\u8bbe\u722c\u5230\u7b2c \\(i\\) \u9636\u5171\u6709 \\(dp[i]\\) \u79cd\u65b9\u6848\uff0c\u90a3\u4e48 \\(dp[i]\\) \u5c31\u662f\u539f\u95ee\u9898\uff0c\u5176\u5b50\u95ee\u9898\u5305\u62ec\uff1a

    \\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

    \u7531\u4e8e\u6bcf\u8f6e\u53ea\u80fd\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u56e0\u6b64\u5f53\u6211\u4eec\u7ad9\u5728\u7b2c \\(i\\) \u9636\u697c\u68af\u4e0a\u65f6\uff0c\u4e0a\u4e00\u8f6e\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u4e0a\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ea\u80fd\u4ece\u7b2c \\(i -1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u8fc8\u5411\u7b2c \\(i\\) \u9636\u3002

    \u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u63a8\u8bba\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u9636\u7684\u65b9\u6848\u6570\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u9636\u7684\u65b9\u6848\u6570\u5c31\u7b49\u4e8e\u722c\u5230\u7b2c \\(i\\) \u9636\u7684\u65b9\u6848\u6570\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

    \\[ dp[i] = dp[i-1] + dp[i-2] \\]

    \u8fd9\u610f\u5473\u7740\u5728\u722c\u697c\u68af\u95ee\u9898\u4e2d\uff0c\u5404\u4e2a\u5b50\u95ee\u9898\u4e4b\u95f4\u5b58\u5728\u9012\u63a8\u5173\u7cfb\uff0c\u539f\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u95ee\u9898\u7684\u89e3\u6784\u5efa\u5f97\u6765\u3002\u56fe 14-2 \u5c55\u793a\u4e86\u8be5\u9012\u63a8\u5173\u7cfb\u3002

    \u56fe 14-2 \u00a0 \u65b9\u6848\u6570\u91cf\u9012\u63a8\u5173\u7cfb

    \u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9012\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u7d22\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u9012\u5f52\u5730\u5c06\u4e00\u4e2a\u8f83\u5927\u95ee\u9898\u62c6\u89e3\u4e3a\u4e24\u4e2a\u8f83\u5c0f\u95ee\u9898\u7684\u548c\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898 \\(dp[1]\\) \u548c \\(dp[2]\\) \u65f6\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u9636\u5206\u522b\u6709 \\(1\\)\u3001\\(2\\) \u79cd\u65b9\u6848\u3002

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5b83\u548c\u6807\u51c6\u56de\u6eaf\u4ee3\u7801\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u4f46\u66f4\u52a0\u7b80\u6d01\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
    def dfs(i: int) -> int:\n    \"\"\"\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1) + dfs(i - 2)\n    return count\n\ndef climbing_stairs_dfs(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u641c\u7d22\"\"\"\n    return dfs(n)\n
    climbing_stairs_dfs.cpp
    /* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.java
    /* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.cs
    /* \u641c\u7d22 */\nint DFS(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1) + DFS(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
    climbing_stairs_dfs.go
    /* \u641c\u7d22 */\nfunc dfs(i int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfs(i-1) + dfs(i-2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.swift
    /* \u641c\u7d22 */\nfunc dfs(i: Int) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1) + dfs(i: i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
    climbing_stairs_dfs.js
    /* \u641c\u7d22 */\nfunction dfs(i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.ts
    /* \u641c\u7d22 */\nfunction dfs(i: number): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.dart
    /* \u641c\u7d22 */\nint dfs(int i) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1) + dfs(i - 2);\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
    climbing_stairs_dfs.rs
    /* \u641c\u7d22 */\nfn dfs(i: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1) + dfs(i - 2);\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
    climbing_stairs_dfs.c
    /* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.kt
    /* \u641c\u7d22 */\nfun dfs(i: Int): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1) + dfs(i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.rb
    ### \u641c\u7d22 ###\ndef dfs(i)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # dp[i] = dp[i-1] + dp[i-2]\n  dfs(i - 1) + dfs(i - 2)\nend\n\n### \u722c\u697c\u68af\uff1a\u641c\u7d22 ###\ndef climbing_stairs_dfs(n)\n  dfs(n)\nend\n
    climbing_stairs_dfs.zig
    // \u641c\u7d22\nfn dfs(i: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u641c\u7d22\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u7d22\u5f62\u6210\u7684\u9012\u5f52\u6811\u3002\u5bf9\u4e8e\u95ee\u9898 \\(dp[n]\\) \uff0c\u5176\u9012\u5f52\u6811\u7684\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002\u6307\u6570\u9636\u5c5e\u4e8e\u7206\u70b8\u5f0f\u589e\u957f\uff0c\u5982\u679c\u6211\u4eec\u8f93\u5165\u4e00\u4e2a\u6bd4\u8f83\u5927\u7684 \\(n\\) \uff0c\u5219\u4f1a\u9677\u5165\u6f2b\u957f\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

    \u56fe 14-3 \u00a0 \u722c\u697c\u68af\u5bf9\u5e94\u9012\u5f52\u6811

    \u89c2\u5bdf\u56fe 14-3 \uff0c\u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u201c\u91cd\u53e0\u5b50\u95ee\u9898\u201d\u5bfc\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u4e24\u8005\u90fd\u5305\u542b\u5b50\u95ee\u9898 \\(dp[7]\\) \u3002

    \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5b50\u95ee\u9898\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5b50\u5b50\u5b59\u5b59\u65e0\u7a77\u5c3d\u4e5f\u3002\u7edd\u5927\u90e8\u5206\u8ba1\u7b97\u8d44\u6e90\u90fd\u6d6a\u8d39\u5728\u8fd9\u4e9b\u91cd\u53e0\u7684\u5b50\u95ee\u9898\u4e0a\u3002

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

    \u4e3a\u4e86\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u4eec\u5e0c\u671b\u6240\u6709\u7684\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u6570\u7ec4 mem \u6765\u8bb0\u5f55\u6bcf\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u526a\u679d\u3002

    1. \u5f53\u9996\u6b21\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u5c06\u5176\u8bb0\u5f55\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u540e\u4f7f\u7528\u3002
    2. \u5f53\u518d\u6b21\u9700\u8981\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u4fbf\u53ef\u76f4\u63a5\u4ece mem[i] \u4e2d\u83b7\u53d6\u7ed3\u679c\uff0c\u4ece\u800c\u907f\u514d\u91cd\u590d\u8ba1\u7b97\u8be5\u5b50\u95ee\u9898\u3002

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
    def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1:\n        return mem[i]\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    # \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
    climbing_stairs_dfs_mem.cpp
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, vector<int> &mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.java
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.cs
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint DFS(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1, mem) + DFS(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
    climbing_stairs_dfs_mem.go
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfsMem(i int, mem []int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem := make([]int, n+1)\n    for i := range mem {\n        mem[i] = -1\n    }\n    return dfsMem(n, mem)\n}\n
    climbing_stairs_dfs_mem.swift
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfs(i: Int, mem: inout [Int]) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
    climbing_stairs_dfs_mem.js
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i, mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.ts
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i: number, mem: number[]): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.dart
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, List<int> mem) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n  if (mem[i] != -1) return mem[i];\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n  // \u8bb0\u5f55 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.rs
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn dfs(i: usize, mem: &mut [i32]) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
    climbing_stairs_dfs_mem.c
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int *mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int *mem = (int *)malloc((n + 1) * sizeof(int));\n    for (int i = 0; i <= n; i++) {\n        mem[i] = -1;\n    }\n    int result = dfs(n, mem);\n    free(mem);\n    return result;\n}\n
    climbing_stairs_dfs_mem.kt
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun dfs(i: Int, mem: IntArray): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i]\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
    climbing_stairs_dfs_mem.rb
    ### \u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef dfs(i, mem)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n  return mem[i] if mem[i] != -1\n\n  # dp[i] = dp[i-1] + dp[i-2]\n  count = dfs(i - 1, mem) + dfs(i - 2, mem)\n  # \u8bb0\u5f55 dp[i]\n  mem[i] = count\nend\n\n### \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef climbing_stairs_dfs_mem(n)\n  # mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n  mem = Array.new(n + 1, -1)\n  dfs(n, mem)\nend\n
    climbing_stairs_dfs_mem.zig
    // \u8bb0\u5fc6\u5316\u641c\u7d22\nfn dfs(i: usize, mem: []i32) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u56fe 14-4 \uff0c\u7ecf\u8fc7\u8bb0\u5fc6\u5316\u5904\u7406\u540e\uff0c\u6240\u6709\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u8fd9\u662f\u4e00\u4e2a\u5de8\u5927\u7684\u98de\u8dc3\u3002

    \u56fe 14-4 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u5bf9\u5e94\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

    \u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u201c\u4ece\u9876\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u4eec\u4ece\u539f\u95ee\u9898\uff08\u6839\u8282\u70b9\uff09\u5f00\u59cb\uff0c\u9012\u5f52\u5730\u5c06\u8f83\u5927\u5b50\u95ee\u9898\u5206\u89e3\u4e3a\u8f83\u5c0f\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u53f6\u8282\u70b9\uff09\u3002\u4e4b\u540e\uff0c\u901a\u8fc7\u56de\u6eaf\u9010\u5c42\u6536\u96c6\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

    \u4e0e\u4e4b\u76f8\u53cd\uff0c\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u201c\u4ece\u5e95\u81f3\u9876\u201d\u7684\u65b9\u6cd5\uff1a\u4ece\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u5f00\u59cb\uff0c\u8fed\u4ee3\u5730\u6784\u5efa\u66f4\u5927\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002

    \u7531\u4e8e\u52a8\u6001\u89c4\u5212\u4e0d\u5305\u542b\u56de\u6eaf\u8fc7\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u5faa\u73af\u8fed\u4ee3\u5b9e\u73b0\uff0c\u65e0\u987b\u4f7f\u7528\u9012\u5f52\u3002\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u4e0e\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u6570\u7ec4 mem \u76f8\u540c\u7684\u8bb0\u5f55\u4f5c\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = dp[i - 1] + dp[i - 2]\n    return dp[n]\n
    climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.java
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.go
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = dp[i-1] + dp[i-2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.js
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = dp[i - 1] + dp[i - 2];\n  }\n  return dp[n];\n}\n
    climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp(n: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    dp[n]\n}\n
    climbing_stairs_dp.c
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    int result = dp[n];\n    free(dp);\n    return result;\n}\n
    climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef climbing_stairs_dp(n)\n  return n  if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1, 0)\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1], dp[2] = 1, 2\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }\n\n  dp[n]\nend\n
    climbing_stairs_dp.zig
    // \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsDP(comptime n: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-5 \u6a21\u62df\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\u3002

    \u56fe 14-5 \u00a0 \u722c\u697c\u68af\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u4e0e\u56de\u6eaf\u7b97\u6cd5\u4e00\u6837\uff0c\u52a8\u6001\u89c4\u5212\u4e5f\u4f7f\u7528\u201c\u72b6\u6001\u201d\u6982\u5ff5\u6765\u8868\u793a\u95ee\u9898\u6c42\u89e3\u7684\u7279\u5b9a\u9636\u6bb5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\u4ee5\u53ca\u76f8\u5e94\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u697c\u68af\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570 \\(i\\) \u3002

    \u6839\u636e\u4ee5\u4e0a\u5185\u5bb9\uff0c\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u52a8\u6001\u89c4\u5212\u7684\u5e38\u7528\u672f\u8bed\u3002

    • \u5c06\u6570\u7ec4 dp \u79f0\u4e3a dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72b6\u6001 \\(i\\) \u5bf9\u5e94\u5b50\u95ee\u9898\u7684\u89e3\u3002
    • \u5c06\u6700\u5c0f\u5b50\u95ee\u9898\u5bf9\u5e94\u7684\u72b6\u6001\uff08\u7b2c \\(1\\) \u9636\u548c\u7b2c \\(2\\) \u9636\u697c\u68af\uff09\u79f0\u4e3a\u521d\u59cb\u72b6\u6001\u3002
    • \u5c06\u9012\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u79f0\u4e3a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002
    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u7531\u4e8e \\(dp[i]\\) \u53ea\u4e0e \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u987b\u4f7f\u7528\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u800c\u53ea\u9700\u4e24\u4e2a\u53d8\u91cf\u6eda\u52a8\u524d\u8fdb\u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    a, b = 1, 2\n    for _ in range(3, n + 1):\n        a, b = b, a + b\n    return b\n
    climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.java
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.go
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
    climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    var a = 1\n    var b = 2\n    for _ in 3 ... n {\n        (a, b) = (b, a + b)\n    }\n    return b\n}\n
    climbing_stairs_dp.js
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n) {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n: number): number {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n  if (n == 1 || n == 2) return n;\n  int a = 1, b = 2;\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = a + b;\n    a = tmp;\n  }\n  return b;\n}\n
    climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp_comp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    let (mut a, mut b) = (1, 2);\n    for _ in 3..=n {\n        let tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    b\n}\n
    climbing_stairs_dp.c
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDPComp(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    var a = 1\n    var b = 2\n    for (i in 3..n) {\n        val temp = b\n        b += a\n        a = temp\n    }\n    return b\n}\n
    climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef climbing_stairs_dp_comp(n)\n  return n if n == 1 || n == 2\n\n  a, b = 1, 2\n  (3...(n + 1)).each { a, b = b, a + b }\n\n  b\nend\n
    climbing_stairs_dp.zig
    // \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn climbingStairsDPComp(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    var a: i32 = 1;\n    var b: i32 = 2;\n    for (3..n + 1) |_| {\n        var tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u7531\u4e8e\u7701\u53bb\u4e86\u6570\u7ec4 dp \u5360\u7528\u7684\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

    \u5728\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e2d\uff0c\u5f53\u524d\u72b6\u6001\u5f80\u5f80\u4ec5\u4e0e\u524d\u9762\u6709\u9650\u4e2a\u72b6\u6001\u6709\u5173\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72b6\u6001\uff0c\u901a\u8fc7\u201c\u964d\u7ef4\u201d\u6765\u8282\u7701\u5185\u5b58\u7a7a\u95f4\u3002\u8fd9\u79cd\u7a7a\u95f4\u4f18\u5316\u6280\u5de7\u88ab\u79f0\u4e3a\u201c\u6eda\u52a8\u53d8\u91cf\u201d\u6216\u201c\u6eda\u52a8\u6570\u7ec4\u201d\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898","text":"

    \u80cc\u5305\u95ee\u9898\u662f\u4e00\u4e2a\u975e\u5e38\u597d\u7684\u52a8\u6001\u89c4\u5212\u5165\u95e8\u9898\u76ee\uff0c\u662f\u52a8\u6001\u89c4\u5212\u4e2d\u6700\u5e38\u89c1\u7684\u95ee\u9898\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u95ee\u9898\u3001\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u3001\u591a\u91cd\u80cc\u5305\u95ee\u9898\u7b49\u3002

    \u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6765\u6c42\u89e3\u6700\u5e38\u89c1\u7684 0-1 \u80cc\u5305\u95ee\u9898\u3002

    Question

    \u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002

    \u89c2\u5bdf\u56fe 14-17 \uff0c\u7531\u4e8e\u7269\u54c1\u7f16\u53f7 \\(i\\) \u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u6570\u7ec4\u7d22\u5f15\u4ece \\(0\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5bf9\u5e94\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u4ef7\u503c \\(val[i-1]\\) \u3002

    \u56fe 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u6570\u636e

    \u6211\u4eec\u53ef\u4ee5\u5c06 0-1 \u80cc\u5305\u95ee\u9898\u770b\u4f5c\u4e00\u4e2a\u7531 \\(n\\) \u8f6e\u51b3\u7b56\u7ec4\u6210\u7684\u8fc7\u7a0b\uff0c\u5bf9\u4e8e\u6bcf\u4e2a\u7269\u4f53\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u4e24\u79cd\u51b3\u7b56\uff0c\u56e0\u6b64\u8be5\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\u3002

    \u8be5\u95ee\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u201d\uff0c\u56e0\u6b64\u8f83\u5927\u6982\u7387\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u5bf9\u4e8e\u6bcf\u4e2a\u7269\u54c1\u6765\u8bf4\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u51cf\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72b6\u6001\u5b9a\u4e49\uff1a\u5f53\u524d\u7269\u54c1\u7f16\u53f7 \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8bb0\u4e3a \\([i, c]\\) \u3002

    \u72b6\u6001 \\([i, c]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\uff0c\u8bb0\u4e3a \\(dp[i, c]\\) \u3002

    \u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u5f53\u6211\u4eec\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u51b3\u7b56\u540e\uff0c\u5269\u4f59\u7684\u662f\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u51b3\u7b56\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u51cf\u5c11 \\(wgt[i-1]\\) \uff0c\u4ef7\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c-wgt[i-1]]\\) \u3002

    \u4e0a\u8ff0\u5206\u6790\u5411\u6211\u4eec\u63ed\u793a\u4e86\u672c\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6700\u5927\u4ef7\u503c \\(dp[i, c]\\) \u7b49\u4e8e\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\u3002\u7531\u6b64\u53ef\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

    \\[ dp[i, c] = \\max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) \\]

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u4f59\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5f53\u65e0\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\u6700\u5927\u4ef7\u503c\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

    \u5f53\u524d\u72b6\u6001 \\([i, c]\\) \u4ece\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c-wgt[i-1]]\\) \u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u6309\u987a\u5e8f\u5b9e\u73b0\u66b4\u529b\u641c\u7d22\u3001\u8bb0\u5fc6\u5316\u641c\u7d22\u3001\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

    \u641c\u7d22\u4ee3\u7801\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, c]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u5b50\u95ee\u9898\u7684\u89e3 \\(dp[i, c]\\) \u3002
    • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53\u7269\u54c1\u7f16\u53f7\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\uff0c\u7ec8\u6b62\u9012\u5f52\u5e76\u8fd4\u56de\u4ef7\u503c \\(0\\) \u3002
    • \u526a\u679d\uff1a\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs(wgt, val, i - 1, c)\n    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes);\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFS(weight, val, i - 1, c);\n    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.Max(no, yes);\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFS(wgt, val, i-1, c)\n    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return int(math.Max(float64(no), float64(yes)))\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFS(wgt, val, i - 1, c);\n  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  return max(no, yes);\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs(wgt, val, i - 1, c);\n    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    std::cmp::max(no, yes)\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return myMax(no, yes);\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFS(wgt, _val, i - 1, c)\n    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 ###\ndef knapsack_dfs(wgt, val, i, c)\n  # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  return 0 if i == 0 || c == 0\n  # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c\n  # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  no = knapsack_dfs(wgt, val, i - 1, c)\n  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  [no, yes].max\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFS(wgt, val, i - 1, c);\n    var yes = knapsackDFS(wgt, val, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return @max(no, yes);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-18 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u7269\u54c1\u90fd\u4f1a\u4ea7\u751f\u4e0d\u9009\u548c\u9009\u4e24\u6761\u641c\u7d22\u5206\u652f\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002

    \u89c2\u5bdf\u9012\u5f52\u6811\uff0c\u5bb9\u6613\u53d1\u73b0\u5176\u4e2d\u5b58\u5728\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u5f53\u7269\u54c1\u8f83\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f83\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f83\u591a\u65f6\uff0c\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u6570\u91cf\u5c06\u4f1a\u5927\u5e45\u589e\u591a\u3002

    \u56fe 14-18 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

    \u4e3a\u4e86\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\uff0c\u6211\u4eec\u501f\u52a9\u8bb0\u5fc6\u5217\u8868 mem \u6765\u8bb0\u5f55\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5bf9\u5e94 \\(dp[i, c]\\) \u3002

    \u5f15\u5165\u8bb0\u5fc6\u5316\u4e4b\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5b50\u95ee\u9898\u6570\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dfs_mem(\n    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int\n) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);\n    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFSMem(wgt, val, mem, i-1, c)\n    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = int(math.Max(float64(no), float64(yes)))\n    return mem[i][c]\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(\n    wgt: Array<number>,\n    val: Array<number>,\n    mem: Array<Array<number>>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(\n  List<int> wgt,\n  List<int> val,\n  List<List<int>> mem,\n  int i,\n  int c,\n) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef knapsack_dfs_mem(wgt, val, mem, i, c)\n  # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  return 0 if i == 0 || c == 0\n  # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return mem[i][c] if mem[i][c] != -1\n  # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c\n  # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  mem[i][c] = [no, yes].max\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    var yes = knapsackDFSMem(wgt, val, mem, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-19 \u5c55\u793a\u4e86\u5728\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u88ab\u526a\u6389\u7684\u641c\u7d22\u5206\u652f\u3002

    \u56fe 14-19 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

    \u52a8\u6001\u89c4\u5212\u5b9e\u8d28\u4e0a\u5c31\u662f\u5728\u72b6\u6001\u8f6c\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u8fc7\u7a0b\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint KnapsackDP(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(n + 1)\n        .fill(0)\n        .map(() => Array(cap + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],\n                );\n            }\n        }\n    }\n    dp[n][cap]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn knapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i - 1][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-20 \u6240\u793a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u7531\u6570\u7ec4 dp \u5927\u5c0f\u51b3\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14>

    \u56fe 14-20 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u90fd\u53ea\u4e0e\u5176\u4e0a\u4e00\u884c\u7684\u72b6\u6001\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e24\u4e2a\u6570\u7ec4\u6eda\u52a8\u524d\u8fdb\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

    \u8fdb\u4e00\u6b65\u601d\u8003\uff0c\u6211\u4eec\u80fd\u5426\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u5b9e\u73b0\u7a7a\u95f4\u4f18\u5316\u5462\uff1f\u89c2\u5bdf\u53ef\u77e5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f6c\u79fb\u8fc7\u6765\u7684\u3002\u5047\u8bbe\u53ea\u6709\u4e00\u4e2a\u6570\u7ec4\uff0c\u5f53\u5f00\u59cb\u904d\u5386\u7b2c \\(i\\) \u884c\u65f6\uff0c\u8be5\u6570\u7ec4\u5b58\u50a8\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72b6\u6001\u3002

    • \u5982\u679c\u91c7\u53d6\u6b63\u5e8f\u904d\u5386\uff0c\u90a3\u4e48\u904d\u5386\u5230 \\(dp[i, j]\\) \u65f6\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7ecf\u88ab\u8986\u76d6\uff0c\u6b64\u65f6\u5c31\u65e0\u6cd5\u5f97\u5230\u6b63\u786e\u7684\u72b6\u6001\u8f6c\u79fb\u7ed3\u679c\u3002
    • \u5982\u679c\u91c7\u53d6\u5012\u5e8f\u904d\u5386\uff0c\u5219\u4e0d\u4f1a\u53d1\u751f\u8986\u76d6\u95ee\u9898\uff0c\u72b6\u6001\u8f6c\u79fb\u53ef\u4ee5\u6b63\u786e\u8fdb\u884c\u3002

    \u56fe 14-21 \u5c55\u793a\u4e86\u5728\u5355\u4e2a\u6570\u7ec4\u4e0b\u4ece\u7b2c \\(i = 1\\) \u884c\u8f6c\u6362\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u8fc7\u7a0b\u3002\u8bf7\u601d\u8003\u6b63\u5e8f\u904d\u5386\u548c\u5012\u5e8f\u904d\u5386\u7684\u533a\u522b\u3002

    <1><2><3><4><5><6>

    \u56fe 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4 \\(i\\) \u76f4\u63a5\u5220\u9664\uff0c\u5e76\u4e14\u628a\u5185\u5faa\u73af\u66f4\u6539\u4e3a\u5012\u5e8f\u904d\u5386\u5373\u53ef\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u904d\u5386\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint KnapsackDPComp(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u904d\u5386\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u904d\u5386\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u904d\u5386\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u5012\u5e8f\u904d\u5386\n    for c in cap.downto(1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn knapsackDPComp(wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u904d\u5386\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7ed3","text":"
    • \u52a8\u6001\u89c4\u5212\u5bf9\u95ee\u9898\u8fdb\u884c\u5206\u89e3\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u89c4\u907f\u91cd\u590d\u8ba1\u7b97\uff0c\u63d0\u9ad8\u8ba1\u7b97\u6548\u7387\u3002
    • \u4e0d\u8003\u8651\u65f6\u95f4\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52a8\u6001\u89c4\u5212\u95ee\u9898\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u7d22\uff09\u8fdb\u884c\u6c42\u89e3\uff0c\u4f46\u9012\u5f52\u6811\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u6548\u7387\u6781\u4f4e\u3002\u901a\u8fc7\u5f15\u5165\u8bb0\u5fc6\u5316\u5217\u8868\uff0c\u53ef\u4ee5\u5b58\u50a8\u6240\u6709\u8ba1\u7b97\u8fc7\u7684\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u4ece\u800c\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002
    • \u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u9012\u5f52\u5f0f\u89e3\u6cd5\uff0c\u800c\u4e0e\u4e4b\u5bf9\u5e94\u7684\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u4ece\u5e95\u81f3\u9876\u7684\u9012\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5199\u8868\u683c\u201d\u4e00\u6837\u3002\u7531\u4e8e\u5f53\u524d\u72b6\u6001\u4ec5\u4f9d\u8d56\u67d0\u4e9b\u5c40\u90e8\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\uff0c\u4ece\u800c\u964d\u4f4e\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
    • \u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8d28\u3002
    • \u52a8\u6001\u89c4\u5212\u95ee\u9898\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002
    • \u5982\u679c\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u53ef\u4ee5\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\uff0c\u5219\u5b83\u5c31\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u3002
    • \u65e0\u540e\u6548\u6027\u6307\u5bf9\u4e8e\u4e00\u4e2a\u72b6\u6001\uff0c\u5176\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u8be5\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u4e0d\u5177\u6709\u65e0\u540e\u6548\u6027\uff0c\u65e0\u6cd5\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u5feb\u901f\u6c42\u89e3\u3002

    \u80cc\u5305\u95ee\u9898

    • \u80cc\u5305\u95ee\u9898\u662f\u6700\u5178\u578b\u7684\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u53d8\u79cd\u3002
    • 0-1 \u80cc\u5305\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\u3002\u6839\u636e\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u4e24\u79cd\u51b3\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\uff0c\u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u904d\u5386\u5217\u8868\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72b6\u6001\u88ab\u8986\u76d6\u3002
    • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u6bcf\u79cd\u7269\u54c1\u7684\u9009\u53d6\u6570\u91cf\u65e0\u9650\u5236\uff0c\u56e0\u6b64\u9009\u62e9\u653e\u5165\u7269\u54c1\u7684\u72b6\u6001\u8f6c\u79fb\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\u3002\u7531\u4e8e\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\u5e94\u5f53\u6b63\u5e8f\u904d\u5386\u3002
    • \u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u4e2a\u53d8\u79cd\u3002\u5b83\u4ece\u6c42\u201c\u6700\u5927\u201d\u4ef7\u503c\u53d8\u4e3a\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e01\u6570\u91cf\uff0c\u56e0\u6b64\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u5e94\u6539\u4e3a \\(\\min()\\) \u3002\u4ece\u8ffd\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u6765\u8868\u793a\u201c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u201d\u7684\u65e0\u6548\u89e3\u3002
    • \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u4ece\u6c42\u201c\u6700\u5c11\u786c\u5e01\u6570\u91cf\u201d\u6539\u4e3a\u6c42\u201c\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u201d\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u76f8\u5e94\u5730\u4ece \\(\\min()\\) \u6539\u4e3a\u6c42\u548c\u8fd0\u7b97\u7b26\u3002

    \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

    • \u7f16\u8f91\u8ddd\u79bb\uff08Levenshtein \u8ddd\u79bb\uff09\u7528\u4e8e\u8861\u91cf\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u4e49\u4e3a\u4ece\u4e00\u4e2a\u5b57\u7b26\u4e32\u5230\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u7f16\u8f91\u64cd\u4f5c\u5305\u62ec\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\u3002
    • \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002\u5f53 \\(s[i] \\ne t[j]\\) \u65f6\uff0c\u5177\u6709\u4e09\u79cd\u51b3\u7b56\uff1a\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\uff0c\u5b83\u4eec\u90fd\u6709\u76f8\u5e94\u7684\u5269\u4f59\u5b50\u95ee\u9898\u3002\u636e\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u6784\u5efa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u800c\u5f53 \\(s[i] = t[j]\\) \u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\u3002
    • \u5728\u7f16\u8f91\u8ddd\u79bb\u4e2d\uff0c\u72b6\u6001\u4f9d\u8d56\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u6b63\u5e8f\u6216\u5012\u5e8f\u904d\u5386\u90fd\u65e0\u6cd5\u6b63\u786e\u5730\u8fdb\u884c\u72b6\u6001\u8f6c\u79fb\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u53d8\u91cf\u6682\u5b58\u5de6\u4e0a\u65b9\u72b6\u6001\uff0c\u4ece\u800c\u8f6c\u5316\u5230\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7b49\u4ef7\u7684\u60c5\u51b5\uff0c\u53ef\u4ee5\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002
    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

    \u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6c42\u89e3\u53e6\u4e00\u4e2a\u5e38\u89c1\u7684\u80cc\u5305\u95ee\u9898\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u4e86\u89e3\u5b83\u7684\u4e00\u79cd\u7279\u4f8b\uff1a\u96f6\u94b1\u5151\u6362\u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 14-22 \u6240\u793a\u3002

    \u56fe 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\uff0c\u533a\u522b\u4ec5\u5728\u4e8e\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9009\u62e9\u6b21\u6570\u3002

    • \u5728 0-1 \u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u53ea\u6709\u4e00\u4e2a\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u53ea\u80fd\u4ece\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002
    • \u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u7684\u6570\u91cf\u662f\u65e0\u9650\u7684\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u4ecd\u53ef\u4ee5\u4ece\u524d \\(i\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002

    \u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u89c4\u5b9a\u4e0b\uff0c\u72b6\u6001 \\([i, c]\\) \u7684\u53d8\u5316\u5206\u4e3a\u4e24\u79cd\u60c5\u51b5\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

    \u4ece\u800c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u53d8\u4e3a\uff1a

    \\[ dp[i, c] = \\max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) \\]"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5bf9\u6bd4\u4e24\u9053\u9898\u76ee\u7684\u4ee3\u7801\uff0c\u72b6\u6001\u8f6c\u79fb\u4e2d\u6709\u4e00\u5904\u4ece \\(i-1\\) \u53d8\u4e3a \\(i\\) \uff0c\u5176\u4f59\u5b8c\u5168\u4e00\u81f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
    def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
    unbounded_knapsack.cpp
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.java
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.cs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
    unbounded_knapsack.go
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.swift
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.js
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.ts
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.dart
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
    unbounded_knapsack.rs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.c
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.rb
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e\u5f53\u524d\u72b6\u6001\u662f\u4ece\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u72b6\u6001\u8f6c\u79fb\u800c\u6765\u7684\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u5e94\u8be5\u5bf9 \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002

    \u8fd9\u4e2a\u904d\u5386\u987a\u5e8f\u4e0e 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8bf7\u501f\u52a9\u56fe 14-23 \u6765\u7406\u89e3\u4e24\u8005\u7684\u533a\u522b\u3002

    <1><2><3><4><5><6>

    \u56fe 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u4ee3\u7801\u5b9e\u73b0\u6bd4\u8f83\u7b80\u5355\uff0c\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4\u5220\u9664\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
    def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
    unbounded_knapsack.cpp
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.java
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.cs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.go
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.swift
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.js
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.ts
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.dart
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
    unbounded_knapsack.rs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
    unbounded_knapsack.c
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDPComp(\n    wgt: IntArray,\n    _val: IntArray,\n    cap: Int\n): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.rb
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n\n### \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ##3\ndef unbounded_knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u904d\u5386\n    for c in 1...(cap + 1)\n      if wgt[i -1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDPComp(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898","text":"

    \u80cc\u5305\u95ee\u9898\u662f\u4e00\u5927\u7c7b\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4ee3\u8868\uff0c\u5176\u62e5\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

    Question

    \u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 14-24 \u6240\u793a\u3002

    \u56fe 14-24 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u96f6\u94b1\u5151\u6362\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u79cd\u7279\u6b8a\u60c5\u51b5\uff0c\u4e24\u8005\u5177\u6709\u4ee5\u4e0b\u8054\u7cfb\u4e0e\u4e0d\u540c\u70b9\u3002

    • \u4e24\u9053\u9898\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\uff0c\u201c\u7269\u54c1\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5bf9\u5e94\u201c\u76ee\u6807\u91d1\u989d\u201d\u3002
    • \u4f18\u5316\u76ee\u6807\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u4ef7\u503c\uff0c\u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e01\u6570\u91cf\u3002
    • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u94b1\u5151\u6362\u662f\u6c42\u201c\u6070\u597d\u201d\u51d1\u5230\u76ee\u6807\u91d1\u989d\u7684\u89e3\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u72b6\u6001 \\([i, a]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\uff0c\u8bb0\u4e3a \\(dp[i, a]\\) \u3002

    \u4e8c\u7ef4 \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt+1)\\) \u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u672c\u9898\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u4e24\u70b9\u5dee\u5f02\u3002

    • \u672c\u9898\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c06\u8fd0\u7b97\u7b26 \\(\\max()\\) \u66f4\u6539\u4e3a \\(\\min()\\) \u3002
    • \u4f18\u5316\u4e3b\u4f53\u662f\u786c\u5e01\u6570\u91cf\u800c\u975e\u5546\u54c1\u4ef7\u503c\uff0c\u56e0\u6b64\u5728\u9009\u4e2d\u786c\u5e01\u65f6\u6267\u884c \\(+1\\) \u5373\u53ef\u3002
    \\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u51d1\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

    \u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u5373\u662f\u65e0\u6548\u89e3\u3002\u4e3a\u4f7f\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u6570\u80fd\u591f\u8bc6\u522b\u5e76\u8fc7\u6ee4\u65e0\u6548\u89e3\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528 \\(+ \\infty\\) \u6765\u8868\u793a\u5b83\u4eec\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(+ \\infty\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u5e76\u672a\u63d0\u4f9b \\(+ \\infty\\) \u53d8\u91cf\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u6765\u4ee3\u66ff\u3002\u800c\u8fd9\u53c8\u4f1a\u5bfc\u81f4\u5927\u6570\u8d8a\u754c\uff1a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u53d1\u751f\u6ea2\u51fa\u3002

    \u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u6570\u5b57 \\(amt + 1\\) \u6765\u8868\u793a\u65e0\u6548\u89e3\uff0c\u56e0\u4e3a\u51d1\u51fa \\(amt\\) \u7684\u786c\u5e01\u6570\u91cf\u6700\u591a\u4e3a \\(amt\\) \u3002\u6700\u540e\u8fd4\u56de\u524d\uff0c\u5224\u65ad \\(dp[n, amt]\\) \u662f\u5426\u7b49\u4e8e \\(amt + 1\\) \uff0c\u82e5\u662f\u5219\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n    return dp[n][amt] if dp[n][amt] != MAX else -1\n
    coin_change.cpp
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.java
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.cs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDP(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n, amt] != MAX ? dp[n, amt] : -1;\n}\n
    coin_change.go
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt]\n    }\n    return -1\n}\n
    coin_change.swift
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1\n}\n
    coin_change.js
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
    coin_change.ts
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
    coin_change.dart
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.rs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt] as i32;\n    } else {\n        -1\n    }\n}\n
    coin_change.c
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[n][amt] != MAX) dp[n][amt] else -1\n}\n
    coin_change.rb
    ### \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_dp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[i][a] = [dp[i - 1][a], dp[i][a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[n][amt] != _MAX ? dp[n][amt] : -1\nend\n
    coin_change.zig
    // \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = @min(dp[i - 1][a], dp[i][a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[n][amt] != max) {\n        return @intCast(dp[n][amt]);\n    } else {\n        return -1;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-25 \u5c55\u793a\u4e86\u96f6\u94b1\u5151\u6362\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u56fe 14-25 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u96f6\u94b1\u5151\u6362\u7684\u7a7a\u95f4\u4f18\u5316\u7684\u5904\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e00\u81f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n    return dp[amt] if dp[amt] != MAX else -1\n
    coin_change.cpp
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.java
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Arrays.fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.cs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Array.Fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.go
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    for i := 1; i <= amt; i++ {\n        dp[i] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt]\n    }\n    return -1\n}\n
    coin_change.swift
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: MAX, count: amt + 1)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1\n}\n
    coin_change.js
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
    coin_change.ts
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
    coin_change.dart
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, MAX);\n  dp[0] = 0;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.rs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp.fill(max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt] as i32;\n    } else {\n        -1\n    }\n}\n
    coin_change.c
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = malloc((amt + 1) * sizeof(int));\n    for (int j = 1; j <= amt; j++) {\n        dp[j] = MAX;\n    } \n    dp[0] = 0;\n\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[amt] != MAX ? dp[amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp.fill(MAX)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[amt] != MAX) dp[amt] else -1\n}\n
    coin_change.rb
    ### \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_dp_comp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, _MAX)\n  dp[0] = 0\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u904d\u5386\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[a] = [dp[a], dp[a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[amt] != _MAX ? dp[amt] : -1\nend\n
    coin_change.zig
    // \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    @memset(&dp, max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = @min(dp[a], dp[a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[amt] != max) {\n        return @intCast(dp[amt]);\n    } else {\n        return -1;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II","text":"

    Question

    \u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u3002\u793a\u4f8b\u5982\u56fe 14-26 \u6240\u793a\u3002

    \u56fe 14-26 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u76f8\u6bd4\u4e8e\u4e0a\u4e00\u9898\uff0c\u672c\u9898\u76ee\u6807\u662f\u6c42\u7ec4\u5408\u6570\u91cf\uff0c\u56e0\u6b64\u5b50\u95ee\u9898\u53d8\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u7ec4\u5408\u6570\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7ef4\u77e9\u9635\u3002

    \u5f53\u524d\u72b6\u6001\u7684\u7ec4\u5408\u6570\u91cf\u7b49\u4e8e\u4e0d\u9009\u5f53\u524d\u786c\u5e01\u4e0e\u9009\u5f53\u524d\u786c\u5e01\u8fd9\u4e24\u79cd\u51b3\u7b56\u7684\u7ec4\u5408\u6570\u91cf\u4e4b\u548c\u3002\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

    \u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u65e0\u987b\u9009\u62e9\u4efb\u4f55\u786c\u5e01\u5373\u53ef\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u5e94\u5c06\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u4e3a \\(1\\) \u3002\u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
    def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u521d\u59cb\u5316\u9996\u5217\n    for i in range(n + 1):\n        dp[i][0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n    return dp[n][amt]\n
    coin_change_ii.cpp
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.java
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.cs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDP(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i, 0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n, amt];\n}\n
    coin_change_ii.go
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i := 0; i <= n; i++ {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.swift
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0 ... n {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.js
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.ts
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.dart
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u521d\u59cb\u5316\u9996\u5217\n  for (int i = 0; i <= n; i++) {\n    dp[i][0] = 1;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[n][amt];\n}\n
    coin_change_ii.rs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0..=n {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[n][amt]\n}\n
    coin_change_ii.c
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[n][amt];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (i in 0..n) {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.rb
    ### \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_ii_dp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u521d\u59cb\u5316\u9996\u5217\n  (0...(n + 1)).each { |i| dp[i][0] = 1 }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n      end\n    end\n  end\n  dp[n][amt]\nend\n
    coin_change_ii.zig
    // \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (0..n + 1) |i| {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7a7a\u95f4\u4f18\u5316\u5904\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u5220\u9664\u786c\u5e01\u7ef4\u5ea6\u5373\u53ef\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
    def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
    coin_change_ii.cpp
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.java
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.cs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.go
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a-coins[i-1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.swift
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.js
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.ts
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.dart
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, 0);\n  dp[0] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[amt];\n}\n
    coin_change_ii.rs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[amt]\n}\n
    coin_change_ii.c
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(amt + 1, sizeof(int));\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.rb
    ### \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_ii_dp_comp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, 0)\n  dp[0] = 1\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u904d\u5386\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]]\n      end\n    end\n  end\n  dp[amt]\nend\n
    coin_change_ii.zig
    // \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u56fe","text":"

    Abstract

    \u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u4eec\u5c31\u50cf\u662f\u4e00\u4e2a\u4e2a\u8282\u70b9\uff0c\u88ab\u65e0\u6570\u770b\u4e0d\u89c1\u7684\u8fb9\u76f8\u8fde\u3002

    \u6bcf\u4e00\u6b21\u7684\u76f8\u8bc6\u4e0e\u76f8\u79bb\uff0c\u90fd\u5728\u8fd9\u5f20\u5de8\u5927\u7684\u7f51\u7edc\u56fe\u4e2d\u7559\u4e0b\u72ec\u7279\u7684\u5370\u8bb0\u3002

    "},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 9.1 \u00a0 \u56fe
    • 9.2 \u00a0 \u56fe\u57fa\u7840\u64cd\u4f5c
    • 9.3 \u00a0 \u56fe\u7684\u904d\u5386
    • 9.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u56fe","text":"

    \u56fe\uff08graph\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u7531\u9876\u70b9\uff08vertex\uff09\u548c\u8fb9\uff08edge\uff09\u7ec4\u6210\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u56fe \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9 \\(V\\) \u548c\u4e00\u7ec4\u8fb9 \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u4e2a\u5305\u542b 5 \u4e2a\u9876\u70b9\u548c 7 \u6761\u8fb9\u7684\u56fe\u3002

    \\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

    \u5982\u679c\u5c06\u9876\u70b9\u770b\u4f5c\u8282\u70b9\uff0c\u5c06\u8fb9\u770b\u4f5c\u8fde\u63a5\u5404\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u56fe\u770b\u4f5c\u4e00\u79cd\u4ece\u94fe\u8868\u62d3\u5c55\u800c\u6765\u7684\u6570\u636e\u7ed3\u6784\u3002\u5982\u56fe 9-1 \u6240\u793a\uff0c\u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002

    \u56fe 9-1 \u00a0 \u94fe\u8868\u3001\u6811\u3001\u56fe\u4e4b\u95f4\u7684\u5173\u7cfb

    "},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u56fe\u7684\u5e38\u89c1\u7c7b\u578b\u4e0e\u672f\u8bed","text":"

    \u6839\u636e\u8fb9\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u4e3a\u65e0\u5411\u56fe\uff08undirected graph\uff09\u548c\u6709\u5411\u56fe\uff08directed graph\uff09\uff0c\u5982\u56fe 9-2 \u6240\u793a\u3002

    • \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u8fb9\u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u7684\u201c\u53cc\u5411\u201d\u8fde\u63a5\u5173\u7cfb\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u5173\u7cfb\u201d\u3002
    • \u5728\u6709\u5411\u56fe\u4e2d\uff0c\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u5173\u6ce8\u201d\u4e0e\u201c\u88ab\u5173\u6ce8\u201d\u5173\u7cfb\u3002

    \u56fe 9-2 \u00a0 \u6709\u5411\u56fe\u4e0e\u65e0\u5411\u56fe

    \u6839\u636e\u6240\u6709\u9876\u70b9\u662f\u5426\u8fde\u901a\uff0c\u53ef\u5206\u4e3a\u8fde\u901a\u56fe\uff08connected graph\uff09\u548c\u975e\u8fde\u901a\u56fe\uff08disconnected graph\uff09\uff0c\u5982\u56fe 9-3 \u6240\u793a\u3002

    • \u5bf9\u4e8e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u53ef\u4ee5\u5230\u8fbe\u5176\u4f59\u4efb\u610f\u9876\u70b9\u3002
    • \u5bf9\u4e8e\u975e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002

    \u56fe 9-3 \u00a0 \u8fde\u901a\u56fe\u4e0e\u975e\u8fde\u901a\u56fe

    \u6211\u4eec\u8fd8\u53ef\u4ee5\u4e3a\u8fb9\u6dfb\u52a0\u201c\u6743\u91cd\u201d\u53d8\u91cf\uff0c\u4ece\u800c\u5f97\u5230\u5982\u56fe 9-4 \u6240\u793a\u7684\u6709\u6743\u56fe\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u8363\u8000\u300b\u7b49\u624b\u6e38\u4e2d\uff0c\u7cfb\u7edf\u4f1a\u6839\u636e\u5171\u540c\u6e38\u620f\u65f6\u95f4\u6765\u8ba1\u7b97\u73a9\u5bb6\u4e4b\u95f4\u7684\u201c\u4eb2\u5bc6\u5ea6\u201d\uff0c\u8fd9\u79cd\u4eb2\u5bc6\u5ea6\u7f51\u7edc\u5c31\u53ef\u4ee5\u7528\u6709\u6743\u56fe\u6765\u8868\u793a\u3002

    \u56fe 9-4 \u00a0 \u6709\u6743\u56fe\u4e0e\u65e0\u6743\u56fe

    \u56fe\u6570\u636e\u7ed3\u6784\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u672f\u8bed\u3002

    • \u90bb\u63a5\uff08adjacency\uff09\uff1a\u5f53\u4e24\u9876\u70b9\u4e4b\u95f4\u5b58\u5728\u8fb9\u76f8\u8fde\u65f6\uff0c\u79f0\u8fd9\u4e24\u9876\u70b9\u201c\u90bb\u63a5\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u9876\u70b9 1 \u7684\u90bb\u63a5\u9876\u70b9\u4e3a\u9876\u70b9 2\u30013\u30015\u3002
    • \u8def\u5f84\uff08path\uff09\uff1a\u4ece\u9876\u70b9 A \u5230\u9876\u70b9 B \u7ecf\u8fc7\u7684\u8fb9\u6784\u6210\u7684\u5e8f\u5217\u88ab\u79f0\u4e3a\u4ece A \u5230 B \u7684\u201c\u8def\u5f84\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u8fb9\u5e8f\u5217 1-5-2-4 \u662f\u9876\u70b9 1 \u5230\u9876\u70b9 4 \u7684\u4e00\u6761\u8def\u5f84\u3002
    • \u5ea6\uff08degree\uff09\uff1a\u4e00\u4e2a\u9876\u70b9\u62e5\u6709\u7684\u8fb9\u6570\u3002\u5bf9\u4e8e\u6709\u5411\u56fe\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u6307\u5411\u8be5\u9876\u70b9\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u4ece\u8be5\u9876\u70b9\u6307\u51fa\u3002
    "},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u56fe\u7684\u8868\u793a","text":"

    \u56fe\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u65e0\u5411\u56fe\u8fdb\u884c\u4e3e\u4f8b\u3002

    "},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u90bb\u63a5\u77e9\u9635","text":"

    \u8bbe\u56fe\u7684\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u90bb\u63a5\u77e9\u9635\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u662f\u5426\u5b58\u5728\u8fb9\u3002

    \u5982\u56fe 9-5 \u6240\u793a\uff0c\u8bbe\u90bb\u63a5\u77e9\u9635\u4e3a \\(M\\)\u3001\u9876\u70b9\u5217\u8868\u4e3a \\(V\\) \uff0c\u90a3\u4e48\u77e9\u9635\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9876\u70b9 \\(V[i]\\) \u5230\u9876\u70b9 \\(V[j]\\) \u4e4b\u95f4\u5b58\u5728\u8fb9\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u65e0\u8fb9\u3002

    \u56fe 9-5 \u00a0 \u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a

    \u90bb\u63a5\u77e9\u9635\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u9876\u70b9\u4e0d\u80fd\u4e0e\u81ea\u8eab\u76f8\u8fde\uff0c\u56e0\u6b64\u90bb\u63a5\u77e9\u9635\u4e3b\u5bf9\u89d2\u7ebf\u5143\u7d20\u6ca1\u6709\u610f\u4e49\u3002
    • \u5bf9\u4e8e\u65e0\u5411\u56fe\uff0c\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u7b49\u4ef7\uff0c\u6b64\u65f6\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\u3002
    • \u5c06\u90bb\u63a5\u77e9\u9635\u7684\u5143\u7d20\u4ece \\(1\\) \u548c \\(0\\) \u66ff\u6362\u4e3a\u6743\u91cd\uff0c\u5219\u53ef\u8868\u793a\u6709\u6743\u56fe\u3002

    \u4f7f\u7528\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u77e9\u9635\u5143\u7d20\u4ee5\u83b7\u53d6\u8fb9\uff0c\u56e0\u6b64\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9635\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u5185\u5b58\u5360\u7528\u8f83\u591a\u3002

    "},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u90bb\u63a5\u8868","text":"

    \u90bb\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u94fe\u8868\u8282\u70b9\u8868\u793a\u9876\u70b9\u3002\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff08\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u9876\u70b9\uff09\u3002\u56fe 9-6 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f7f\u7528\u90bb\u63a5\u8868\u5b58\u50a8\u7684\u56fe\u7684\u793a\u4f8b\u3002

    \u56fe 9-6 \u00a0 \u56fe\u7684\u90bb\u63a5\u8868\u8868\u793a

    \u90bb\u63a5\u8868\u4ec5\u5b58\u50a8\u5b9e\u9645\u5b58\u5728\u7684\u8fb9\uff0c\u800c\u8fb9\u7684\u603b\u6570\u901a\u5e38\u8fdc\u5c0f\u4e8e \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002\u7136\u800c\uff0c\u5728\u90bb\u63a5\u8868\u4e2d\u9700\u8981\u901a\u8fc7\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u5176\u65f6\u95f4\u6548\u7387\u4e0d\u5982\u90bb\u63a5\u77e9\u9635\u3002

    \u89c2\u5bdf\u56fe 9-6 \uff0c\u90bb\u63a5\u8868\u7ed3\u6784\u4e0e\u54c8\u5e0c\u8868\u4e2d\u7684\u201c\u94fe\u5f0f\u5730\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u4eec\u4e5f\u53ef\u4ee5\u91c7\u7528\u7c7b\u4f3c\u7684\u65b9\u6cd5\u6765\u4f18\u5316\u6548\u7387\u3002\u6bd4\u5982\u5f53\u94fe\u8868\u8f83\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u5316\u4e3a AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u6548\u7387\u4ece \\(O(n)\\) \u4f18\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u8fd8\u53ef\u4ee5\u628a\u94fe\u8868\u8f6c\u6362\u4e3a\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

    "},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u56fe\u7684\u5e38\u89c1\u5e94\u7528","text":"

    \u5982\u8868 9-1 \u6240\u793a\uff0c\u8bb8\u591a\u73b0\u5b9e\u7cfb\u7edf\u53ef\u4ee5\u7528\u56fe\u6765\u5efa\u6a21\uff0c\u76f8\u5e94\u7684\u95ee\u9898\u4e5f\u53ef\u4ee5\u7ea6\u5316\u4e3a\u56fe\u8ba1\u7b97\u95ee\u9898\u3002

    \u8868 9-1 \u00a0 \u73b0\u5b9e\u751f\u6d3b\u4e2d\u5e38\u89c1\u7684\u56fe

    \u9876\u70b9 \u8fb9 \u56fe\u8ba1\u7b97\u95ee\u9898 \u793e\u4ea4\u7f51\u7edc \u7528\u6237 \u597d\u53cb\u5173\u7cfb \u6f5c\u5728\u597d\u53cb\u63a8\u8350 \u5730\u94c1\u7ebf\u8def \u7ad9\u70b9 \u7ad9\u70b9\u95f4\u7684\u8fde\u901a\u6027 \u6700\u77ed\u8def\u7ebf\u63a8\u8350 \u592a\u9633\u7cfb \u661f\u4f53 \u661f\u4f53\u95f4\u7684\u4e07\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8f68\u9053\u8ba1\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u56fe\u7684\u57fa\u7840\u64cd\u4f5c","text":"

    \u56fe\u7684\u57fa\u7840\u64cd\u4f5c\u53ef\u5206\u4e3a\u5bf9\u201c\u8fb9\u201d\u7684\u64cd\u4f5c\u548c\u5bf9\u201c\u9876\u70b9\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u4e24\u79cd\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5b9e\u73b0\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

    "},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u7684\u5b9e\u73b0","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \u7684\u65e0\u5411\u56fe\uff0c\u5219\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u5f0f\u5982\u56fe 9-7 \u6240\u793a\u3002

    • \u6dfb\u52a0\u6216\u5220\u9664\u8fb9\uff1a\u76f4\u63a5\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u800c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u9700\u8981\u540c\u65f6\u66f4\u65b0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
    • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u7684\u5c3e\u90e8\u6dfb\u52a0\u4e00\u884c\u4e00\u5217\uff0c\u5e76\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
    • \u5220\u9664\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u4e00\u884c\u4e00\u5217\u3002\u5f53\u5220\u9664\u9996\u884c\u9996\u5217\u65f6\u8fbe\u5230\u6700\u5dee\u60c5\u51b5\uff0c\u9700\u8981\u5c06 \\((n-1)^2\\) \u4e2a\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52a8\u201d\uff0c\u4ece\u800c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u521d\u59cb\u5316\uff1a\u4f20\u5165 \\(n\\) \u4e2a\u9876\u70b9\uff0c\u521d\u59cb\u5316\u957f\u5ea6\u4e3a \\(n\\) \u7684\u9876\u70b9\u5217\u8868 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u90bb\u63a5\u77e9\u9635 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    \u521d\u59cb\u5316\u90bb\u63a5\u77e9\u9635\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

    \u56fe 9-7 \u00a0 \u90bb\u63a5\u77e9\u9635\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

    \u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
    class GraphAdjMat:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u6dfb\u52a0\u9876\u70b9\n        for val in vertices:\n            self.add_vertex(val)\n        # \u6dfb\u52a0\u8fb9\n        # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        n = self.size()\n        # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\n        print(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\n        print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        print_matrix(self.adj_mat)\n
    graph_adjacency_matrix.cpp
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    void print() {\n        cout << \"\u9876\u70b9\u5217\u8868 = \";\n        printVector(vertices);\n        cout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
    graph_adjacency_matrix.java
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void print() {\n        System.out.print(\"\u9876\u70b9\u5217\u8868 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.cs
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void Print() {\n        Console.Write(\"\u9876\u70b9\u5217\u8868 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.go
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjMat struct {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vertices []int\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u6dfb\u52a0\u9876\u70b9\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u56fe\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
    graph_adjacency_matrix.swift
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.append(val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    func print() {\n        Swift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
    graph_adjacency_matrix.js
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print() {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.ts
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices: number[]; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print(): void {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.dart
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9876\u70b9\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u6dfb\u52a0\u9876\u70b9\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    vertices.add(val);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    vertices.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n  void printAdjMat() {\n    print(\"\u9876\u70b9\u5217\u8868 = $vertices\");\n    print(\"\u90bb\u63a5\u77e9\u9635 = \");\n    printMatrix(adjMat);\n  }\n}\n
    graph_adjacency_matrix.rs
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjMat {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    pub fn print(&self) {\n        println!(\"\u9876\u70b9\u5217\u8868 = {:?}\", self.vertices);\n        println!(\"\u90bb\u63a5\u77e9\u9635 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
    graph_adjacency_matrix.c
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u56fe\u7684\u9876\u70b9\u6570\u91cf\u5df2\u8fbe\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u6dfb\u52a0\u7b2c n \u4e2a\u9876\u70b9\uff0c\u5e76\u5c06\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9876\u70b9\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9876\u70b9\u5217\u8868 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u90bb\u63a5\u77e9\u9635 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
    graph_adjacency_matrix.kt
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    fun print() {\n        print(\"\u9876\u70b9\u5217\u8868 = \")\n        println(vertices)\n        println(\"\u90bb\u63a5\u77e9\u9635 =\")\n        printMatrix(adjMat)\n    }\n}\n
    graph_adjacency_matrix.rb
    ### \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u6784\u9020\u65b9\u6cd5 ###\n    # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @vertices = []\n    # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u6dfb\u52a0\u9876\u70b9\n    vertices.each { |val| add_vertex(val) }\n    # \u6dfb\u52a0\u8fb9\n    # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    @vertices << val\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    @vertices.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u77e9\u9635 ###\n  def __print__\n    puts \"\u9876\u70b9\u5217\u8868 = #{@vertices}\"\n    puts '\u90bb\u63a5\u77e9\u9635 ='\n    print_matrix(@adj_mat)\n  end\nend\n
    graph_adjacency_matrix.zig
    [class]{GraphAdjMat}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u8868\u7684\u5b9e\u73b0","text":"

    \u8bbe\u65e0\u5411\u56fe\u7684\u9876\u70b9\u603b\u6570\u4e3a \\(n\\)\u3001\u8fb9\u603b\u6570\u4e3a \\(m\\) \uff0c\u5219\u53ef\u6839\u636e\u56fe 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5b9e\u73b0\u5404\u79cd\u64cd\u4f5c\u3002

    • \u6dfb\u52a0\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u7684\u672b\u5c3e\u6dfb\u52a0\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u4e3a\u662f\u65e0\u5411\u56fe\uff0c\u6240\u4ee5\u9700\u8981\u540c\u65f6\u6dfb\u52a0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
    • \u5220\u9664\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u4e2d\u67e5\u627e\u5e76\u5220\u9664\u6307\u5b9a\u8fb9\uff0c\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\u3002\u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u9700\u8981\u540c\u65f6\u5220\u9664\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
    • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u94fe\u8868\uff0c\u5e76\u5c06\u65b0\u589e\u9876\u70b9\u4f5c\u4e3a\u94fe\u8868\u5934\u8282\u70b9\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
    • \u5220\u9664\u9876\u70b9\uff1a\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5220\u9664\u5305\u542b\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
    • \u521d\u59cb\u5316\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u521b\u5efa \\(n\\) \u4e2a\u9876\u70b9\u548c \\(2m\\) \u6761\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
    \u521d\u59cb\u5316\u90bb\u63a5\u8868\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

    \u56fe 9-8 \u00a0 \u90bb\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

    \u4ee5\u4e0b\u662f\u90bb\u63a5\u8868\u7684\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u6bd4\u56fe 9-8 \uff0c\u5b9e\u9645\u4ee3\u7801\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

    • \u4e3a\u4e86\u65b9\u4fbf\u6dfb\u52a0\u4e0e\u5220\u9664\u9876\u70b9\uff0c\u4ee5\u53ca\u7b80\u5316\u4ee3\u7801\uff0c\u6211\u4eec\u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u6765\u4ee3\u66ff\u94fe\u8868\u3002
    • \u4f7f\u7528\u54c8\u5e0c\u8868\u6765\u5b58\u50a8\u90bb\u63a5\u8868\uff0ckey \u4e3a\u9876\u70b9\u5b9e\u4f8b\uff0cvalue \u4e3a\u8be5\u9876\u70b9\u7684\u90bb\u63a5\u9876\u70b9\u5217\u8868\uff08\u94fe\u8868\uff09\u3002

    \u53e6\u5916\uff0c\u6211\u4eec\u5728\u90bb\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u7c7b\u6765\u8868\u793a\u9876\u70b9\uff0c\u8fd9\u6837\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u4e0e\u90bb\u63a5\u77e9\u9635\u4e00\u6837\uff0c\u7528\u5217\u8868\u7d22\u5f15\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\uff0c\u90a3\u4e48\u5047\u8bbe\u8981\u5220\u9664\u7d22\u5f15\u4e3a \\(i\\) \u7684\u9876\u70b9\uff0c\u5219\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5c06\u6240\u6709\u5927\u4e8e \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u51cf \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u4e2a\u9876\u70b9\u90fd\u662f\u552f\u4e00\u7684 Vertex \u5b9e\u4f8b\uff0c\u5220\u9664\u67d0\u4e00\u9876\u70b9\u4e4b\u540e\u5c31\u65e0\u987b\u6539\u52a8\u5176\u4ed6\u9876\u70b9\u4e86\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
    class GraphAdjList:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.pop(vet)\n        # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\n        print(\"\u90bb\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
    graph_adjacency_list.cpp
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  public:\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.erase(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    void print() {\n        cout << \"\u90bb\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
    graph_adjacency_list.java
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u90bb\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
    graph_adjacency_list.cs
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.Add(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.Remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u90bb\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
    graph_adjacency_list.go
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjList struct {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList map[Vertex][]Vertex\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    delete(g.adjList, vet)\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
    graph_adjacency_list.swift
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = []\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.removeValue(forKey: vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u90bb\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
    graph_adjacency_list.js
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print() {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
    graph_adjacency_list.ts
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print(): void {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
    graph_adjacency_list.dart
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    adjList[vet] = [];\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    adjList.remove(vet);\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u90bb\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
    graph_adjacency_list.rs
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.remove(&vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u90bb\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
    graph_adjacency_list.c
    /* \u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9876\u70b9\n    struct AdjListNode *next; // \u540e\u7ee7\u8282\u70b9\n} AdjListNode;\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u5934\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u5220\u9664\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u94fe\u8868\u4e2d\u641c\u7d22 vet \u5bf9\u5e94\u8282\u70b9\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c06 vet \u5bf9\u5e94\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\n    pre->next = cur->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(cur);\n}\n\n/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u8282\u70b9\u6570\u7ec4\n    int size;                     // \u8282\u70b9\u6570\u91cf\n} GraphAdjList;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    graph->heads[graph->size++] = head;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c06\u8be5\u9876\u70b9\u4e4b\u540e\u7684\u9876\u70b9\u5411\u524d\u79fb\u52a8\uff0c\u4ee5\u586b\u8865\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
    graph_adjacency_list.kt
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    fun print() {\n        println(\"\u90bb\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
    graph_adjacency_list.rb
    ### \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(edges)\n    # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    @adj_list = {}\n    # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u5220\u9664\u8fb9 vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    @adj_list[vet] = []\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    @adj_list.delete(vet)\n    # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u8868 ###\n  def __print__\n    puts '\u90bb\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

    \u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\u8868 9-2 \u5bf9\u6bd4\u4e86\u90bb\u63a5\u77e9\u9635\u548c\u90bb\u63a5\u8868\u7684\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u3002

    \u8868 9-2 \u00a0 \u90bb\u63a5\u77e9\u9635\u4e0e\u90bb\u63a5\u8868\u5bf9\u6bd4

    \u90bb\u63a5\u77e9\u9635 \u90bb\u63a5\u8868\uff08\u94fe\u8868\uff09 \u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09 \u5224\u65ad\u662f\u5426\u90bb\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u8fb9 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u8fb9 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u9876\u70b9 \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u9876\u70b9 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u5185\u5b58\u7a7a\u95f4\u5360\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

    \u89c2\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09\u7684\u65f6\u95f4\u6548\u7387\u4e0e\u7a7a\u95f4\u6548\u7387\u6700\u4f18\u3002\u4f46\u5b9e\u9645\u4e0a\uff0c\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u64cd\u4f5c\u8fb9\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u6570\u7ec4\u8bbf\u95ee\u6216\u8d4b\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7efc\u5408\u6765\u770b\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u7684\u539f\u5219\uff0c\u800c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u7684\u539f\u5219\u3002

    "},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u56fe\u7684\u904d\u5386","text":"

    \u6811\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5bf9\u591a\u201d\u7684\u5173\u7cfb\uff0c\u800c\u56fe\u5219\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5bf9\u591a\u201d\u5173\u7cfb\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u6811\u770b\u4f5c\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\u3002\u663e\u7136\uff0c\u6811\u7684\u904d\u5386\u64cd\u4f5c\u4e5f\u662f\u56fe\u7684\u904d\u5386\u64cd\u4f5c\u7684\u4e00\u79cd\u7279\u4f8b\u3002

    \u56fe\u548c\u6811\u90fd\u9700\u8981\u5e94\u7528\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u904d\u5386\u64cd\u4f5c\u3002\u56fe\u7684\u904d\u5386\u65b9\u5f0f\u4e5f\u53ef\u5206\u4e3a\u4e24\u79cd\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u548c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

    "},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5e7f\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u4ece\u67d0\u4e2a\u8282\u70b9\u51fa\u53d1\uff0c\u59cb\u7ec8\u4f18\u5148\u8bbf\u95ee\u8ddd\u79bb\u6700\u8fd1\u7684\u9876\u70b9\uff0c\u5e76\u4e00\u5c42\u5c42\u5411\u5916\u6269\u5f20\u3002\u5982\u56fe 9-9 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u9996\u5148\u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u7136\u540e\u904d\u5386\u4e0b\u4e00\u4e2a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u8bbf\u95ee\u5b8c\u6bd5\u3002

    \u56fe 9-9 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386

    "},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

    BFS \u901a\u5e38\u501f\u52a9\u961f\u5217\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002\u961f\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8d28\uff0c\u8fd9\u4e0e BFS \u7684\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u601d\u60f3\u5f02\u66f2\u540c\u5de5\u3002

    1. \u5c06\u904d\u5386\u8d77\u59cb\u9876\u70b9 startVet \u52a0\u5165\u961f\u5217\uff0c\u5e76\u5f00\u542f\u5faa\u73af\u3002
    2. \u5728\u5faa\u73af\u7684\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\uff0c\u5f39\u51fa\u961f\u9996\u9876\u70b9\u5e76\u8bb0\u5f55\u8bbf\u95ee\uff0c\u7136\u540e\u5c06\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u52a0\u5165\u5230\u961f\u5217\u5c3e\u90e8\u3002
    3. \u5faa\u73af\u6b65\u9aa4 2. \uff0c\u76f4\u5230\u6240\u6709\u9876\u70b9\u88ab\u8bbf\u95ee\u5b8c\u6bd5\u540e\u7ed3\u675f\u3002

    \u4e3a\u4e86\u9632\u6b62\u91cd\u590d\u904d\u5386\u9876\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\u3002

    Tip

    \u54c8\u5e0c\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u53ea\u5b58\u50a8 key \u800c\u4e0d\u5b58\u50a8 value \u7684\u54c8\u5e0c\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fdb\u884c key \u7684\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u636e key \u7684\u552f\u4e00\u6027\uff0c\u54c8\u5e0c\u96c6\u5408\u901a\u5e38\u7528\u4e8e\u6570\u636e\u53bb\u91cd\u7b49\u573a\u666f\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
    def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]([start_vet])\n    # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while len(que) > 0:\n        vet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n
    graph_bfs.cpp
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited = {startVet};\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.java
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.cs
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [startVet];\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.go
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    for len(queue) > 0 {\n        // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        res = append(res, vet)\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_bfs.swift
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = [startVet]\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_bfs.js
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.ts
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.dart
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      }\n      que.add(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    }\n  }\n  // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  return res;\n}\n
    graph_bfs.rs
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited.insert(adj_vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res\n}\n
    graph_bfs.c
    /* \u8282\u70b9\u961f\u5217\u7ed3\u6784\u4f53 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u6784\u9020\u51fd\u6570 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u961f\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u961f\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res[(*resSize)++] = vet;      // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited[(*visitedSize)++] = node->vertex; // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n            node = node->next;\n        }\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(queue);\n}\n
    graph_bfs.kt
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet)         // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet)   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_bfs.rb
    ### \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new([start_vet])\n  # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  que = [start_vet]\n  # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while que.length > 0\n    vet = que.shift # \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      que << adj_vet # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adj_vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    end\n  end\n  # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res\nend\n
    graph_bfs.zig
    [class]{}-[func]{graphBFS}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4ee3\u7801\u76f8\u5bf9\u62bd\u8c61\uff0c\u5efa\u8bae\u5bf9\u7167\u56fe 9-10 \u6765\u52a0\u6df1\u7406\u89e3\u3002

    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 9-10 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u4e0d\u552f\u4e00\u3002\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u987a\u5e8f\u904d\u5386\uff0c\u800c\u591a\u4e2a\u76f8\u540c\u8ddd\u79bb\u7684\u9876\u70b9\u7684\u904d\u5386\u987a\u5e8f\u5141\u8bb8\u88ab\u4efb\u610f\u6253\u4e71\u3002\u4ee5\u56fe 9-10 \u4e3a\u4f8b\uff0c\u9876\u70b9 \\(1\\)\u3001\\(3\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\uff0c\u9876\u70b9 \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u6362\u3002

    "},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u5165\u961f\u5e76\u51fa\u961f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u5728\u904d\u5386\u90bb\u63a5\u9876\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \uff0c\u961f\u5217 que \u4e2d\u7684\u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

    "},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u518d\u56de\u5934\u7684\u904d\u5386\u65b9\u5f0f\u3002\u5982\u56fe 9-11 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u5f53\u524d\u9876\u70b9\u7684\u67d0\u4e2a\u90bb\u63a5\u9876\u70b9\uff0c\u76f4\u5230\u8d70\u5230\u5c3d\u5934\u65f6\u8fd4\u56de\uff0c\u518d\u7ee7\u7eed\u8d70\u5230\u5c3d\u5934\u5e76\u8fd4\u56de\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u904d\u5386\u5b8c\u6210\u3002

    \u56fe 9-11 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386

    "},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

    \u8fd9\u79cd\u201c\u8d70\u5230\u5c3d\u5934\u518d\u8fd4\u56de\u201d\u7684\u7b97\u6cd5\u8303\u5f0f\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002\u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u5728\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u4e2d\uff0c\u6211\u4eec\u4e5f\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\uff0c\u4ee5\u907f\u514d\u91cd\u590d\u8bbf\u95ee\u9876\u70b9\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
    def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570\"\"\"\n    res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
    graph_dfs.cpp
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.java
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.cs
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9                             \n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.go
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u4f1a\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u987b\u8ba9\u539f\u5f15\u7528\u91cd\u65b0\u8d4b\u503c\u4e3a\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_dfs.swift
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
    graph_dfs.js
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.ts
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.dart
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    }\n    // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
    graph_dfs.rs
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n                         // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
    graph_dfs.c
    /* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    res[(*resSize)++] = vet;\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
    graph_dfs.kt
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
    graph_dfs.rb
    ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 9-12 \u6240\u793a\u3002

    • \u76f4\u865a\u7ebf\u4ee3\u8868\u5411\u4e0b\u9012\u63a8\uff0c\u8868\u793a\u5f00\u542f\u4e86\u4e00\u4e2a\u65b0\u7684\u9012\u5f52\u65b9\u6cd5\u6765\u8bbf\u95ee\u65b0\u9876\u70b9\u3002
    • \u66f2\u865a\u7ebf\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u9012\u5f52\u65b9\u6cd5\u5df2\u7ecf\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u5f00\u542f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

    \u4e3a\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8bae\u5c06\u56fe 9-12 \u4e0e\u4ee3\u7801\u7ed3\u5408\u8d77\u6765\uff0c\u5728\u8111\u4e2d\u6a21\u62df\uff08\u6216\u8005\u7528\u7b14\u753b\u4e0b\u6765\uff09\u6574\u4e2a DFS \u8fc7\u7a0b\uff0c\u5305\u62ec\u6bcf\u4e2a\u9012\u5f52\u65b9\u6cd5\u4f55\u65f6\u5f00\u542f\u3001\u4f55\u65f6\u8fd4\u56de\u3002

    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 9-12 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5e8f\u5217\u7684\u987a\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7ed9\u5b9a\u67d0\u9876\u70b9\uff0c\u5148\u5f80\u54ea\u4e2a\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u90bb\u63a5\u9876\u70b9\u7684\u987a\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e71\uff0c\u90fd\u662f\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

    \u4ee5\u6811\u7684\u904d\u5386\u4e3a\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\uff0c\u5b83\u4eec\u5c55\u793a\u4e86\u4e09\u79cd\u904d\u5386\u4f18\u5148\u7ea7\uff0c\u7136\u800c\u8fd9\u4e09\u8005\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

    "},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u6700\u5927\u4e3a \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

    "},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u56fe\u7531\u9876\u70b9\u548c\u8fb9\u7ec4\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9\u548c\u4e00\u7ec4\u8fb9\u6784\u6210\u7684\u96c6\u5408\u3002
    • \u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002
    • \u6709\u5411\u56fe\u7684\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u8fde\u901a\u56fe\u4e2d\u7684\u4efb\u610f\u9876\u70b9\u5747\u53ef\u8fbe\uff0c\u6709\u6743\u56fe\u7684\u6bcf\u6761\u8fb9\u90fd\u5305\u542b\u6743\u91cd\u53d8\u91cf\u3002
    • \u90bb\u63a5\u77e9\u9635\u5229\u7528\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u6709\u8fb9\u6216\u65e0\u8fb9\u3002\u90bb\u63a5\u77e9\u9635\u5728\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u95f4\u5360\u7528\u8f83\u591a\u3002
    • \u90bb\u63a5\u8868\u4f7f\u7528\u591a\u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u3002\u90bb\u63a5\u8868\u76f8\u5bf9\u4e8e\u90bb\u63a5\u77e9\u9635\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0c\u4f46\u7531\u4e8e\u9700\u8981\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u65f6\u95f4\u6548\u7387\u8f83\u4f4e\u3002
    • \u5f53\u90bb\u63a5\u8868\u4e2d\u7684\u94fe\u8868\u8fc7\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u5176\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6216\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002
    • \u4ece\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff0c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002
    • \u56fe\u53ef\u7528\u4e8e\u5efa\u6a21\u5404\u7c7b\u73b0\u5b9e\u7cfb\u7edf\uff0c\u5982\u793e\u4ea4\u7f51\u7edc\u3001\u5730\u94c1\u7ebf\u8def\u7b49\u3002
    • \u6811\u662f\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\uff0c\u6811\u7684\u904d\u5386\u4e5f\u662f\u56fe\u7684\u904d\u5386\u7684\u4e00\u79cd\u7279\u4f8b\u3002
    • \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u3001\u5c42\u5c42\u6269\u5f20\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u901a\u5e38\u501f\u52a9\u961f\u5217\u5b9e\u73b0\u3002
    • \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u65f6\u518d\u56de\u6eaf\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002
    "},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u8def\u5f84\u7684\u5b9a\u4e49\u662f\u9876\u70b9\u5e8f\u5217\u8fd8\u662f\u8fb9\u5e8f\u5217\uff1f

    \u7ef4\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8bed\u8a00\u7248\u672c\u7684\u5b9a\u4e49\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

    \u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f84\u88ab\u89c6\u4e3a\u4e00\u4e2a\u8fb9\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u3002\u8fd9\u662f\u56e0\u4e3a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u53ef\u80fd\u5b58\u5728\u591a\u6761\u8fb9\u8fde\u63a5\uff0c\u6b64\u65f6\u6bcf\u6761\u8fb9\u90fd\u5bf9\u5e94\u4e00\u6761\u8def\u5f84\u3002

    Q\uff1a\u975e\u8fde\u901a\u56fe\u4e2d\u662f\u5426\u4f1a\u6709\u65e0\u6cd5\u904d\u5386\u5230\u7684\u70b9\uff1f

    \u5728\u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002\u904d\u5386\u975e\u8fde\u901a\u56fe\u9700\u8981\u8bbe\u7f6e\u591a\u4e2a\u8d77\u70b9\uff0c\u4ee5\u904d\u5386\u5230\u56fe\u7684\u6240\u6709\u8fde\u901a\u5206\u91cf\u3002

    Q\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\uff0c\u201c\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u6240\u6709\u9876\u70b9\u201d\u7684\u9876\u70b9\u987a\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

    \u53ef\u4ee5\u662f\u4efb\u610f\u987a\u5e8f\u3002\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u89c4\u5219\u6765\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9876\u70b9\u6dfb\u52a0\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9876\u70b9\u503c\u5927\u5c0f\u7684\u987a\u5e8f\u7b49\uff0c\u8fd9\u6837\u6709\u52a9\u4e8e\u5feb\u901f\u67e5\u627e\u201c\u5e26\u6709\u67d0\u79cd\u6781\u503c\u201d\u7684\u9876\u70b9\u3002

    "},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8d2a\u5fc3","text":"

    Abstract

    \u5411\u65e5\u8475\u671d\u7740\u592a\u9633\u8f6c\u52a8\uff0c\u65f6\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u957f\u7684\u6700\u5927\u53ef\u80fd\u3002

    \u8d2a\u5fc3\u7b56\u7565\u5728\u4e00\u8f6e\u8f6e\u7684\u7b80\u5355\u9009\u62e9\u4e2d\uff0c\u9010\u6b65\u5bfc\u5411\u6700\u4f73\u7b54\u6848\u3002

    "},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5
    • 15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898
    • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898
    • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898
    • 15.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u4ef7\u503c\u6839\u636e\u9009\u62e9\u7684\u91cd\u91cf\u6bd4\u4f8b\u8ba1\u7b97\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 15-3 \u6240\u793a\u3002

    \u56fe 15-3 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    \u5206\u6570\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u6574\u4f53\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72b6\u6001\u5305\u542b\u5f53\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6807\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u4ef7\u503c\u3002

    \u4e0d\u540c\u70b9\u5728\u4e8e\uff0c\u672c\u9898\u5141\u8bb8\u53ea\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u56fe 15-4 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u7269\u54c1\u4efb\u610f\u5730\u8fdb\u884c\u5207\u5206\uff0c\u5e76\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u6765\u8ba1\u7b97\u76f8\u5e94\u4ef7\u503c\u3002

    1. \u5bf9\u4e8e\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c\u4e3a \\(val[i-1] / wgt[i-1]\\) \uff0c\u7b80\u79f0\u5355\u4f4d\u4ef7\u503c\u3002
    2. \u5047\u8bbe\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u4e3a \\(w\\) \uff0c\u5219\u80cc\u5305\u589e\u52a0\u7684\u4ef7\u503c\u4e3a \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

    \u56fe 15-4 \u00a0 \u7269\u54c1\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

    \u6700\u5927\u5316\u80cc\u5305\u5185\u7269\u54c1\u603b\u4ef7\u503c\uff0c\u672c\u8d28\u4e0a\u662f\u6700\u5927\u5316\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u4ef7\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u56fe 15-5 \u6240\u793a\u7684\u8d2a\u5fc3\u7b56\u7565\u3002

    1. \u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\u3002
    2. \u904d\u5386\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f6e\u8d2a\u5fc3\u5730\u9009\u62e9\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
    3. \u82e5\u5269\u4f59\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u4f7f\u7528\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6ee1\u80cc\u5305\u3002

    \u56fe 15-5 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u6211\u4eec\u5efa\u7acb\u4e86\u4e00\u4e2a\u7269\u54c1\u7c7b Item \uff0c\u4ee5\u4fbf\u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u8fdb\u884c\u6392\u5e8f\u3002\u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u5f53\u80cc\u5305\u5df2\u6ee1\u65f6\u8df3\u51fa\u5e76\u8fd4\u56de\u89e3\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig fractional_knapsack.py
    class Item:\n    \"\"\"\u7269\u54c1\"\"\"\n\n    def __init__(self, w: int, v: int):\n        self.w = w  # \u7269\u54c1\u91cd\u91cf\n        self.v = v  # \u7269\u54c1\u4ef7\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n    return res\n
    fractional_knapsack.cpp
    /* \u7269\u54c1 */\nclass Item {\n  public:\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    vector<Item> items;\n    for (int i = 0; i < wgt.size(); i++) {\n        items.push_back(Item(wgt[i], val[i]));\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.java
    /* \u7269\u54c1 */\nclass Item {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.length];\n    for (int i = 0; i < wgt.length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.cs
    /* \u7269\u54c1 */\nclass Item(int w, int v) {\n    public int w = w; // \u7269\u54c1\u91cd\u91cf\n    public int v = v; // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.Length];\n    for (int i = 0; i < wgt.Length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.go
    /* \u7269\u54c1 */\ntype Item struct {\n    w int // \u7269\u54c1\u91cd\u91cf\n    v int // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items := make([]Item, len(wgt))\n    for i := 0; i < len(wgt); i++ {\n        items[i] = Item{wgt[i], val[i]}\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort.Slice(items, func(i, j int) bool {\n        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)\n    })\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.swift
    /* \u7269\u54c1 */\nclass Item {\n    var w: Int // \u7269\u54c1\u91cd\u91cf\n    var v: Int // \u7269\u54c1\u4ef7\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.js
    /* \u7269\u54c1 */\nclass Item {\n    constructor(w, v) {\n        this.w = w; // \u7269\u54c1\u91cd\u91cf\n        this.v = v; // \u7269\u54c1\u4ef7\u503c\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.ts
    /* \u7269\u54c1 */\nclass Item {\n    w: number; // \u7269\u54c1\u91cd\u91cf\n    v: number; // \u7269\u54c1\u4ef7\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.dart
    /* \u7269\u54c1 */\nclass Item {\n  int w; // \u7269\u54c1\u91cd\u91cf\n  int v; // \u7269\u54c1\u4ef7\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n      break;\n    }\n  }\n  return res;\n}\n
    fractional_knapsack.rs
    /* \u7269\u54c1 */\nstruct Item {\n    w: i32, // \u7269\u54c1\u91cd\u91cf\n    v: i32, // \u7269\u54c1\u4ef7\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    let mut items = wgt\n        .iter()\n        .zip(val.iter())\n        .map(|(&w, &v)| Item::new(w, v))\n        .collect::<Vec<Item>>();\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort_by(|a, b| {\n        (b.v as f64 / b.w as f64)\n            .partial_cmp(&(a.v as f64 / a.w as f64))\n            .unwrap()\n    });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    res\n}\n
    fractional_knapsack.c
    /* \u7269\u54c1 */\ntypedef struct {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n} Item;\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item *items = malloc(sizeof(Item) * itemCount);\n    for (int i = 0; i < itemCount; i++) {\n        items[i] = (Item){.w = wgt[i], .v = val[i]};\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (float)cap / items[i].w * items[i].v;\n            cap = 0;\n            break;\n        }\n    }\n    free(items);\n    return res;\n}\n
    fractional_knapsack.kt
    /* \u7269\u54c1 */\nclass Item(\n    val w: Int, // \u7269\u54c1\n    val v: Int  // \u7269\u54c1\u4ef7\u503c\n)\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var cap = c\n    val items = arrayOfNulls<Item>(wgt.size)\n    for (i in wgt.indices) {\n        items[i] = Item(wgt[i], _val[i])\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.rb
    ### \u7269\u54c1 ###\nclass Item\n  attr_accessor :w # \u7269\u54c1\u91cd\u91cf\n  attr_accessor :v # \u7269\u54c1\u4ef7\u503c\n\n  def initialize(w, v)\n    @w = w\n    @v = v\n  end\nend\n\n### \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 ###\ndef fractional_knapsack(wgt, val, cap)\n  # \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\uff0c\u4ef7\u503c\n  items = wgt.each_with_index.map { |w, i| Item.new(w, val[i]) }\n  # \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n  items.sort! { |a, b| (b.v.to_f / b.w) <=> (a.v.to_f / a.w) }\n  # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n  res = 0\n  for item in items\n    if item.w <= cap\n      # \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n      res += item.v\n      cap -= item.w\n    else\n      # \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n      res += (item.v.to_f / item.w) * cap\n      # \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n      break\n    end\n  end\n  res\nend\n
    fractional_knapsack.zig
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u9700\u8981\u904d\u5386\u6574\u4e2a\u7269\u54c1\u5217\u8868\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u7269\u54c1\u6570\u91cf\u3002

    \u7531\u4e8e\u521d\u59cb\u5316\u4e86\u4e00\u4e2a Item \u5bf9\u8c61\u5217\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

    \u91c7\u7528\u53cd\u8bc1\u6cd5\u3002\u5047\u8bbe\u7269\u54c1 \\(x\\) \u662f\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u4ef7\u503c\u4e3a res \uff0c\u4f46\u8be5\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u73b0\u5728\u4ece\u80cc\u5305\u4e2d\u62ff\u51fa\u5355\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u5e76\u66ff\u6362\u4e3a\u5355\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u4e8e\u7269\u54c1 \\(x\\) \u7684\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u6362\u540e\u7684\u603b\u4ef7\u503c\u4e00\u5b9a\u5927\u4e8e res \u3002\u8fd9\u4e0e res \u662f\u6700\u4f18\u89e3\u77db\u76fe\uff0c\u8bf4\u660e\u6700\u4f18\u89e3\u4e2d\u5fc5\u987b\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u5bf9\u4e8e\u8be5\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u6784\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u603b\u800c\u8a00\u4e4b\uff0c\u5355\u4f4d\u4ef7\u503c\u66f4\u5927\u7684\u7269\u54c1\u603b\u662f\u66f4\u4f18\u9009\u62e9\uff0c\u8fd9\u8bf4\u660e\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    \u5982\u56fe 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c06\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u5355\u4f4d\u4ef7\u503c\u5206\u522b\u770b\u4f5c\u4e00\u5f20\u4e8c\u7ef4\u56fe\u8868\u7684\u6a2a\u8f74\u548c\u7eb5\u8f74\uff0c\u5219\u5206\u6570\u80cc\u5305\u95ee\u9898\u53ef\u8f6c\u5316\u4e3a\u201c\u6c42\u5728\u6709\u9650\u6a2a\u8f74\u533a\u95f4\u4e0b\u56f4\u6210\u7684\u6700\u5927\u9762\u79ef\u201d\u3002\u8fd9\u4e2a\u7c7b\u6bd4\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u4ece\u51e0\u4f55\u89d2\u5ea6\u7406\u89e3\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

    \u56fe 15-6 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u51e0\u4f55\u8868\u793a

    "},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5","text":"

    \u8d2a\u5fc3\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u7684\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u95ee\u9898\u7684\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\uff0c\u90fd\u9009\u62e9\u5f53\u524d\u770b\u8d77\u6765\u6700\u4f18\u7684\u9009\u62e9\uff0c\u5373\u8d2a\u5fc3\u5730\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002\u8d2a\u5fc3\u7b97\u6cd5\u7b80\u6d01\u4e14\u9ad8\u6548\uff0c\u5728\u8bb8\u591a\u5b9e\u9645\u95ee\u9898\u4e2d\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\u3002

    \u8d2a\u5fc3\u7b97\u6cd5\u548c\u52a8\u6001\u89c4\u5212\u90fd\u5e38\u7528\u4e8e\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u3002\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u5904\uff0c\u6bd4\u5982\u90fd\u4f9d\u8d56\u6700\u4f18\u5b50\u7ed3\u6784\u6027\u8d28\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

    • \u52a8\u6001\u89c4\u5212\u4f1a\u6839\u636e\u4e4b\u524d\u9636\u6bb5\u7684\u6240\u6709\u51b3\u7b56\u6765\u8003\u8651\u5f53\u524d\u51b3\u7b56\uff0c\u5e76\u4f7f\u7528\u8fc7\u53bb\u5b50\u95ee\u9898\u7684\u89e3\u6765\u6784\u5efa\u5f53\u524d\u5b50\u95ee\u9898\u7684\u89e3\u3002
    • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4f1a\u8003\u8651\u8fc7\u53bb\u7684\u51b3\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u4e0d\u65ad\u7f29\u5c0f\u95ee\u9898\u8303\u56f4\uff0c\u76f4\u81f3\u95ee\u9898\u88ab\u89e3\u51b3\u3002

    \u6211\u4eec\u5148\u901a\u8fc7\u4f8b\u9898\u201c\u96f6\u94b1\u5151\u6362\u201d\u4e86\u89e3\u8d2a\u5fc3\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u8fd9\u9053\u9898\u5df2\u7ecf\u5728\u201c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u76f8\u4fe1\u4f60\u5bf9\u5b83\u5e76\u4e0d\u964c\u751f\u3002

    Question

    \u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    \u672c\u9898\u91c7\u53d6\u7684\u8d2a\u5fc3\u7b56\u7565\u5982\u56fe 15-1 \u6240\u793a\u3002\u7ed9\u5b9a\u76ee\u6807\u91d1\u989d\uff0c\u6211\u4eec\u8d2a\u5fc3\u5730\u9009\u62e9\u4e0d\u5927\u4e8e\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e01\uff0c\u4e0d\u65ad\u5faa\u73af\u8be5\u6b65\u9aa4\uff0c\u76f4\u81f3\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u4e3a\u6b62\u3002

    \u56fe 15-1 \u00a0 \u96f6\u94b1\u5151\u6362\u7684\u8d2a\u5fc3\u7b56\u7565

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
    def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
    coin_change_greedy.cpp
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.java
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.cs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.go
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
    coin_change_greedy.swift
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
    coin_change_greedy.js
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.ts
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.dart
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9009\u62e9 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.rs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
    coin_change_greedy.c
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.kt
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
    coin_change_greedy.rb
    ### \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 ###\ndef coin_change_greedy(coins, amt)\n  # \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n  i = coins.length - 1\n  count = 0\n  # \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n  while amt > 0\n    # \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n    while i > 0 && coins[i] > amt\n      i -= 1\n    end\n    # \u9009\u62e9 coins[i]\n    amt -= coins[i]\n    count += 1\n  end\n  # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c \u5219\u8fd4\u56de -1\n  amt == 0 ? count : -1\nend\n
    coin_change_greedy.zig
    [class]{}-[func]{coinChangeGreedy}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4f60\u53ef\u80fd\u4f1a\u4e0d\u7531\u5730\u53d1\u51fa\u611f\u53f9\uff1aSo clean \uff01\u8d2a\u5fc3\u7b97\u6cd5\u4ec5\u7528\u7ea6\u5341\u884c\u4ee3\u7801\u5c31\u89e3\u51b3\u4e86\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u64cd\u4f5c\u76f4\u63a5\u3001\u5b9e\u73b0\u7b80\u5355\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u4ee3\u7801\u4e2d\uff0c\u8bb0\u786c\u5e01\u6700\u5c0f\u9762\u503c\u4e3a \\(\\min(coins)\\) \uff0c\u5219\u8d2a\u5fc3\u9009\u62e9\u6700\u591a\u5faa\u73af \\(amt / \\min(coins)\\) \u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(amt / \\min(coins))\\) \u3002\u8fd9\u6bd4\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u4e2a\u6570\u91cf\u7ea7\u3002

    \u7136\u800c\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u9762\u503c\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5e76\u4e0d\u80fd\u627e\u5230\u6700\u4f18\u89e3\u3002\u56fe 15-2 \u7ed9\u51fa\u4e86\u4e24\u4e2a\u793a\u4f8b\u3002

    • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8be5\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u7ed9\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3\u3002
    • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8bbe \\(amt = 60\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(11\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(20 + 20 + 20\\) \uff0c\u4ec5\u9700 \\(3\\) \u679a\u786c\u5e01\u3002
    • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8bbe \\(amt = 98\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(49\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(49 + 49\\) \uff0c\u4ec5\u9700 \\(2\\) \u679a\u786c\u5e01\u3002

    \u56fe 15-2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u627e\u51fa\u6700\u4f18\u89e3\u7684\u793a\u4f8b

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5bf9\u4e8e\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u4fdd\u8bc1\u627e\u5230\u5168\u5c40\u6700\u4f18\u89e3\uff0c\u5e76\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\u3002

    \u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u9002\u7528\u60c5\u51b5\u5206\u4ee5\u4e0b\u4e24\u79cd\u3002

    1. \u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u5f80\u5f80\u662f\u6700\u4f18\u9009\u62e9\uff0c\u56e0\u4e3a\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u66f4\u9ad8\u6548\u3002
    2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5bf9\u4e8e\u5f88\u591a\u590d\u6742\u95ee\u9898\u6765\u8bf4\uff0c\u5bfb\u627e\u5168\u5c40\u6700\u4f18\u89e3\u975e\u5e38\u56f0\u96be\uff0c\u80fd\u4ee5\u8f83\u9ad8\u6548\u7387\u627e\u5230\u6b21\u4f18\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u9519\u7684\u3002
    "},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7279\u6027","text":"

    \u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff0c\u4ec0\u4e48\u6837\u7684\u95ee\u9898\u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8bf4\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1f

    \u76f8\u8f83\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f7f\u7528\u6761\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u5173\u6ce8\u95ee\u9898\u7684\u4e24\u4e2a\u6027\u8d28\u3002

    • \u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\uff1a\u53ea\u6709\u5f53\u5c40\u90e8\u6700\u4f18\u9009\u62e9\u59cb\u7ec8\u53ef\u4ee5\u5bfc\u81f4\u5168\u5c40\u6700\u4f18\u89e3\u65f6\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u624d\u80fd\u4fdd\u8bc1\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u5305\u542b\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u3002

    \u6700\u4f18\u5b50\u7ed3\u6784\u5df2\u7ecf\u5728\u201c\u52a8\u6001\u89c4\u5212\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u95ee\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\u5e76\u4e0d\u660e\u663e\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u89e3\u51b3\u3002

    \u6211\u4eec\u4e3b\u8981\u63a2\u7a76\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u5224\u65ad\u65b9\u6cd5\u3002\u867d\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f83\u7b80\u5355\uff0c\u4f46\u5b9e\u9645\u4e0a\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\uff0c\u8bc1\u660e\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u5e76\u975e\u6613\u4e8b\u3002

    \u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u6211\u4eec\u867d\u7136\u80fd\u591f\u5bb9\u6613\u5730\u4e3e\u51fa\u53cd\u4f8b\uff0c\u5bf9\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u8fdb\u884c\u8bc1\u4f2a\uff0c\u4f46\u8bc1\u5b9e\u7684\u96be\u5ea6\u8f83\u5927\u3002\u5982\u679c\u95ee\uff1a\u6ee1\u8db3\u4ec0\u4e48\u6761\u4ef6\u7684\u786c\u5e01\u7ec4\u5408\u53ef\u4ee5\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u4eec\u5f80\u5f80\u53ea\u80fd\u51ed\u501f\u76f4\u89c9\u6216\u4e3e\u4f8b\u5b50\u6765\u7ed9\u51fa\u4e00\u4e2a\u6a21\u68f1\u4e24\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96be\u4ee5\u7ed9\u51fa\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\u3002

    Quote

    \u6709\u4e00\u7bc7\u8bba\u6587\u7ed9\u51fa\u4e86\u4e00\u4e2a \\(O(n^3)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u7b97\u6cd5\uff0c\u7528\u4e8e\u5224\u65ad\u4e00\u4e2a\u786c\u5e01\u7ec4\u5408\u80fd\u5426\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u989d\u7684\u6700\u4f18\u89e3\u3002

    Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

    "},{"location":"chapter_greedy/greedy_algorithm/#1513","title":"15.1.3 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u89e3\u9898\u6b65\u9aa4","text":"

    \u8d2a\u5fc3\u95ee\u9898\u7684\u89e3\u51b3\u6d41\u7a0b\u5927\u4f53\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e09\u6b65\u3002

    1. \u95ee\u9898\u5206\u6790\uff1a\u68b3\u7406\u4e0e\u7406\u89e3\u95ee\u9898\u7279\u6027\uff0c\u5305\u62ec\u72b6\u6001\u5b9a\u4e49\u3001\u4f18\u5316\u76ee\u6807\u548c\u7ea6\u675f\u6761\u4ef6\u7b49\u3002\u8fd9\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52a8\u6001\u89c4\u5212\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
    2. \u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\uff1a\u786e\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8d2a\u5fc3\u9009\u62e9\u3002\u8fd9\u4e2a\u7b56\u7565\u80fd\u591f\u5728\u6bcf\u4e00\u6b65\u51cf\u5c0f\u95ee\u9898\u7684\u89c4\u6a21\uff0c\u5e76\u6700\u7ec8\u89e3\u51b3\u6574\u4e2a\u95ee\u9898\u3002
    3. \u6b63\u786e\u6027\u8bc1\u660e\uff1a\u901a\u5e38\u9700\u8981\u8bc1\u660e\u95ee\u9898\u5177\u6709\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8fd9\u4e2a\u6b65\u9aa4\u53ef\u80fd\u9700\u8981\u7528\u5230\u6570\u5b66\u8bc1\u660e\uff0c\u4f8b\u5982\u5f52\u7eb3\u6cd5\u6216\u53cd\u8bc1\u6cd5\u7b49\u3002

    \u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6c42\u89e3\u95ee\u9898\u7684\u6838\u5fc3\u6b65\u9aa4\uff0c\u4f46\u5b9e\u65bd\u8d77\u6765\u53ef\u80fd\u5e76\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e0d\u540c\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\u7684\u5dee\u5f02\u8f83\u5927\u3002\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\u6765\u8bf4\uff0c\u8d2a\u5fc3\u7b56\u7565\u6bd4\u8f83\u6d45\u663e\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u4e0e\u5c1d\u8bd5\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5bf9\u4e8e\u4e00\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u9690\u853d\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u975e\u5e38\u8003\u9a8c\u4e2a\u4eba\u7684\u89e3\u9898\u7ecf\u9a8c\u4e0e\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
    • \u67d0\u4e9b\u8d2a\u5fc3\u7b56\u7565\u5177\u6709\u8f83\u5f3a\u7684\u8ff7\u60d1\u6027\u3002\u5f53\u6211\u4eec\u6ee1\u6000\u4fe1\u5fc3\u8bbe\u8ba1\u597d\u8d2a\u5fc3\u7b56\u7565\uff0c\u5199\u51fa\u89e3\u9898\u4ee3\u7801\u5e76\u63d0\u4ea4\u8fd0\u884c\uff0c\u5f88\u53ef\u80fd\u53d1\u73b0\u90e8\u5206\u6d4b\u8bd5\u6837\u4f8b\u65e0\u6cd5\u901a\u8fc7\u3002\u8fd9\u662f\u56e0\u4e3a\u8bbe\u8ba1\u7684\u8d2a\u5fc3\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u786e\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7ecd\u7684\u96f6\u94b1\u5151\u6362\u5c31\u662f\u4e00\u4e2a\u5178\u578b\u6848\u4f8b\u3002

    \u4e3a\u4e86\u4fdd\u8bc1\u6b63\u786e\u6027\uff0c\u6211\u4eec\u5e94\u8be5\u5bf9\u8d2a\u5fc3\u7b56\u7565\u8fdb\u884c\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8bc1\u6cd5\u6216\u6570\u5b66\u5f52\u7eb3\u6cd5\u3002

    \u7136\u800c\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6ca1\u6709\u5934\u7eea\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u9762\u5411\u6d4b\u8bd5\u7528\u4f8b\u8fdb\u884c\u4ee3\u7801\u8c03\u8bd5\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u4e0e\u9a8c\u8bc1\u8d2a\u5fc3\u7b56\u7565\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u5178\u578b\u4f8b\u9898","text":"

    \u8d2a\u5fc3\u7b97\u6cd5\u5e38\u5e38\u5e94\u7528\u5728\u6ee1\u8db3\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u4f18\u5316\u95ee\u9898\u4e2d\uff0c\u4ee5\u4e0b\u5217\u4e3e\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8d2a\u5fc3\u7b97\u6cd5\u95ee\u9898\u3002

    • \u786c\u5e01\u627e\u96f6\u95ee\u9898\uff1a\u5728\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u603b\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u533a\u95f4\u8c03\u5ea6\u95ee\u9898\uff1a\u5047\u8bbe\u4f60\u6709\u4e00\u4e9b\u4efb\u52a1\uff0c\u6bcf\u4e2a\u4efb\u52a1\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u8fdb\u884c\uff0c\u4f60\u7684\u76ee\u6807\u662f\u5b8c\u6210\u5c3d\u53ef\u80fd\u591a\u7684\u4efb\u52a1\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u7ed3\u675f\u65f6\u95f4\u6700\u65e9\u7684\u4efb\u52a1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u5206\u6570\u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u8f7d\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6807\u662f\u9009\u62e9\u4e00\u7ec4\u7269\u54c1\uff0c\u4f7f\u5f97\u603b\u91cd\u91cf\u4e0d\u8d85\u8fc7\u8f7d\u91cd\u91cf\uff0c\u4e14\u603b\u4ef7\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u6027\u4ef7\u6bd4\u6700\u9ad8\uff08\u4ef7\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u80a1\u7968\u4e70\u5356\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u80a1\u7968\u7684\u5386\u53f2\u4ef7\u683c\uff0c\u4f60\u53ef\u4ee5\u8fdb\u884c\u591a\u6b21\u4e70\u5356\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7ecf\u6301\u6709\u80a1\u7968\uff0c\u90a3\u4e48\u5728\u5356\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u4e70\uff0c\u76ee\u6807\u662f\u83b7\u53d6\u6700\u5927\u5229\u6da6\u3002
    • \u970d\u592b\u66fc\u7f16\u7801\uff1a\u970d\u592b\u66fc\u7f16\u7801\u662f\u4e00\u79cd\u7528\u4e8e\u65e0\u635f\u6570\u636e\u538b\u7f29\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002\u901a\u8fc7\u6784\u5efa\u970d\u592b\u66fc\u6811\uff0c\u6bcf\u6b21\u9009\u62e9\u51fa\u73b0\u9891\u7387\u6700\u4f4e\u7684\u4e24\u4e2a\u8282\u70b9\u5408\u5e76\uff0c\u6700\u540e\u5f97\u5230\u7684\u970d\u592b\u66fc\u6811\u7684\u5e26\u6743\u8def\u5f84\u957f\u5ea6\uff08\u7f16\u7801\u957f\u5ea6\uff09\u6700\u5c0f\u3002
    • Dijkstra \u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u79cd\u89e3\u51b3\u7ed9\u5b9a\u6e90\u9876\u70b9\u5230\u5176\u4f59\u5404\u9876\u70b9\u7684\u6700\u77ed\u8def\u5f84\u95ee\u9898\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002
    "},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6570\u7ec4 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u4ee3\u8868\u4e00\u4e2a\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u4eec\u4e4b\u95f4\u7684\u7a7a\u95f4\u53ef\u4ee5\u7ec4\u6210\u4e00\u4e2a\u5bb9\u5668\u3002

    \u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u548c\u5bbd\u5ea6\u7684\u4e58\u79ef\uff08\u9762\u79ef\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f83\u77ed\u7684\u9694\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u4e2a\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002

    \u8bf7\u5728\u6570\u7ec4\u4e2d\u9009\u62e9\u4e24\u4e2a\u9694\u677f\uff0c\u4f7f\u5f97\u7ec4\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u56fe 15-7 \u6240\u793a\u3002

    \u56fe 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    \u5bb9\u5668\u7531\u4efb\u610f\u4e24\u4e2a\u9694\u677f\u56f4\u6210\uff0c\u56e0\u6b64\u672c\u9898\u7684\u72b6\u6001\u4e3a\u4e24\u4e2a\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

    \u6839\u636e\u9898\u610f\uff0c\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u4e58\u4ee5\u5bbd\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002\u8bbe\u5bb9\u91cf\u4e3a \\(cap[i, j]\\) \uff0c\u5219\u53ef\u5f97\u8ba1\u7b97\u516c\u5f0f\uff1a

    \\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

    \u8bbe\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u4e24\u4e2a\u9694\u677f\u7684\u7ec4\u5408\u6570\u91cf\uff08\u72b6\u6001\u603b\u6570\uff09\u4e3a \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u4e2a\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u7a77\u4e3e\u6240\u6709\u72b6\u6001\uff0c\u4ece\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

    \u8fd9\u9053\u9898\u8fd8\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u56fe 15-8 \u6240\u793a\uff0c\u73b0\u9009\u53d6\u4e00\u4e2a\u72b6\u6001 \\([i, j]\\) \uff0c\u5176\u6ee1\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002

    \u56fe 15-8 \u00a0 \u521d\u59cb\u72b6\u6001

    \u5982\u56fe 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u65f6\u5c06\u957f\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5219\u5bb9\u91cf\u4e00\u5b9a\u53d8\u5c0f\u3002

    \u8fd9\u662f\u56e0\u4e3a\u5728\u79fb\u52a8\u957f\u677f \\(j\\) \u540e\uff0c\u5bbd\u5ea6 \\(j-i\\) \u80af\u5b9a\u53d8\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u53d8\uff08 \\(i\\) \u4ecd\u4e3a\u77ed\u677f\uff09\u6216\u53d8\u5c0f\uff08\u79fb\u52a8\u540e\u7684 \\(j\\) \u6210\u4e3a\u77ed\u677f\uff09\u3002

    \u56fe 15-9 \u00a0 \u5411\u5185\u79fb\u52a8\u957f\u677f\u540e\u7684\u72b6\u6001

    \u53cd\u5411\u601d\u8003\uff0c\u6211\u4eec\u53ea\u6709\u5411\u5185\u6536\u7f29\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u53d8\u5927\u3002\u56e0\u4e3a\u867d\u7136\u5bbd\u5ea6\u4e00\u5b9a\u53d8\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u4f1a\u53d8\u5927\uff08\u79fb\u52a8\u540e\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u4f1a\u53d8\u957f\uff09\u3002\u4f8b\u5982\u5728\u56fe 15-10 \u4e2d\uff0c\u79fb\u52a8\u77ed\u677f\u540e\u9762\u79ef\u53d8\u5927\u3002

    \u56fe 15-10 \u00a0 \u5411\u5185\u79fb\u52a8\u77ed\u677f\u540e\u7684\u72b6\u6001

    \u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\uff1a\u521d\u59cb\u5316\u4e24\u6307\u9488\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u4e24\u7aef\uff0c\u6bcf\u8f6e\u5411\u5185\u6536\u7f29\u77ed\u677f\u5bf9\u5e94\u7684\u6307\u9488\uff0c\u76f4\u81f3\u4e24\u6307\u9488\u76f8\u9047\u3002

    \u56fe 15-11 \u5c55\u793a\u4e86\u8d2a\u5fc3\u7b56\u7565\u7684\u6267\u884c\u8fc7\u7a0b\u3002

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u5217\u6570\u7ec4\u4e24\u7aef\u3002
    2. \u8ba1\u7b97\u5f53\u524d\u72b6\u6001\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u5e76\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
    3. \u6bd4\u8f83\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u5e76\u5c06\u77ed\u677f\u5411\u5185\u79fb\u52a8\u4e00\u683c\u3002
    4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u65f6\u7ed3\u675f\u3002
    <1><2><3><4><5><6><7><8><9>

    \u56fe 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u8d2a\u5fc3\u8fc7\u7a0b

    "},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u4ee3\u7801\u5faa\u73af\u6700\u591a \\(n\\) \u8f6e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    \u53d8\u91cf \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
    def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res = 0\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j:\n        # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        # \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j]:\n            i += 1\n        else:\n            j -= 1\n    return res\n
    max_capacity.cpp
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = min(ht[i], ht[j]) * (j - i);\n        res = max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.java
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.cs
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.Min(ht[i], ht[j]) * (j - i);\n        res = Math.Max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.go
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res := 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    for i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)\n        res = int(math.Max(float64(res), float64(capacity)))\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.swift
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1\n        } else {\n            j -= 1\n        }\n    }\n    return res\n}\n
    max_capacity.js
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
    max_capacity.ts
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap: number = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
    max_capacity.dart
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n  int res = 0;\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n  while (i < j) {\n    // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    int cap = min(ht[i], ht[j]) * (j - i);\n    res = max(res, cap);\n    // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n    if (ht[i] < ht[j]) {\n      i++;\n    } else {\n      j--;\n    }\n  }\n  return res;\n}\n
    max_capacity.rs
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let mut res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;\n        res = std::cmp::max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    res\n}\n
    max_capacity.c
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int capacity = myMin(ht[i], ht[j]) * (j - i);\n        res = myMax(res, capacity);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.kt
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        val cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.rb
    ### \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 ###\ndef max_capacity(ht)\n  # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n  i, j = 0, ht.length - 1\n  # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n  res = 0\n\n  # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n  while i < j\n    # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    cap = [ht[i], ht[j]].min * (j - i)\n    res = [res, cap].max\n    # \u5411\u5185\u79fb\u52a8\u77ed\u677f\n    if ht[i] < ht[j]\n      i += 1\n    else\n      j -= 1\n    end\n  end\n\n  res\nend\n
    max_capacity.zig
    [class]{}-[func]{maxCapacity}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

    \u4e4b\u6240\u4ee5\u8d2a\u5fc3\u6bd4\u7a77\u4e3e\u66f4\u5feb\uff0c\u662f\u56e0\u4e3a\u6bcf\u8f6e\u7684\u8d2a\u5fc3\u9009\u62e9\u90fd\u4f1a\u201c\u8df3\u8fc7\u201d\u4e00\u4e9b\u72b6\u6001\u3002

    \u6bd4\u5982\u5728\u72b6\u6001 \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002\u82e5\u8d2a\u5fc3\u5730\u5c06\u77ed\u677f \\(i\\) \u5411\u5185\u79fb\u52a8\u4e00\u683c\uff0c\u4f1a\u5bfc\u81f4\u56fe 15-12 \u6240\u793a\u7684\u72b6\u6001\u88ab\u201c\u8df3\u8fc7\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e4b\u540e\u65e0\u6cd5\u9a8c\u8bc1\u8fd9\u4e9b\u72b6\u6001\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

    \\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

    \u56fe 15-12 \u00a0 \u79fb\u52a8\u77ed\u677f\u5bfc\u81f4\u88ab\u8df3\u8fc7\u7684\u72b6\u6001

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u8fd9\u4e9b\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u5b9e\u9645\u4e0a\u5c31\u662f\u5c06\u957f\u677f \\(j\\) \u5411\u5185\u79fb\u52a8\u7684\u6240\u6709\u72b6\u6001\u3002\u524d\u9762\u6211\u4eec\u5df2\u7ecf\u8bc1\u660e\u5185\u79fb\u957f\u677f\u4e00\u5b9a\u4f1a\u5bfc\u81f4\u5bb9\u91cf\u53d8\u5c0f\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u4f18\u89e3\uff0c\u8df3\u8fc7\u5b83\u4eec\u4e0d\u4f1a\u5bfc\u81f4\u9519\u8fc7\u6700\u4f18\u89e3\u3002

    \u4ee5\u4e0a\u5206\u6790\u8bf4\u660e\uff0c\u79fb\u52a8\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5c06\u5176\u5207\u5206\u4e3a\u81f3\u5c11\u4e24\u4e2a\u6b63\u6574\u6570\u7684\u548c\uff0c\u6c42\u5207\u5206\u540e\u6240\u6709\u6574\u6570\u7684\u4e58\u79ef\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u56fe 15-13 \u6240\u793a\u3002

    \u56fe 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u95ee\u9898\u5b9a\u4e49

    \u5047\u8bbe\u6211\u4eec\u5c06 \\(n\\) \u5207\u5206\u4e3a \\(m\\) \u4e2a\u6574\u6570\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u4e2a\u56e0\u5b50\u8bb0\u4e3a \\(n_i\\) \uff0c\u5373

    \\[ n = \\sum_{i=1}^{m}n_i \\]

    \u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u5f97\u6240\u6709\u6574\u6570\u56e0\u5b50\u7684\u6700\u5927\u4e58\u79ef\uff0c\u5373

    \\[ \\max(\\prod_{i=1}^{m}n_i) \\]

    \u6211\u4eec\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6570\u91cf \\(m\\) \u5e94\u8be5\u591a\u5927\uff0c\u6bcf\u4e2a \\(n_i\\) \u5e94\u8be5\u662f\u591a\u5c11\uff1f

    "},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

    \u6839\u636e\u7ecf\u9a8c\uff0c\u4e24\u4e2a\u6574\u6570\u7684\u4e58\u79ef\u5f80\u5f80\u6bd4\u5b83\u4eec\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8bbe\u4ece \\(n\\) \u4e2d\u5206\u51fa\u4e00\u4e2a\u56e0\u5b50 \\(2\\) \uff0c\u5219\u5b83\u4eec\u7684\u4e58\u79ef\u4e3a \\(2(n-2)\\) \u3002\u6211\u4eec\u5c06\u8be5\u4e58\u79ef\u4e0e \\(n\\) \u4f5c\u6bd4\u8f83\uff1a

    \\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

    \u5982\u56fe 15-14 \u6240\u793a\uff0c\u5f53 \\(n \\geq 4\\) \u65f6\uff0c\u5207\u5206\u51fa\u4e00\u4e2a \\(2\\) \u540e\u4e58\u79ef\u4f1a\u53d8\u5927\uff0c\u8fd9\u8bf4\u660e\u5927\u4e8e\u7b49\u4e8e \\(4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u88ab\u5207\u5206\u3002

    \u8d2a\u5fc3\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u4e48\u5b83\u5c31\u5e94\u8be5\u88ab\u7ee7\u7eed\u5207\u5206\u3002\u6700\u7ec8\u7684\u5207\u5206\u65b9\u6848\u53ea\u5e94\u51fa\u73b0 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u79cd\u56e0\u5b50\u3002

    \u56fe 15-14 \u00a0 \u5207\u5206\u5bfc\u81f4\u4e58\u79ef\u53d8\u5927

    \u63a5\u4e0b\u6765\u601d\u8003\u54ea\u4e2a\u56e0\u5b50\u662f\u6700\u4f18\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u4e2a\u56e0\u5b50\u4e2d\uff0c\u663e\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u4e3a \\(1 \\times (n-1) < n\\) \u6052\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u4f1a\u5bfc\u81f4\u4e58\u79ef\u51cf\u5c0f\u3002

    \u5982\u56fe 15-15 \u6240\u793a\uff0c\u5f53 \\(n = 6\\) \u65f6\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u8fd9\u610f\u5473\u7740\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u4f18\u3002

    \u8d2a\u5fc3\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u53ea\u5e94\u5b58\u5728\u4e24\u4e2a \\(2\\) \u3002\u56e0\u4e3a\u4e09\u4e2a \\(2\\) \u603b\u662f\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002

    \u56fe 15-15 \u00a0 \u6700\u4f18\u5207\u5206\u56e0\u5b50

    \u7efc\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8d2a\u5fc3\u7b56\u7565\u3002

    1. \u8f93\u5165\u6574\u6570 \\(n\\) \uff0c\u4ece\u5176\u4e0d\u65ad\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u4f59\u6570\u4e3a \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
    2. \u5f53\u4f59\u6570\u4e3a \\(0\\) \u65f6\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6570\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u5904\u7406\u3002
    3. \u5f53\u4f59\u6570\u4e3a \\(2\\) \u65f6\uff0c\u4e0d\u7ee7\u7eed\u5212\u5206\uff0c\u4fdd\u7559\u3002
    4. \u5f53\u4f59\u6570\u4e3a \\(1\\) \u65f6\uff0c\u7531\u4e8e \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u5e94\u5c06\u6700\u540e\u4e00\u4e2a \\(3\\) \u66ff\u6362\u4e3a \\(2\\) \u3002
    "},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5982\u56fe 15-16 \u6240\u793a\uff0c\u6211\u4eec\u65e0\u987b\u901a\u8fc7\u5faa\u73af\u6765\u5207\u5206\u6574\u6570\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u8fd0\u7b97\u5f97\u5230 \\(3\\) \u7684\u4e2a\u6570 \\(a\\) \uff0c\u7528\u53d6\u6a21\u8fd0\u7b97\u5f97\u5230\u4f59\u6570 \\(b\\) \uff0c\u6b64\u65f6\u6709\uff1a

    \\[ n = 3 a + b \\]

    \u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e \\(n \\leq 3\\) \u7684\u8fb9\u754c\u60c5\u51b5\uff0c\u5fc5\u987b\u62c6\u5206\u51fa\u4e00\u4e2a \\(1\\) \uff0c\u4e58\u79ef\u4e3a \\(1 \\times (n - 1)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_product_cutting.py
    def max_product_cutting(n: int) -> int:\n    \"\"\"\u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.pow(3, a)) * 2\n    # \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.pow(3, a))\n
    max_product_cutting.cpp
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)pow(3, a);\n}\n
    max_product_cutting.java
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int) Math.pow(3, a);\n}\n
    max_product_cutting.cs
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint MaxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)Math.Pow(3, a);\n}\n
    max_product_cutting.go
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n int) int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
    max_product_cutting.swift
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a)\n}\n
    max_product_cutting.js
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.ts
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n: number): number {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.dart
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n  // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  return pow(3, a).toInt();\n}\n
    max_product_cutting.rs
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
    max_product_cutting.c
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a);\n}\n
    max_product_cutting.kt
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfun maxProductCutting(n: Int): Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return 3.0.pow(a).toInt()\n}\n
    max_product_cutting.rb
    ### \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 ###\ndef max_product_cutting(n)\n  # \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n  return 1 * (n - 1) if n <= 3\n  # \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n  a, b = n / 3, n % 3\n  # \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n  return (3.pow(a - 1) * 2 * 2).to_i if b == 1\n  # \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  return (3.pow(a) * 2).to_i if b == 2\n  # \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  3.pow(a).to_i\nend\n
    max_product_cutting.zig
    [class]{}-[func]{maxProductCutting}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u8ba1\u7b97\u65b9\u6cd5

    \u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u5e42\u8fd0\u7b97\u7684\u5b9e\u73b0\u65b9\u6cd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5e38\u7528\u7684\u5e42\u8ba1\u7b97\u51fd\u6570\u6709\u4e09\u79cd\u3002

    • \u8fd0\u7b97\u7b26 ** \u548c\u51fd\u6570 pow() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log\u2061 a)\\) \u3002
    • \u51fd\u6570 math.pow() \u5185\u90e8\u8c03\u7528 C \u8bed\u8a00\u5e93\u7684 pow() \u51fd\u6570\uff0c\u5176\u6267\u884c\u6d6e\u70b9\u53d6\u5e42\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    \u53d8\u91cf \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

    \u4f7f\u7528\u53cd\u8bc1\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u51b5\u3002

    1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u5c06\u5176\u7ee7\u7eed\u5212\u5206\u4e3a \\(2(x-2)\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
    2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u4e2a\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u4e48\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u5e76\u5165\u53e6\u5916\u4e00\u4e2a\u56e0\u5b50\u4e2d\uff0c\u4ee5\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
    3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u4e24\u4e2a \\(2\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u4e2a \\(2\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4e58\u79ef\u66f4\u5927\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
    "},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7ed3","text":"
    • \u8d2a\u5fc3\u7b97\u6cd5\u901a\u5e38\u7528\u4e8e\u89e3\u51b3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\u90fd\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002
    • \u8d2a\u5fc3\u7b97\u6cd5\u4f1a\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u4e2a\u53c8\u4e00\u4e2a\u7684\u8d2a\u5fc3\u9009\u62e9\uff0c\u6bcf\u8f6e\u90fd\u5c06\u95ee\u9898\u8f6c\u5316\u6210\u4e00\u4e2a\u89c4\u6a21\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u95ee\u9898\u88ab\u89e3\u51b3\u3002
    • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u5b9e\u73b0\u7b80\u5355\uff0c\u8fd8\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u9898\u6548\u7387\u3002\u76f8\u6bd4\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
    • \u5728\u96f6\u94b1\u5151\u6362\u95ee\u9898\u4e2d\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1b\u5bf9\u4e8e\u53e6\u5916\u4e00\u4e9b\u786c\u5e01\u7ec4\u5408\u5219\u4e0d\u7136\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
    • \u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u7684\u95ee\u9898\u5177\u6709\u4e24\u5927\u6027\u8d28\uff1a\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u4ee3\u8868\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
    • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u8bc1\u660e\u5e76\u4e0d\u7b80\u5355\u3002\u76f8\u5bf9\u6765\u8bf4\uff0c\u8bc1\u4f2a\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002
    • \u6c42\u89e3\u8d2a\u5fc3\u95ee\u9898\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\uff1a\u95ee\u9898\u5206\u6790\u3001\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u3001\u6b63\u786e\u6027\u8bc1\u660e\u3002\u5176\u4e2d\uff0c\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9aa4\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u5f80\u5f80\u662f\u96be\u70b9\u3002
    • \u5206\u6570\u80cc\u5305\u95ee\u9898\u5728 0-1 \u80cc\u5305\u7684\u57fa\u7840\u4e0a\uff0c\u5141\u8bb8\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u3002\u8d2a\u5fc3\u7b56\u7565\u7684\u6b63\u786e\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\u3002
    • \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u53ef\u4f7f\u7528\u7a77\u4e3e\u6cd5\u6c42\u89e3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u901a\u8fc7\u8bbe\u8ba1\u8d2a\u5fc3\u7b56\u7565\uff0c\u6bcf\u8f6e\u5411\u5185\u79fb\u52a8\u77ed\u677f\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \u3002
    • \u5728\u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u63a8\u7406\u51fa\u4e24\u4e2a\u8d2a\u5fc3\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u7ee7\u7eed\u5207\u5206\uff0c\u6700\u4f18\u5207\u5206\u56e0\u5b50\u4e3a \\(3\\) \u3002\u4ee3\u7801\u4e2d\u5305\u542b\u5e42\u8fd0\u7b97\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5e42\u8fd0\u7b97\u5b9e\u73b0\u65b9\u6cd5\uff0c\u901a\u5e38\u4e3a \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
    "},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u54c8\u5e0c\u8868","text":"

    Abstract

    \u5728\u8ba1\u7b97\u673a\u4e16\u754c\u4e2d\uff0c\u54c8\u5e0c\u8868\u5982\u540c\u4e00\u4f4d\u806a\u6167\u7684\u56fe\u4e66\u7ba1\u7406\u5458\u3002

    \u4ed6\u77e5\u9053\u5982\u4f55\u8ba1\u7b97\u7d22\u4e66\u53f7\uff0c\u4ece\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6807\u56fe\u4e66\u3002

    "},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 6.1 \u00a0 \u54c8\u5e0c\u8868
    • 6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81
    • 6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5
    • 6.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5","text":"

    \u524d\u4e24\u8282\u4ecb\u7ecd\u4e86\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u54c8\u5e0c\u51b2\u7a81\u7684\u5904\u7406\u65b9\u6cd5\u3002\u7136\u800c\u65e0\u8bba\u662f\u5f00\u653e\u5bfb\u5740\u8fd8\u662f\u94fe\u5f0f\u5730\u5740\uff0c\u5b83\u4eec\u53ea\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u53d1\u751f\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u65e0\u6cd5\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u3002

    \u5982\u679c\u54c8\u5e0c\u51b2\u7a81\u8fc7\u4e8e\u9891\u7e41\uff0c\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u5219\u4f1a\u6025\u5267\u52a3\u5316\u3002\u5982\u56fe 6-8 \u6240\u793a\uff0c\u5bf9\u4e8e\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\uff0c\u7406\u60f3\u60c5\u51b5\u4e0b\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u5404\u4e2a\u6876\u4e2d\uff0c\u8fbe\u5230\u6700\u4f73\u67e5\u8be2\u6548\u7387\uff1b\u6700\u5dee\u60c5\u51b5\u4e0b\u6240\u6709\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u56fe 6-8 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u7684\u6700\u4f73\u60c5\u51b5\u4e0e\u6700\u5dee\u60c5\u51b5

    \u952e\u503c\u5bf9\u7684\u5206\u5e03\u60c5\u51b5\u7531\u54c8\u5e0c\u51fd\u6570\u51b3\u5b9a\u3002\u56de\u5fc6\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u6b65\u9aa4\uff0c\u5148\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u518d\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\uff1a

    index = hash(key) % capacity\n

    \u89c2\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u5f53\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u65f6\uff0c\u54c8\u5e0c\u7b97\u6cd5 hash() \u51b3\u5b9a\u4e86\u8f93\u51fa\u503c\uff0c\u8fdb\u800c\u51b3\u5b9a\u4e86\u952e\u503c\u5bf9\u5728\u54c8\u5e0c\u8868\u4e2d\u7684\u5206\u5e03\u60c5\u51b5\u3002

    \u8fd9\u610f\u5473\u7740\uff0c\u4e3a\u4e86\u964d\u4f4e\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u6982\u7387\uff0c\u6211\u4eec\u5e94\u5f53\u5c06\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u54c8\u5e0c\u7b97\u6cd5 hash() \u7684\u8bbe\u8ba1\u4e0a\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u76ee\u6807","text":"

    \u4e3a\u4e86\u5b9e\u73b0\u201c\u65e2\u5feb\u53c8\u7a33\u201d\u7684\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u5177\u5907\u4ee5\u4e0b\u7279\u70b9\u3002

    • \u786e\u5b9a\u6027\uff1a\u5bf9\u4e8e\u76f8\u540c\u7684\u8f93\u5165\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u7684\u8f93\u51fa\u3002\u8fd9\u6837\u624d\u80fd\u786e\u4fdd\u54c8\u5e0c\u8868\u662f\u53ef\u9760\u7684\u3002
    • \u6548\u7387\u9ad8\uff1a\u8ba1\u7b97\u54c8\u5e0c\u503c\u7684\u8fc7\u7a0b\u5e94\u8be5\u8db3\u591f\u5feb\u3002\u8ba1\u7b97\u5f00\u9500\u8d8a\u5c0f\uff0c\u54c8\u5e0c\u8868\u7684\u5b9e\u7528\u6027\u8d8a\u9ad8\u3002
    • \u5747\u5300\u5206\u5e03\uff1a\u54c8\u5e0c\u7b97\u6cd5\u5e94\u4f7f\u5f97\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u54c8\u5e0c\u8868\u4e2d\u3002\u5206\u5e03\u8d8a\u5747\u5300\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002

    \u5b9e\u9645\u4e0a\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u54c8\u5e0c\u8868\uff0c\u8fd8\u5e7f\u6cdb\u5e94\u7528\u4e8e\u5176\u4ed6\u9886\u57df\u4e2d\u3002

    • \u5bc6\u7801\u5b58\u50a8\uff1a\u4e3a\u4e86\u4fdd\u62a4\u7528\u6237\u5bc6\u7801\u7684\u5b89\u5168\uff0c\u7cfb\u7edf\u901a\u5e38\u4e0d\u4f1a\u76f4\u63a5\u5b58\u50a8\u7528\u6237\u7684\u660e\u6587\u5bc6\u7801\uff0c\u800c\u662f\u5b58\u50a8\u5bc6\u7801\u7684\u54c8\u5e0c\u503c\u3002\u5f53\u7528\u6237\u8f93\u5165\u5bc6\u7801\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5bf9\u8f93\u5165\u7684\u5bc6\u7801\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u7136\u540e\u4e0e\u5b58\u50a8\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u5bc6\u7801\u5c31\u88ab\u89c6\u4e3a\u6b63\u786e\u3002
    • \u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5\uff1a\u6570\u636e\u53d1\u9001\u65b9\u53ef\u4ee5\u8ba1\u7b97\u6570\u636e\u7684\u54c8\u5e0c\u503c\u5e76\u5c06\u5176\u4e00\u540c\u53d1\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8ba1\u7b97\u63a5\u6536\u5230\u7684\u6570\u636e\u7684\u54c8\u5e0c\u503c\uff0c\u5e76\u4e0e\u63a5\u6536\u5230\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u6570\u636e\u5c31\u88ab\u89c6\u4e3a\u5b8c\u6574\u3002

    \u5bf9\u4e8e\u5bc6\u7801\u5b66\u7684\u76f8\u5173\u5e94\u7528\uff0c\u4e3a\u4e86\u9632\u6b62\u4ece\u54c8\u5e0c\u503c\u63a8\u5bfc\u51fa\u539f\u59cb\u5bc6\u7801\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9700\u8981\u5177\u5907\u66f4\u9ad8\u7b49\u7ea7\u7684\u5b89\u5168\u7279\u6027\u3002

    • \u5355\u5411\u6027\uff1a\u65e0\u6cd5\u901a\u8fc7\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u5173\u4e8e\u8f93\u5165\u6570\u636e\u7684\u4efb\u4f55\u4fe1\u606f\u3002
    • \u6297\u78b0\u649e\u6027\uff1a\u5e94\u5f53\u6781\u96be\u627e\u5230\u4e24\u4e2a\u4e0d\u540c\u7684\u8f93\u5165\uff0c\u4f7f\u5f97\u5b83\u4eec\u7684\u54c8\u5e0c\u503c\u76f8\u540c\u3002
    • \u96ea\u5d29\u6548\u5e94\uff1a\u8f93\u5165\u7684\u5fae\u5c0f\u53d8\u5316\u5e94\u5f53\u5bfc\u81f4\u8f93\u51fa\u7684\u663e\u8457\u4e14\u4e0d\u53ef\u9884\u6d4b\u7684\u53d8\u5316\u3002

    \u8bf7\u6ce8\u610f\uff0c\u201c\u5747\u5300\u5206\u5e03\u201d\u4e0e\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u6982\u5ff5\uff0c\u6ee1\u8db3\u5747\u5300\u5206\u5e03\u4e0d\u4e00\u5b9a\u6ee1\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u968f\u673a\u8f93\u5165 key \u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570 key % 100 \u53ef\u4ee5\u4ea7\u751f\u5747\u5300\u5206\u5e03\u7684\u8f93\u51fa\u3002\u7136\u800c\u8be5\u54c8\u5e0c\u7b97\u6cd5\u8fc7\u4e8e\u7b80\u5355\uff0c\u6240\u6709\u540e\u4e24\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f93\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u4ece\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u4ece\u800c\u7834\u89e3\u5bc6\u7801\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1","text":"

    \u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u662f\u4e00\u4e2a\u9700\u8981\u8003\u8651\u8bb8\u591a\u56e0\u7d20\u7684\u590d\u6742\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u573a\u666f\uff0c\u6211\u4eec\u4e5f\u80fd\u8bbe\u8ba1\u4e00\u4e9b\u7b80\u5355\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

    • \u52a0\u6cd5\u54c8\u5e0c\uff1a\u5bf9\u8f93\u5165\u7684\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u8fdb\u884c\u76f8\u52a0\uff0c\u5c06\u5f97\u5230\u7684\u603b\u548c\u4f5c\u4e3a\u54c8\u5e0c\u503c\u3002
    • \u4e58\u6cd5\u54c8\u5e0c\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u5173\u6027\uff0c\u6bcf\u8f6e\u4e58\u4ee5\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5404\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u54c8\u5e0c\u503c\u4e2d\u3002
    • \u5f02\u6216\u54c8\u5e0c\uff1a\u5c06\u8f93\u5165\u6570\u636e\u7684\u6bcf\u4e2a\u5143\u7d20\u901a\u8fc7\u5f02\u6216\u64cd\u4f5c\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\u3002
    • \u65cb\u8f6c\u54c8\u5e0c\uff1a\u5c06\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u79ef\u4e4b\u524d\u90fd\u4f1a\u5bf9\u54c8\u5e0c\u503c\u8fdb\u884c\u65cb\u8f6c\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
    def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u5f02\u6216\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f6c\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
    simple_hash.cpp
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
    simple_hash.java
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
    simple_hash.cs
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
    simple_hash.go
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
    simple_hash.swift
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
    simple_hash.js
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
    simple_hash.ts
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
    simple_hash.dart
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
    simple_hash.rs
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
    simple_hash.c
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
    simple_hash.kt
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
    simple_hash.rb
    ### \u52a0\u6cd5\u54c8\u5e0c ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u54c8\u5e0c ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u5f02\u6216\u54c8\u5e0c ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f6c\u54c8\u5e0c ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
    simple_hash.zig
    [class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u6bcf\u79cd\u54c8\u5e0c\u7b97\u6cd5\u7684\u6700\u540e\u4e00\u6b65\u90fd\u662f\u5bf9\u5927\u8d28\u6570 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u786e\u4fdd\u54c8\u5e0c\u503c\u5728\u5408\u9002\u7684\u8303\u56f4\u5185\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u4e3a\u4ec0\u4e48\u8981\u5f3a\u8c03\u5bf9\u8d28\u6570\u53d6\u6a21\uff0c\u6216\u8005\u8bf4\u5bf9\u5408\u6570\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u4e48\uff1f\u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u95ee\u9898\u3002

    \u5148\u629b\u51fa\u7ed3\u8bba\uff1a\u4f7f\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u7684\u5747\u5300\u5206\u5e03\u3002\u56e0\u4e3a\u8d28\u6570\u4e0d\u4e0e\u5176\u4ed6\u6570\u5b57\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u53ef\u4ee5\u51cf\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u4ea7\u751f\u7684\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u4ece\u800c\u907f\u514d\u54c8\u5e0c\u51b2\u7a81\u3002

    \u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5047\u8bbe\u6211\u4eec\u9009\u62e9\u5408\u6570 \\(9\\) \u4f5c\u4e3a\u6a21\u6570\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u4e48\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u8fd9\u4e09\u4e2a\u54c8\u5e0c\u503c\u3002

    \\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

    \u5982\u679c\u8f93\u5165 key \u6070\u597d\u6ee1\u8db3\u8fd9\u79cd\u7b49\u5dee\u6570\u5217\u7684\u6570\u636e\u5206\u5e03\uff0c\u90a3\u4e48\u54c8\u5e0c\u503c\u5c31\u4f1a\u51fa\u73b0\u805a\u5806\uff0c\u4ece\u800c\u52a0\u91cd\u54c8\u5e0c\u51b2\u7a81\u3002\u73b0\u5728\uff0c\u5047\u8bbe\u5c06 modulus \u66ff\u6362\u4e3a\u8d28\u6570 \\(13\\) \uff0c\u7531\u4e8e key \u548c modulus \u4e4b\u95f4\u4e0d\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u56e0\u6b64\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u7684\u5747\u5300\u6027\u4f1a\u660e\u663e\u63d0\u5347\u3002

    \\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u591f\u4fdd\u8bc1 key \u662f\u968f\u673a\u5747\u5300\u5206\u5e03\u7684\uff0c\u90a3\u4e48\u9009\u62e9\u8d28\u6570\u6216\u8005\u5408\u6570\u4f5c\u4e3a\u6a21\u6570\u90fd\u53ef\u4ee5\uff0c\u5b83\u4eec\u90fd\u80fd\u8f93\u51fa\u5747\u5300\u5206\u5e03\u7684\u54c8\u5e0c\u503c\u3002\u800c\u5f53 key \u7684\u5206\u5e03\u5b58\u5728\u67d0\u79cd\u5468\u671f\u6027\u65f6\uff0c\u5bf9\u5408\u6570\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73b0\u805a\u96c6\u73b0\u8c61\u3002

    \u603b\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u901a\u5e38\u9009\u53d6\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u5e76\u4e14\u8fd9\u4e2a\u8d28\u6570\u6700\u597d\u8db3\u591f\u5927\uff0c\u4ee5\u5c3d\u53ef\u80fd\u6d88\u9664\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u89c1\u54c8\u5e0c\u7b97\u6cd5","text":"

    \u4e0d\u96be\u53d1\u73b0\uff0c\u4ee5\u4e0a\u4ecb\u7ecd\u7684\u7b80\u5355\u54c8\u5e0c\u7b97\u6cd5\u90fd\u6bd4\u8f83\u201c\u8106\u5f31\u201d\uff0c\u8fdc\u8fdc\u6ca1\u6709\u8fbe\u5230\u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u76ee\u6807\u3002\u4f8b\u5982\uff0c\u7531\u4e8e\u52a0\u6cd5\u548c\u5f02\u6216\u6ee1\u8db3\u4ea4\u6362\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u54c8\u5e0c\u548c\u5f02\u6216\u54c8\u5e0c\u65e0\u6cd5\u533a\u5206\u5185\u5bb9\u76f8\u540c\u4f46\u987a\u5e8f\u4e0d\u540c\u7684\u5b57\u7b26\u4e32\uff0c\u8fd9\u53ef\u80fd\u4f1a\u52a0\u5267\u54c8\u5e0c\u51b2\u7a81\uff0c\u5e76\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u95ee\u9898\u3002

    \u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u7528\u4e00\u4e9b\u6807\u51c6\u54c8\u5e0c\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u4eec\u53ef\u4ee5\u5c06\u4efb\u610f\u957f\u5ea6\u7684\u8f93\u5165\u6570\u636e\u6620\u5c04\u5230\u6052\u5b9a\u957f\u5ea6\u7684\u54c8\u5e0c\u503c\u3002

    \u8fd1\u4e00\u4e2a\u4e16\u7eaa\u4ee5\u6765\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5904\u5728\u4e0d\u65ad\u5347\u7ea7\u4e0e\u4f18\u5316\u7684\u8fc7\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u52aa\u529b\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u6027\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u548c\u9ed1\u5ba2\u5219\u81f4\u529b\u4e8e\u5bfb\u627e\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u95ee\u9898\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

    • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u51fb\uff0c\u56e0\u6b64\u5b83\u4eec\u88ab\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u5f03\u7528\u3002
    • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u54c8\u5e0c\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73b0\u6210\u529f\u7684\u653b\u51fb\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u4e2d\u3002
    • SHA-3 \u76f8\u8f83 SHA-2 \u7684\u5b9e\u73b0\u5f00\u9500\u66f4\u4f4e\u3001\u8ba1\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u76d6\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

    \u8868 6-2 \u00a0 \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5

    MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u65f6\u95f4 1992 1995 2002 2008 \u8f93\u51fa\u957f\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u54c8\u5e0c\u51b2\u7a81 \u8f83\u591a \u8f83\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7ea7 \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u9ad8 \u9ad8 \u5e94\u7528 \u5df2\u88ab\u5f03\u7528\uff0c\u4ecd\u7528\u4e8e\u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5 \u5df2\u88ab\u5f03\u7528 \u52a0\u5bc6\u8d27\u5e01\u4ea4\u6613\u9a8c\u8bc1\u3001\u6570\u5b57\u7b7e\u540d\u7b49 \u53ef\u7528\u4e8e\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u54c8\u5e0c\u503c","text":"

    \u6211\u4eec\u77e5\u9053\uff0c\u54c8\u5e0c\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6570\u3001\u5c0f\u6570\u6216\u5b57\u7b26\u4e32\u7b49\u6570\u636e\u7c7b\u578b\u3002\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u8fd9\u4e9b\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u7684\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u7528 hash() \u51fd\u6570\u6765\u8ba1\u7b97\u5404\u79cd\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u3002

    • \u6574\u6570\u548c\u5e03\u5c14\u91cf\u7684\u54c8\u5e0c\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
    • \u6d6e\u70b9\u6570\u548c\u5b57\u7b26\u4e32\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u8f83\u4e3a\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8bf7\u81ea\u884c\u5b66\u4e60\u3002
    • \u5143\u7ec4\u7684\u54c8\u5e0c\u503c\u662f\u5bf9\u5176\u4e2d\u6bcf\u4e00\u4e2a\u5143\u7d20\u8fdb\u884c\u54c8\u5e0c\uff0c\u7136\u540e\u5c06\u8fd9\u4e9b\u54c8\u5e0c\u503c\u7ec4\u5408\u8d77\u6765\uff0c\u5f97\u5230\u5355\u4e00\u7684\u54c8\u5e0c\u503c\u3002
    • \u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u57fa\u4e8e\u5176\u5185\u5b58\u5730\u5740\u751f\u6210\u3002\u901a\u8fc7\u91cd\u5199\u5bf9\u8c61\u7684\u54c8\u5e0c\u65b9\u6cd5\uff0c\u53ef\u5b9e\u73b0\u57fa\u4e8e\u5185\u5bb9\u751f\u6210\u54c8\u5e0c\u503c\u3002

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u54c8\u5e0c\u503c\u8ba1\u7b97\u51fd\u6570\u7684\u5b9a\u4e49\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
    num = 3\nhash_num = hash(num)\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u5c14\u91cf True \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u8282\u70b9\u5bf9\u8c61 <ListNode object at 0x1058fd810> \u7684\u54c8\u5e0c\u503c\u4e3a 274267521\n
    built_in_hash.cpp
    int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u5c14\u91cf 1 \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5185\u7f6e std:hash() \u4ec5\u63d0\u4f9b\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\n// \u6570\u7ec4\u3001\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u9700\u8981\u81ea\u884c\u5b9e\u73b0\n
    built_in_hash.java
    int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@7dc5e7b4 \u7684\u54c8\u5e0c\u503c\u4e3a 2110121908\n
    built_in_hash.cs
    int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u8282\u70b9\u5bf9\u8c61 0 \u7684\u54c8\u5e0c\u503c\u4e3a 39053774;\n
    built_in_hash.go
    // Go \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.swift
    let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u6570\u7ec4 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u54c8\u5e0c\u503c\u4e3a -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode \u7684\u54c8\u5e0c\u503c\u4e3a -2434780518035996159\n
    built_in_hash.js
    // JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.ts
    // TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.dart
    int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u5c14\u503c true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u8282\u70b9\u5bf9\u8c61 Instance of 'ListNode' \u7684\u54c8\u5e0c\u503c\u4e3a 1033450432\n
    built_in_hash.rs
    use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2566941990314602357\n\nlet str = \"Hello \u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// \u5143\u7ec4 (12836, \"\u5c0f\u54c8\") \u7684\u54c8\u5e0c\u503c\u4e3a 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u8282\u70b9\u5bf9\u8c61 RefCell { value: ListNode { val: 42, next: None } } \u7684\u54c8\u5e0c\u503c\u4e3a15387811073369036852\n
    built_in_hash.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.kt
    val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nval str = \"Hello \u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@1d81eb93 \u7684\u54c8\u5e0c\u503c\u4e3a 495053715\n
    built_in_hash.rb
    num = 3\nhash_num = num.hash\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1479186995943067893\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u8282\u70b9\u5bf9\u8c61 #<ListNode:0x000078133140ab70> \u7684\u54c8\u5e0c\u503c\u4e3a 4302940560806366381\n
    built_in_hash.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5728\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u624d\u53ef\u4f5c\u4e3a\u54c8\u5e0c\u8868\u7684 key \u3002\u5047\u5982\u6211\u4eec\u5c06\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4f5c\u4e3a key \uff0c\u5f53\u5217\u8868\u7684\u5185\u5bb9\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5b83\u7684\u54c8\u5e0c\u503c\u4e5f\u968f\u4e4b\u6539\u53d8\uff0c\u6211\u4eec\u5c31\u65e0\u6cd5\u5728\u54c8\u5e0c\u8868\u4e2d\u67e5\u8be2\u5230\u539f\u5148\u7684 value \u4e86\u3002

    \u867d\u7136\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff08\u6bd4\u5982\u94fe\u8868\u8282\u70b9\uff09\u7684\u6210\u5458\u53d8\u91cf\u662f\u53ef\u53d8\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u54c8\u5e0c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u901a\u5e38\u662f\u57fa\u4e8e\u5185\u5b58\u5730\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u5bf9\u8c61\u7684\u5185\u5bb9\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u4f46\u5b83\u7684\u5185\u5b58\u5730\u5740\u4e0d\u53d8\uff0c\u54c8\u5e0c\u503c\u4ecd\u7136\u662f\u4e0d\u53d8\u7684\u3002

    \u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u53d1\u73b0\u5728\u4e0d\u540c\u63a7\u5236\u53f0\u4e2d\u8fd0\u884c\u7a0b\u5e8f\u65f6\uff0c\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u662f\u4e0d\u540c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a Python \u89e3\u91ca\u5668\u5728\u6bcf\u6b21\u542f\u52a8\u65f6\uff0c\u90fd\u4f1a\u4e3a\u5b57\u7b26\u4e32\u54c8\u5e0c\u51fd\u6570\u52a0\u5165\u4e00\u4e2a\u968f\u673a\u7684\u76d0\uff08salt\uff09\u503c\u3002\u8fd9\u79cd\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u51fb\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

    "},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

    \u4e0a\u4e00\u8282\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u5165\u7a7a\u95f4\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff0c\u56e0\u6b64\u7406\u8bba\u4e0a\u54c8\u5e0c\u51b2\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f93\u5165\u7a7a\u95f4\u4e3a\u5168\u4f53\u6574\u6570\uff0c\u8f93\u51fa\u7a7a\u95f4\u4e3a\u6570\u7ec4\u5bb9\u91cf\u5927\u5c0f\uff0c\u5219\u5fc5\u7136\u6709\u591a\u4e2a\u6574\u6570\u6620\u5c04\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

    \u54c8\u5e0c\u51b2\u7a81\u4f1a\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u9519\u8bef\uff0c\u4e25\u91cd\u5f71\u54cd\u54c8\u5e0c\u8868\u7684\u53ef\u7528\u6027\u3002\u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6bcf\u5f53\u9047\u5230\u54c8\u5e0c\u51b2\u7a81\u65f6\uff0c\u6211\u4eec\u5c31\u8fdb\u884c\u54c8\u5e0c\u8868\u6269\u5bb9\uff0c\u76f4\u81f3\u51b2\u7a81\u6d88\u5931\u4e3a\u6b62\u3002\u6b64\u65b9\u6cd5\u7b80\u5355\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u8981\u8fdb\u884c\u5927\u91cf\u7684\u6570\u636e\u642c\u8fd0\u4e0e\u54c8\u5e0c\u503c\u8ba1\u7b97\u3002\u4e3a\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

    1. \u6539\u826f\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u4f7f\u5f97\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\u3002
    2. \u4ec5\u5728\u5fc5\u8981\u65f6\uff0c\u5373\u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u624d\u6267\u884c\u6269\u5bb9\u64cd\u4f5c\u3002

    \u54c8\u5e0c\u8868\u7684\u7ed3\u6784\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u94fe\u5f0f\u5730\u5740\u201d\u548c\u201c\u5f00\u653e\u5bfb\u5740\u201d\u3002

    "},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u94fe\u5f0f\u5730\u5740","text":"

    \u5728\u539f\u59cb\u54c8\u5e0c\u8868\u4e2d\uff0c\u6bcf\u4e2a\u6876\u4ec5\u80fd\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u94fe\u5f0f\u5730\u5740\uff08separate chaining\uff09\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u6362\u4e3a\u94fe\u8868\uff0c\u5c06\u952e\u503c\u5bf9\u4f5c\u4e3a\u94fe\u8868\u8282\u70b9\uff0c\u5c06\u6240\u6709\u53d1\u751f\u51b2\u7a81\u7684\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5728\u540c\u4e00\u94fe\u8868\u4e2d\u3002\u56fe 6-5 \u5c55\u793a\u4e86\u4e00\u4e2a\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u4f8b\u5b50\u3002

    \u56fe 6-5 \u00a0 \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868

    \u57fa\u4e8e\u94fe\u5f0f\u5730\u5740\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u53d1\u751f\u4e86\u4ee5\u4e0b\u53d8\u5316\u3002

    • \u67e5\u8be2\u5143\u7d20\uff1a\u8f93\u5165 key \uff0c\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u904d\u5386\u94fe\u8868\u5e76\u5bf9\u6bd4 key \u4ee5\u67e5\u627e\u76ee\u6807\u952e\u503c\u5bf9\u3002
    • \u6dfb\u52a0\u5143\u7d20\uff1a\u9996\u5148\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u5c06\u8282\u70b9\uff08\u952e\u503c\u5bf9\uff09\u6dfb\u52a0\u5230\u94fe\u8868\u4e2d\u3002
    • \u5220\u9664\u5143\u7d20\uff1a\u6839\u636e\u54c8\u5e0c\u51fd\u6570\u7684\u7ed3\u679c\u8bbf\u95ee\u94fe\u8868\u5934\u90e8\uff0c\u63a5\u7740\u904d\u5386\u94fe\u8868\u4ee5\u67e5\u627e\u76ee\u6807\u8282\u70b9\u5e76\u5c06\u5176\u5220\u9664\u3002

    \u94fe\u5f0f\u5730\u5740\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

    • \u5360\u7528\u7a7a\u95f4\u589e\u5927\uff1a\u94fe\u8868\u5305\u542b\u8282\u70b9\u6307\u9488\uff0c\u5b83\u76f8\u6bd4\u6570\u7ec4\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
    • \u67e5\u8be2\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u4e3a\u9700\u8981\u7ebf\u6027\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u5bf9\u5e94\u5143\u7d20\u3002

    \u4ee5\u4e0b\u4ee3\u7801\u7ed9\u51fa\u4e86\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u7b80\u5355\u5b9e\u73b0\uff0c\u9700\u8981\u6ce8\u610f\u4e24\u70b9\u3002

    • \u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4ee3\u66ff\u94fe\u8868\uff0c\u4ece\u800c\u7b80\u5316\u4ee3\u7801\u3002\u5728\u8fd9\u79cd\u8bbe\u5b9a\u4e0b\uff0c\u54c8\u5e0c\u8868\uff08\u6570\u7ec4\uff09\u5305\u542b\u591a\u4e2a\u6876\uff0c\u6bcf\u4e2a\u6876\u90fd\u662f\u4e00\u4e2a\u5217\u8868\u3002
    • \u4ee5\u4e0b\u5b9e\u73b0\u5305\u542b\u54c8\u5e0c\u8868\u6269\u5bb9\u65b9\u6cd5\u3002\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(\\frac{2}{3}\\) \u65f6\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
    class HashMapChaining:\n    \"\"\"\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u6570\u7ec4\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
    hash_map_chaining.cpp
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;                   // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres;               // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;                // \u6269\u5bb9\u500d\u6570\n    vector<vector<Pair *>> buckets; // \u6876\u6570\u7ec4\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n                delete tmp;                       // \u91ca\u653e\u5185\u5b58\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
    hash_map_chaining.java
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
    hash_map_chaining.cs
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
    hash_map_chaining.go
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int      // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int      // \u6269\u5bb9\u500d\u6570\n    buckets     [][]pair // \u6876\u6570\u7ec4\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u5220\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
    hash_map_chaining.swift
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [[Pair]] // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
    hash_map_chaining.js
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
    hash_map_chaining.ts
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    #buckets: Pair[][]; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
    hash_map_chaining.dart
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  late int size; // \u952e\u503c\u5bf9\u6570\u91cf\n  late int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  late double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  late int extendRatio; // \u6269\u5bb9\u500d\u6570\n  late List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
    hash_map_chaining.rs
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n}\n
    hash_map_chaining.c
    /* \u94fe\u8868\u8282\u70b9 */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Node **buckets;   // \u6876\u6570\u7ec4\n} HashMapChaining;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91ca\u653e\u5185\u5b58\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91ca\u653e\u5185\u5b58\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
    hash_map_chaining.kt
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    val extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        // mutablelist \u65e0\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
    hash_map_chaining.rb
    ### \u952e\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapChaining\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) { [] } # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
    hash_map_chaining.zig
    [class]{HashMapChaining}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5f53\u94fe\u8868\u5f88\u957f\u65f6\uff0c\u67e5\u8be2\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u65f6\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u201cAVL \u6811\u201d\u6216\u201c\u7ea2\u9ed1\u6811\u201d\uff0c\u4ece\u800c\u5c06\u67e5\u8be2\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u5f00\u653e\u5bfb\u5740","text":"

    \u5f00\u653e\u5bfb\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u800c\u662f\u901a\u8fc7\u201c\u591a\u6b21\u63a2\u6d4b\u201d\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\uff0c\u63a2\u6d4b\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\u7b49\u3002

    \u4e0b\u9762\u4ee5\u7ebf\u6027\u63a2\u6d4b\u4e3a\u4f8b\uff0c\u4ecb\u7ecd\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u673a\u5236\u3002

    "},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7ebf\u6027\u63a2\u6d4b","text":"

    \u7ebf\u6027\u63a2\u6d4b\u91c7\u7528\u56fa\u5b9a\u6b65\u957f\u7684\u7ebf\u6027\u641c\u7d22\u6765\u8fdb\u884c\u63a2\u6d4b\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u4e0e\u666e\u901a\u54c8\u5e0c\u8868\u6709\u6240\u4e0d\u540c\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u53d1\u73b0\u6876\u5185\u5df2\u6709\u5143\u7d20\uff0c\u5219\u4ece\u51b2\u7a81\u4f4d\u7f6e\u5411\u540e\u7ebf\u6027\u904d\u5386\uff08\u6b65\u957f\u901a\u5e38\u4e3a \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c06\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
    • \u67e5\u627e\u5143\u7d20\uff1a\u82e5\u53d1\u73b0\u54c8\u5e0c\u51b2\u7a81\uff0c\u5219\u4f7f\u7528\u76f8\u540c\u6b65\u957f\u5411\u540e\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u76f4\u5230\u627e\u5230\u5bf9\u5e94\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8bf4\u660e\u76ee\u6807\u5143\u7d20\u4e0d\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

    \u56fe 6-6 \u5c55\u793a\u4e86\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03\u3002\u6839\u636e\u6b64\u54c8\u5e0c\u51fd\u6570\uff0c\u6700\u540e\u4e24\u4f4d\u76f8\u540c\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u901a\u8fc7\u7ebf\u6027\u63a2\u6d4b\uff0c\u5b83\u4eec\u88ab\u4f9d\u6b21\u5b58\u50a8\u5728\u8be5\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

    \u56fe 6-6 \u00a0 \u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03

    \u7136\u800c\uff0c\u7ebf\u6027\u63a2\u6d4b\u5bb9\u6613\u4ea7\u751f\u201c\u805a\u96c6\u73b0\u8c61\u201d\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u6570\u7ec4\u4e2d\u8fde\u7eed\u88ab\u5360\u7528\u7684\u4f4d\u7f6e\u8d8a\u957f\uff0c\u8fd9\u4e9b\u8fde\u7eed\u4f4d\u7f6e\u53d1\u751f\u54c8\u5e0c\u51b2\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u4ece\u800c\u8fdb\u4e00\u6b65\u4fc3\u4f7f\u8be5\u4f4d\u7f6e\u7684\u805a\u5806\u751f\u957f\uff0c\u5f62\u6210\u6076\u6027\u5faa\u73af\uff0c\u6700\u7ec8\u5bfc\u81f4\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u4eec\u4e0d\u80fd\u5728\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u4e2d\u76f4\u63a5\u5220\u9664\u5143\u7d20\u3002\u8fd9\u662f\u56e0\u4e3a\u5220\u9664\u5143\u7d20\u4f1a\u5728\u6570\u7ec4\u5185\u4ea7\u751f\u4e00\u4e2a\u7a7a\u6876 None \uff0c\u800c\u5f53\u67e5\u8be2\u5143\u7d20\u65f6\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230\u8be5\u7a7a\u6876\u5c31\u4f1a\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8be5\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u65e0\u6cd5\u518d\u88ab\u8bbf\u95ee\u5230\uff0c\u7a0b\u5e8f\u53ef\u80fd\u8bef\u5224\u8fd9\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u56fe 6-7 \u6240\u793a\u3002

    \u56fe 6-7 \u00a0 \u5728\u5f00\u653e\u5bfb\u5740\u4e2d\u5220\u9664\u5143\u7d20\u5bfc\u81f4\u7684\u67e5\u8be2\u95ee\u9898

    \u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u61d2\u5220\u9664\uff08lazy deletion\uff09\u673a\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u4ece\u54c8\u5e0c\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u4e2a\u5e38\u91cf TOMBSTONE \u6765\u6807\u8bb0\u8fd9\u4e2a\u6876\u3002\u5728\u8be5\u673a\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u952e\u503c\u5bf9\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230 TOMBSTONE \u65f6\u5e94\u8be5\u7ee7\u7eed\u904d\u5386\uff0c\u56e0\u4e3a\u5176\u4e4b\u4e0b\u53ef\u80fd\u8fd8\u5b58\u5728\u952e\u503c\u5bf9\u3002

    \u7136\u800c\uff0c\u61d2\u5220\u9664\u53ef\u80fd\u4f1a\u52a0\u901f\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u9000\u5316\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6b21\u5220\u9664\u64cd\u4f5c\u90fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5220\u9664\u6807\u8bb0\uff0c\u968f\u7740 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u7d22\u65f6\u95f4\u4e5f\u4f1a\u589e\u52a0\uff0c\u56e0\u4e3a\u7ebf\u6027\u63a2\u6d4b\u53ef\u80fd\u9700\u8981\u8df3\u8fc7\u591a\u4e2a TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6807\u5143\u7d20\u3002

    \u4e3a\u6b64\uff0c\u8003\u8651\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a TOMBSTONE \u7684\u7d22\u5f15\uff0c\u5e76\u5c06\u641c\u7d22\u5230\u7684\u76ee\u6807\u5143\u7d20\u4e0e\u8be5 TOMBSTONE \u4ea4\u6362\u4f4d\u7f6e\u3002\u8fd9\u6837\u505a\u7684\u597d\u5904\u662f\u5f53\u6bcf\u6b21\u67e5\u8be2\u6216\u6dfb\u52a0\u5143\u7d20\u65f6\uff0c\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u81f3\u8ddd\u79bb\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6d4b\u8d77\u59cb\u70b9\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u4ece\u800c\u4f18\u5316\u67e5\u8be2\u6548\u7387\u3002

    \u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u5305\u542b\u61d2\u5220\u9664\u7684\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u3002\u4e3a\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u770b\u4f5c\u4e00\u4e2a\u201c\u73af\u5f62\u6570\u7ec4\u201d\uff0c\u5f53\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
    class HashMapOpenAddressing:\n    \"\"\"\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u6570\u7ec4\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u5220\u9664\u6807\u8bb0\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
    hash_map_open_addressing.cpp
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4;                     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    const int extendRatio = 2;            // \u6269\u5bb9\u500d\u6570\n    vector<Pair *> buckets;               // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
    hash_map_open_addressing.java
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    private int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private final int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    private Pair[] buckets; // \u6876\u6570\u7ec4\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.cs
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    Pair[] buckets; // \u6876\u6570\u7ec4\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.go
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int     // \u6269\u5bb9\u500d\u6570\n    buckets     []*pair // \u6876\u6570\u7ec4\n    TOMBSTONE   *pair   // \u5220\u9664\u6807\u8bb0\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u636e\u952e\u8ba1\u7b97\u54c8\u5e0c\u503c\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8ba1\u7b97\u5f53\u524d\u8d1f\u8f7d\u56e0\u5b50\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u83b7\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8bb0\u5f55\u9047\u5230\u7684\u7b2c\u4e00\u4e2aTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7ebf\u6027\u63a2\u6d4b\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    }\n    return \"\" // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val\n    }\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        h.size--\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
    hash_map_open_addressing.swift
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [Pair?] // \u6876\u6570\u7ec4\n    var TOMBSTONE: Pair // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.js
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n    #TOMBSTONE; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.#capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.#extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u6570\u7ec4\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.ts
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    private capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    private buckets: Array<Pair | null>; // \u6876\u6570\u7ec4\n    private TOMBSTONE: Pair; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u6570\u7ec4\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.dart
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u952e\u503c\u5bf9\u6570\u91cf\n  int _capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  int _extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n  late List<Pair?> _buckets; // \u6876\u6570\u7ec4\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
    hash_map_open_addressing.rs
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity: usize,            // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extend_ratio: usize,        // \u6269\u5bb9\u500d\u6570\n    buckets: Vec<Option<Pair>>, // \u6876\u6570\u7ec4\n    TOMBSTONE: Option<Pair>,    // \u5220\u9664\u6807\u8bb0\n}\n\nimpl HashMapOpenAddressing {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u5efa\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        None\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.c
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Pair **buckets;   // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE;  // \u5220\u9664\u6807\u8bb0\n} HashMapOpenAddressing;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\";\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
    hash_map_open_addressing.kt
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u952e\u503c\u5bf9\u6570\u91cf\n    private var capacity: Int           // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private val extendRatio: Int        // \u6269\u5bb9\u500d\u6570\n    private var buckets: Array<Pair?>   // \u6876\u6570\u7ec4\n    private val TOMBSTONE: Pair         // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.rb
    ### \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u5220\u9664\u6807\u8bb0\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5f00\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
    hash_map_open_addressing.zig
    [class]{HashMapOpenAddressing}-[func]{}\n
    "},{"location":"chapter_hashing/hash_collision/#2","title":"2. \u00a0 \u5e73\u65b9\u63a2\u6d4b","text":"

    \u5e73\u65b9\u63a2\u6d4b\u4e0e\u7ebf\u6027\u63a2\u6d4b\u7c7b\u4f3c\uff0c\u90fd\u662f\u5f00\u653e\u5bfb\u5740\u7684\u5e38\u89c1\u7b56\u7565\u4e4b\u4e00\u3002\u5f53\u53d1\u751f\u51b2\u7a81\u65f6\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e0d\u662f\u7b80\u5355\u5730\u8df3\u8fc7\u4e00\u4e2a\u56fa\u5b9a\u7684\u6b65\u6570\uff0c\u800c\u662f\u8df3\u8fc7\u201c\u63a2\u6d4b\u6b21\u6570\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6570\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

    \u5e73\u65b9\u63a2\u6d4b\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u4f18\u52bf\u3002

    • \u5e73\u65b9\u63a2\u6d4b\u901a\u8fc7\u8df3\u8fc7\u63a2\u6d4b\u6b21\u6570\u5e73\u65b9\u7684\u8ddd\u79bb\uff0c\u8bd5\u56fe\u7f13\u89e3\u7ebf\u6027\u63a2\u6d4b\u7684\u805a\u96c6\u6548\u5e94\u3002
    • \u5e73\u65b9\u63a2\u6d4b\u4f1a\u8df3\u8fc7\u66f4\u5927\u7684\u8ddd\u79bb\u6765\u5bfb\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u4e8e\u6570\u636e\u5206\u5e03\u5f97\u66f4\u52a0\u5747\u5300\u3002

    \u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6d4b\u5e76\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

    • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73b0\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u5360\u7528\u3002
    • \u7531\u4e8e\u5e73\u65b9\u7684\u589e\u957f\uff0c\u5e73\u65b9\u63a2\u6d4b\u53ef\u80fd\u4e0d\u4f1a\u63a2\u6d4b\u6574\u4e2a\u54c8\u5e0c\u8868\uff0c\u8fd9\u610f\u5473\u7740\u5373\u4f7f\u54c8\u5e0c\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e5f\u53ef\u80fd\u65e0\u6cd5\u8bbf\u95ee\u5230\u5b83\u3002
    "},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u54c8\u5e0c","text":"

    \u987e\u540d\u601d\u4e49\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u8fdb\u884c\u63a2\u6d4b\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\) \u51fa\u73b0\u51b2\u7a81\uff0c\u5219\u5c1d\u8bd5 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u540e\u63d2\u5165\u5143\u7d20\u3002
    • \u67e5\u627e\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u54c8\u5e0c\u51fd\u6570\u987a\u5e8f\u4e0b\u8fdb\u884c\u67e5\u627e\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u65f6\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5c1d\u8bd5\u6240\u6709\u54c8\u5e0c\u51fd\u6570\uff0c\u8bf4\u660e\u54c8\u5e0c\u8868\u4e2d\u4e0d\u5b58\u5728\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de None \u3002

    \u4e0e\u7ebf\u6027\u63a2\u6d4b\u76f8\u6bd4\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u4f1a\u5e26\u6765\u989d\u5916\u7684\u8ba1\u7b97\u91cf\u3002

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\uff09\u54c8\u5e0c\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u201d\u7684\u95ee\u9898\u3002

    "},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u9009\u62e9","text":"

    \u5404\u79cd\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u7b56\u7565\uff0c\u4e0b\u9762\u4e3e\u51e0\u4e2a\u4f8b\u5b50\u3002

    • Python \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u4f2a\u968f\u673a\u6570\u8fdb\u884c\u63a2\u6d4b\u3002
    • Java \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002\u81ea JDK 1.8 \u4ee5\u6765\uff0c\u5f53 HashMap \u5185\u6570\u7ec4\u957f\u5ea6\u8fbe\u5230 64 \u4e14\u94fe\u8868\u957f\u5ea6\u8fbe\u5230 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u4ee5\u63d0\u5347\u67e5\u627e\u6027\u80fd\u3002
    • Go \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002Go \u89c4\u5b9a\u6bcf\u4e2a\u6876\u6700\u591a\u5b58\u50a8 8 \u4e2a\u952e\u503c\u5bf9\uff0c\u8d85\u51fa\u5bb9\u91cf\u5219\u8fde\u63a5\u4e00\u4e2a\u6ea2\u51fa\u6876\uff1b\u5f53\u6ea2\u51fa\u6876\u8fc7\u591a\u65f6\uff0c\u4f1a\u6267\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u6269\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u786e\u4fdd\u6027\u80fd\u3002
    "},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u54c8\u5e0c\u8868","text":"

    \u54c8\u5e0c\u8868\uff08hash table\uff09\uff0c\u53c8\u79f0\u6563\u5217\u8868\uff0c\u5b83\u901a\u8fc7\u5efa\u7acb\u952e key \u4e0e\u503c value \u4e4b\u95f4\u7684\u6620\u5c04\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8be2\u3002\u5177\u4f53\u800c\u8a00\uff0c\u6211\u4eec\u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u4e00\u4e2a\u952e key \uff0c\u5219\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u5bf9\u5e94\u7684\u503c value \u3002

    \u5982\u56fe 6-1 \u6240\u793a\uff0c\u7ed9\u5b9a \\(n\\) \u4e2a\u5b66\u751f\uff0c\u6bcf\u4e2a\u5b66\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b66\u53f7\u201d\u4e24\u9879\u6570\u636e\u3002\u5047\u5982\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u201c\u8f93\u5165\u4e00\u4e2a\u5b66\u53f7\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u59d3\u540d\u201d\u7684\u67e5\u8be2\u529f\u80fd\uff0c\u5219\u53ef\u4ee5\u91c7\u7528\u56fe 6-1 \u6240\u793a\u7684\u54c8\u5e0c\u8868\u6765\u5b9e\u73b0\u3002

    \u56fe 6-1 \u00a0 \u54c8\u5e0c\u8868\u7684\u62bd\u8c61\u8868\u793a

    \u9664\u54c8\u5e0c\u8868\u5916\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u5b83\u4eec\u7684\u6548\u7387\u5bf9\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

    • \u6dfb\u52a0\u5143\u7d20\uff1a\u4ec5\u9700\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u6570\u7ec4\uff08\u94fe\u8868\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
    • \u67e5\u8be2\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\uff08\u94fe\u8868\uff09\u662f\u4e71\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u904d\u5386\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
    • \u5220\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8be2\u5230\u5143\u7d20\uff0c\u518d\u4ece\u6570\u7ec4\uff08\u94fe\u8868\uff09\u4e2d\u5220\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002

    \u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8be2\u6548\u7387\u5bf9\u6bd4

    \u6570\u7ec4 \u94fe\u8868 \u54c8\u5e0c\u8868 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u5728\u54c8\u5e0c\u8868\u4e2d\u8fdb\u884c\u589e\u5220\u67e5\u6539\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u54c8\u5e0c\u8868\u5e38\u7528\u64cd\u4f5c","text":"

    \u54c8\u5e0c\u8868\u7684\u5e38\u89c1\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8be2\u64cd\u4f5c\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u548c\u5220\u9664\u952e\u503c\u5bf9\u7b49\uff0c\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap: dict = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.pop(10583)\n
    hash_map.cpp
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nunordered_map<int, string> map;\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.erase(10583);\n
    hash_map.java
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u5570\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9e2d\");\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
    hash_map.cs
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nDictionary<int, string> map = new() {\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    // \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u5570\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9e2d\" }\n};\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.Remove(10583);\n
    hash_map_test.go
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nhmap := make(map[int]string)\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\ndelete(hmap, 10583)\n
    hash_map.swift
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.removeValue(forKey: 10583)\n
    hash_map.js
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\n
    hash_map.ts
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map<number, string>();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\nconsole.info('\\n\u6dfb\u52a0\u5b8c\u6210\u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f93\u5165\u5b66\u53f7 15937 \uff0c\u67e5\u8be2\u5230\u59d3\u540d ' + name);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\nconsole.info('\\n\u5220\u9664 10583 \u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n
    hash_map.dart
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<int, String> map = {};\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
    hash_map.rs
    use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u5570\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9e2d\".to_string());\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
    hash_map.kt
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583)\n
    hash_map.rb
    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.delete(10583)\n
    hash_map.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u54c8\u5e0c\u8868\u6709\u4e09\u79cd\u5e38\u7528\u7684\u904d\u5386\u65b9\u5f0f\uff1a\u904d\u5386\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u548c\u904d\u5386\u503c\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u5355\u72ec\u904d\u5386\u952e key\nfor key in hmap.keys():\n    print(key)\n# \u5355\u72ec\u904d\u5386\u503c value\nfor value in hmap.values():\n    print(value)\n
    hash_map.cpp
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u904d\u5386 key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
    hash_map.java
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
    hash_map.cs
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
    hash_map_test.go
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
    hash_map.swift
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys {\n    print(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values {\n    print(value)\n}\n
    hash_map.js
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.ts
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.dart
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
    hash_map.rs
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
    hash_map.kt
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (key in map.keys) {\n    println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
    hash_map.rb
    # \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u5355\u72ec\u904d\u5386\u952e key\nhmap.keys.each { |key| puts key }\n\n# \u5355\u72ec\u904d\u5386\u503c value\nhmap.values.each { |val| puts val }\n
    hash_map.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u54c8\u5e0c\u8868\u7b80\u5355\u5b9e\u73b0","text":"

    \u6211\u4eec\u5148\u8003\u8651\u6700\u7b80\u5355\u7684\u60c5\u51b5\uff0c\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u5b9e\u73b0\u54c8\u5e0c\u8868\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5c06\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u7a7a\u4f4d\u79f0\u4e3a\u6876\uff08bucket\uff09\uff0c\u6bcf\u4e2a\u6876\u53ef\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u56e0\u6b64\uff0c\u67e5\u8be2\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5bf9\u5e94\u7684\u6876\uff0c\u5e76\u5728\u6876\u4e2d\u83b7\u53d6 value \u3002

    \u90a3\u4e48\uff0c\u5982\u4f55\u57fa\u4e8e key \u5b9a\u4f4d\u5bf9\u5e94\u7684\u6876\u5462\uff1f\u8fd9\u662f\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\uff08hash function\uff09\u5b9e\u73b0\u7684\u3002\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u8f93\u51fa\u7a7a\u95f4\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8f93\u5165\u7a7a\u95f4\u662f\u6240\u6709 key \uff0c\u8f93\u51fa\u7a7a\u95f4\u662f\u6240\u6709\u6876\uff08\u6570\u7ec4\u7d22\u5f15\uff09\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u8f93\u5165\u4e00\u4e2a key \uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u8be5 key \u5bf9\u5e94\u7684\u952e\u503c\u5bf9\u5728\u6570\u7ec4\u4e2d\u7684\u5b58\u50a8\u4f4d\u7f6e\u3002

    \u8f93\u5165\u4e00\u4e2a key \uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u8fc7\u7a0b\u5206\u4e3a\u4ee5\u4e0b\u4e24\u6b65\u3002

    1. \u901a\u8fc7\u67d0\u79cd\u54c8\u5e0c\u7b97\u6cd5 hash() \u8ba1\u7b97\u5f97\u5230\u54c8\u5e0c\u503c\u3002
    2. \u5c06\u54c8\u5e0c\u503c\u5bf9\u6876\u6570\u91cf\uff08\u6570\u7ec4\u957f\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u4ece\u800c\u83b7\u53d6\u8be5 key \u5bf9\u5e94\u7684\u6570\u7ec4\u7d22\u5f15 index \u3002
    index = hash(key) % capacity\n

    \u968f\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u54c8\u5e0c\u8868\u4e2d\u8bbf\u95ee\u5bf9\u5e94\u7684\u6876\uff0c\u4ece\u800c\u83b7\u53d6 value \u3002

    \u8bbe\u6570\u7ec4\u957f\u5ea6 capacity = 100\u3001\u54c8\u5e0c\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u54c8\u5e0c\u51fd\u6570\u4e3a key % 100 \u3002\u56fe 6-2 \u4ee5 key \u5b66\u53f7\u548c value \u59d3\u540d\u4e3a\u4f8b\uff0c\u5c55\u793a\u4e86\u54c8\u5e0c\u51fd\u6570\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u56fe 6-2 \u00a0 \u54c8\u5e0c\u51fd\u6570\u5de5\u4f5c\u539f\u7406

    \u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u7b80\u5355\u54c8\u5e0c\u8868\u3002\u5176\u4e2d\uff0c\u6211\u4eec\u5c06 key \u548c value \u5c01\u88c5\u6210\u4e00\u4e2a\u7c7b Pair \uff0c\u4ee5\u8868\u793a\u952e\u503c\u5bf9\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
    class Pair:\n    \"\"\"\u952e\u503c\u5bf9\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
    array_hash_map.cpp
    /* \u952e\u503c\u5bf9 */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91ca\u653e\u5185\u5b58\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
    array_hash_map.java
    /* \u952e\u503c\u5bf9 */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
    array_hash_map.cs
    /* \u952e\u503c\u5bf9 int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
    array_hash_map.go
    /* \u952e\u503c\u5bf9 */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    a.buckets[index] = nil\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
    array_hash_map.swift
    /* \u952e\u503c\u5bf9 */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = nil\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
    array_hash_map.js
    /* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
    array_hash_map.ts
    /* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
    array_hash_map.dart
    /* \u952e\u503c\u5bf9 */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
    array_hash_map.rs
    /* \u952e\u503c\u5bf9 */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
    array_hash_map.c
    /* \u952e\u503c\u5bf9 int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
    array_hash_map.kt
    /* \u952e\u503c\u5bf9 */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
    array_hash_map.rb
    ### \u952e\u503c\u5bf9 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 ###\nclass ArrayHashMap\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
    array_hash_map.zig
    // \u952e\u503c\u5bf9\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u4e2a\u957f\u5ea6\u4e3a 100 \u7684\u6876\uff08\u6570\u7ec4\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u6784\u51fd\u6570\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u54c8\u5e0c\u51fd\u6570\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8be2\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u6dfb\u52a0\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u5220\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u952e\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u6253\u5370\u54c8\u5e0c\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u4e0e\u6269\u5bb9","text":"

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u6240\u6709 key \u6784\u6210\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u6570\u7ec4\u6240\u6709\u7d22\u5f15\u6784\u6210\u7684\u8f93\u51fa\u7a7a\u95f4\uff0c\u800c\u8f93\u5165\u7a7a\u95f4\u5f80\u5f80\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7406\u8bba\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u76f8\u540c\u8f93\u51fa\u201d\u7684\u60c5\u51b5\u3002

    \u5bf9\u4e8e\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u54c8\u5e0c\u51fd\u6570\uff0c\u5f53\u8f93\u5165\u7684 key \u540e\u4e24\u4f4d\u76f8\u540c\u65f6\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u51fa\u7ed3\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8be2\u5b66\u53f7\u4e3a 12836 \u548c 20336 \u7684\u4e24\u4e2a\u5b66\u751f\u65f6\uff0c\u6211\u4eec\u5f97\u5230\uff1a

    12836 % 100 = 36\n20336 % 100 = 36\n

    \u5982\u56fe 6-3 \u6240\u793a\uff0c\u4e24\u4e2a\u5b66\u53f7\u6307\u5411\u4e86\u540c\u4e00\u4e2a\u59d3\u540d\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002\u6211\u4eec\u5c06\u8fd9\u79cd\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u540c\u4e00\u8f93\u51fa\u7684\u60c5\u51b5\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\uff08hash collision\uff09\u3002

    \u56fe 6-3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u793a\u4f8b

    \u5bb9\u6613\u60f3\u5230\uff0c\u54c8\u5e0c\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u4e2a key \u88ab\u5206\u914d\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\uff0c\u51b2\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002

    \u5982\u56fe 6-4 \u6240\u793a\uff0c\u6269\u5bb9\u524d\u952e\u503c\u5bf9 (136, A) \u548c (236, D) \u53d1\u751f\u51b2\u7a81\uff0c\u6269\u5bb9\u540e\u51b2\u7a81\u6d88\u5931\u3002

    \u56fe 6-4 \u00a0 \u54c8\u5e0c\u8868\u6269\u5bb9

    \u7c7b\u4f3c\u4e8e\u6570\u7ec4\u6269\u5bb9\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u5c06\u6240\u6709\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u8fc1\u79fb\u81f3\u65b0\u54c8\u5e0c\u8868\uff0c\u975e\u5e38\u8017\u65f6\uff1b\u5e76\u4e14\u7531\u4e8e\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u6539\u53d8\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u6765\u91cd\u65b0\u8ba1\u7b97\u6240\u6709\u952e\u503c\u5bf9\u7684\u5b58\u50a8\u4f4d\u7f6e\uff0c\u8fd9\u8fdb\u4e00\u6b65\u589e\u52a0\u4e86\u6269\u5bb9\u8fc7\u7a0b\u7684\u8ba1\u7b97\u5f00\u9500\u3002\u4e3a\u6b64\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u9884\u7559\u8db3\u591f\u5927\u7684\u54c8\u5e0c\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u9891\u7e41\u6269\u5bb9\u3002

    \u8d1f\u8f7d\u56e0\u5b50\uff08load factor\uff09\u662f\u54c8\u5e0c\u8868\u7684\u4e00\u4e2a\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u7684\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u7528\u4e8e\u8861\u91cf\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u89e6\u53d1\u6761\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(0.75\\) \u65f6\uff0c\u7cfb\u7edf\u4f1a\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

    "},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u8f93\u5165 key \uff0c\u54c8\u5e0c\u8868\u80fd\u591f\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u67e5\u8be2\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
    • \u5e38\u89c1\u7684\u54c8\u5e0c\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8be2\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u3001\u5220\u9664\u952e\u503c\u5bf9\u548c\u904d\u5386\u54c8\u5e0c\u8868\u7b49\u3002
    • \u54c8\u5e0c\u51fd\u6570\u5c06 key \u6620\u5c04\u4e3a\u6570\u7ec4\u7d22\u5f15\uff0c\u4ece\u800c\u8bbf\u95ee\u5bf9\u5e94\u6876\u5e76\u83b7\u53d6 value \u3002
    • \u4e24\u4e2a\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u540e\u5f97\u5230\u76f8\u540c\u7684\u6570\u7ec4\u7d22\u5f15\uff0c\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u51fa\u9519\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\u3002
    • \u54c8\u5e0c\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\u3002\u4e0e\u6570\u7ec4\u6269\u5bb9\u7c7b\u4f3c\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u64cd\u4f5c\u7684\u5f00\u9500\u5f88\u5927\u3002
    • \u8d1f\u8f7d\u56e0\u5b50\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u4e2d\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u53cd\u6620\u4e86\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89e6\u53d1\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u6761\u4ef6\u3002
    • \u94fe\u5f0f\u5730\u5740\u901a\u8fc7\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u5316\u4e3a\u94fe\u8868\uff0c\u5c06\u6240\u6709\u51b2\u7a81\u5143\u7d20\u5b58\u50a8\u5728\u540c\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002\u7136\u800c\uff0c\u94fe\u8868\u8fc7\u957f\u4f1a\u964d\u4f4e\u67e5\u8be2\u6548\u7387\uff0c\u53ef\u4ee5\u901a\u8fc7\u8fdb\u4e00\u6b65\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6765\u63d0\u9ad8\u6548\u7387\u3002
    • \u5f00\u653e\u5bfb\u5740\u901a\u8fc7\u591a\u6b21\u63a2\u6d4b\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\u3002\u7ebf\u6027\u63a2\u6d4b\u4f7f\u7528\u56fa\u5b9a\u6b65\u957f\uff0c\u7f3a\u70b9\u662f\u4e0d\u80fd\u5220\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u4ea7\u751f\u805a\u96c6\u3002\u591a\u6b21\u54c8\u5e0c\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u8fdb\u884c\u63a2\u6d4b\uff0c\u76f8\u8f83\u7ebf\u6027\u63a2\u6d4b\u66f4\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u589e\u52a0\u4e86\u8ba1\u7b97\u91cf\u3002
    • \u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u94fe\u5f0f\u5730\u5740\uff0c\u800c Python \u7684 Dict \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002
    • \u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5e0c\u671b\u54c8\u5e0c\u7b97\u6cd5\u5177\u6709\u786e\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u5300\u5206\u5e03\u7684\u7279\u70b9\u3002\u5728\u5bc6\u7801\u5b66\u4e2d\uff0c\u54c8\u5e0c\u7b97\u6cd5\u8fd8\u5e94\u8be5\u5177\u5907\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u5e94\u3002
    • \u54c8\u5e0c\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u5747\u5300\u5206\u5e03\uff0c\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002
    • \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u4e8e\u6821\u9a8c\u6587\u4ef6\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u4e8e\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u3002
    • \u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u662f\u53ef\u54c8\u5e0c\u7684\u3002
    "},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f \\(O(n)\\) \uff1f

    \u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u5f53\u54c8\u5e0c\u51fd\u6570\u8bbe\u8ba1\u5f97\u6bd4\u8f83\u597d\u3001\u5bb9\u91cf\u8bbe\u7f6e\u6bd4\u8f83\u5408\u7406\u3001\u51b2\u7a81\u6bd4\u8f83\u5e73\u5747\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u4eec\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u54c8\u5e0c\u8868\u65f6\uff0c\u901a\u5e38\u8ba4\u4e3a\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u4e0d\u4f7f\u7528\u54c8\u5e0c\u51fd\u6570 \\(f(x) = x\\) \u5462\uff1f\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u51b2\u7a81\u4e86\u3002

    \u5728 \\(f(x) = x\\) \u54c8\u5e0c\u51fd\u6570\u4e0b\uff0c\u6bcf\u4e2a\u5143\u7d20\u5bf9\u5e94\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u8fd9\u4e0e\u6570\u7ec4\u7b49\u4ef7\u3002\u7136\u800c\uff0c\u8f93\u5165\u7a7a\u95f4\u901a\u5e38\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff08\u6570\u7ec4\u957f\u5ea6\uff09\uff0c\u56e0\u6b64\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u54c8\u5e0c\u8868\u7684\u76ee\u6807\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u72b6\u6001\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u7a7a\u95f4\uff0c\u5e76\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8be2\u6548\u7387\u3002

    Q\uff1a\u54c8\u5e0c\u8868\u5e95\u5c42\u5b9e\u73b0\u662f\u6570\u7ec4\u3001\u94fe\u8868\u3001\u4e8c\u53c9\u6811\uff0c\u4f46\u4e3a\u4ec0\u4e48\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u4eec\u66f4\u9ad8\u5462\uff1f

    \u9996\u5148\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\uff0c\u4f46\u7a7a\u95f4\u6548\u7387\u53d8\u4f4e\u4e86\u3002\u54c8\u5e0c\u8868\u6709\u76f8\u5f53\u4e00\u90e8\u5206\u5185\u5b58\u672a\u4f7f\u7528\u3002

    \u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u573a\u666f\u4e0b\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u4e2a\u529f\u80fd\u80fd\u591f\u5728\u76f8\u540c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u4f7f\u7528\u6570\u7ec4\u6216\u94fe\u8868\u5b9e\u73b0\uff0c\u90a3\u4e48\u901a\u5e38\u6bd4\u54c8\u5e0c\u8868\u66f4\u5feb\u3002\u8fd9\u662f\u56e0\u4e3a\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u9700\u8981\u5f00\u9500\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u6570\u9879\u66f4\u5927\u3002

    \u6700\u540e\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u80fd\u53d1\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u94fe\u5f0f\u5730\u5740\u4e2d\uff0c\u6211\u4eec\u91c7\u53d6\u5728\u94fe\u8868\u6216\u7ea2\u9ed1\u6811\u4e2d\u6267\u884c\u67e5\u627e\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u65f6\u95f4\u7684\u98ce\u9669\u3002

    Q\uff1a\u591a\u6b21\u54c8\u5e0c\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\u5417\uff1f\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u8fd8\u80fd\u518d\u6b21\u4f7f\u7528\u5417\uff1f

    \u591a\u6b21\u54c8\u5e0c\u662f\u5f00\u653e\u5bfb\u5740\u7684\u4e00\u79cd\uff0c\u5f00\u653e\u5bfb\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u901a\u8fc7\u6807\u8bb0\u5220\u9664\u3002\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u5f53\u5c06\u65b0\u5143\u7d20\u63d2\u5165\u54c8\u5e0c\u8868\uff0c\u5e76\u4e14\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u4f4d\u7f6e\u65f6\uff0c\u8be5\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u8fd9\u6837\u505a\u65e2\u80fd\u4fdd\u6301\u54c8\u5e0c\u8868\u7684\u63a2\u6d4b\u5e8f\u5217\u4e0d\u53d8\uff0c\u53c8\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\u4f7f\u7528\u7387\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\uff0c\u67e5\u627e\u5143\u7d20\u7684\u65f6\u5019\u4f1a\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u5462\uff1f

    \u67e5\u627e\u7684\u65f6\u5019\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u5bf9\u5e94\u7684\u6876\u548c\u952e\u503c\u5bf9\uff0c\u53d1\u73b0 key \u4e0d\u5339\u914d\uff0c\u8fd9\u5c31\u4ee3\u8868\u6709\u54c8\u5e0c\u51b2\u7a81\u3002\u56e0\u6b64\uff0c\u7ebf\u6027\u63a2\u6d4b\u6cd5\u4f1a\u6839\u636e\u9884\u5148\u8bbe\u5b9a\u7684\u6b65\u957f\u4f9d\u6b21\u5411\u4e0b\u67e5\u627e\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u786e\u7684\u952e\u503c\u5bf9\u6216\u65e0\u6cd5\u627e\u5230\u8df3\u51fa\u4e3a\u6b62\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u6269\u5bb9\u80fd\u591f\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\uff1f

    \u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\uff0c\u8ba9\u8f93\u51fa\u503c\u843d\u5728\u6570\u7ec4\u7d22\u5f15\u8303\u56f4\u5185\uff1b\u5728\u6269\u5bb9\u540e\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d1\u751f\u53d8\u5316\uff0c\u800c key \u5bf9\u5e94\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u4e2a\u6876\u7684\u591a\u4e2a key \uff0c\u5728\u6269\u5bb9\u540e\u53ef\u80fd\u4f1a\u88ab\u5206\u914d\u5230\u591a\u4e2a\u6876\u4e2d\uff0c\u4ece\u800c\u5b9e\u73b0\u54c8\u5e0c\u51b2\u7a81\u7684\u7f13\u89e3\u3002

    "},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806","text":"

    Abstract

    \u5806\u5c31\u50cf\u662f\u5c71\u5cb3\u5cf0\u5ce6\uff0c\u5c42\u53e0\u8d77\u4f0f\u3001\u5f62\u6001\u5404\u5f02\u3002

    \u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u9519\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u603b\u662f\u6700\u5148\u6620\u5165\u773c\u5e18\u3002

    "},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 8.1 \u00a0 \u5806
    • 8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c
    • 8.3 \u00a0 Top-k \u95ee\u9898
    • 8.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c","text":"

    \u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u6765\u6784\u5efa\u4e00\u4e2a\u5806\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u88ab\u79f0\u4e3a\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u3002

    "},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u501f\u52a9\u5165\u5806\u64cd\u4f5c\u5b9e\u73b0","text":"

    \u6211\u4eec\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u7a7a\u5806\uff0c\u7136\u540e\u904d\u5386\u5217\u8868\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u5143\u7d20\u6267\u884c\u201c\u5165\u5806\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u5806\u7684\u5c3e\u90e8\uff0c\u518d\u5bf9\u8be5\u5143\u7d20\u6267\u884c\u201c\u4ece\u5e95\u81f3\u9876\u201d\u5806\u5316\u3002

    \u6bcf\u5f53\u4e00\u4e2a\u5143\u7d20\u5165\u5806\uff0c\u5806\u7684\u957f\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u4e8e\u8282\u70b9\u662f\u4ece\u9876\u5230\u5e95\u4f9d\u6b21\u88ab\u6dfb\u52a0\u8fdb\u4e8c\u53c9\u6811\u7684\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u6784\u5efa\u7684\u3002

    \u8bbe\u5143\u7d20\u6570\u91cf\u4e3a \\(n\\) \uff0c\u6bcf\u4e2a\u5143\u7d20\u7684\u5165\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u65f6\u95f4\uff0c\u56e0\u6b64\u8be5\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    "},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u901a\u8fc7\u904d\u5386\u5806\u5316\u5b9e\u73b0","text":"

    \u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u4e00\u79cd\u66f4\u4e3a\u9ad8\u6548\u7684\u5efa\u5806\u65b9\u6cd5\uff0c\u5171\u5206\u4e3a\u4e24\u6b65\u3002

    1. \u5c06\u5217\u8868\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u5730\u6dfb\u52a0\u5230\u5806\u4e2d\uff0c\u6b64\u65f6\u5806\u7684\u6027\u8d28\u5c1a\u672a\u5f97\u5230\u6ee1\u8db3\u3002
    2. \u5012\u5e8f\u904d\u5386\u5806\uff08\u5c42\u5e8f\u904d\u5386\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u975e\u53f6\u8282\u70b9\u6267\u884c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u3002

    \u6bcf\u5f53\u5806\u5316\u4e00\u4e2a\u8282\u70b9\u540e\uff0c\u4ee5\u8be5\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\u5c31\u5f62\u6210\u4e00\u4e2a\u5408\u6cd5\u7684\u5b50\u5806\u3002\u800c\u7531\u4e8e\u662f\u5012\u5e8f\u904d\u5386\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u6784\u5efa\u7684\u3002

    \u4e4b\u6240\u4ee5\u9009\u62e9\u5012\u5e8f\u904d\u5386\uff0c\u662f\u56e0\u4e3a\u8fd9\u6837\u80fd\u591f\u4fdd\u8bc1\u5f53\u524d\u8282\u70b9\u4e4b\u4e0b\u7684\u5b50\u6811\u5df2\u7ecf\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u8fd9\u6837\u5806\u5316\u5f53\u524d\u8282\u70b9\u624d\u662f\u6709\u6548\u7684\u3002

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u7531\u4e8e\u53f6\u8282\u70b9\u6ca1\u6709\u5b50\u8282\u70b9\uff0c\u56e0\u6b64\u5b83\u4eec\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u65e0\u987b\u5806\u5316\u3002\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u6700\u540e\u4e00\u4e2a\u975e\u53f6\u8282\u70b9\u662f\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u6211\u4eec\u4ece\u5b83\u5f00\u59cb\u5012\u5e8f\u904d\u5386\u5e76\u6267\u884c\u5806\u5316\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def __init__(self, nums: list[int]):\n    \"\"\"\u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\"\"\"\n    # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    self.max_heap = nums\n    # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
    my_heap.cpp
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(vector<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums;\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.java
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<Integer> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.cs
    /* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new List<int>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
    my_heap.go
    /* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        h.siftDown(i)\n    }\n    return h\n}\n
    my_heap.swift
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\ninit(nums: [Int]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
    my_heap.js
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
    my_heap.ts
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums?: number[]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
    my_heap.dart
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<int> nums) {\n  // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  _maxHeap = nums;\n  // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
    my_heap.rs
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
    my_heap.c
    /* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
    my_heap.kt
    /* \u5927\u9876\u5806 */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u5217\u8868\u800c\u975e\u6570\u7ec4\uff0c\u8fd9\u6837\u65e0\u987b\u8003\u8651\u6269\u5bb9\u95ee\u9898\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\n    init {\n        // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n        maxHeap.addAll(nums!!)\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u6362\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806 */\n    fun push(_val: Int) {\n        // \u6dfb\u52a0\u8282\u70b9\n        maxHeap.add(_val)\n        // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n            val p = parent(i)\n            // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, p)\n            // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806 */\n    fun pop(): Int {\n        // \u5224\u7a7a\u5904\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u5220\u9664\u8282\u70b9\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n        return _val\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, ma)\n            // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n            i = ma\n        }\n    }\n\n    /* \u6253\u5370\u5806\uff08\u4e8c\u53c9\u6811\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
    my_heap.rb
    ### \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 ###\ndef initialize(nums)\n  # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  @max_heap = nums\n  # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n
    my_heap.zig
    // \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u4e0b\u9762\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u63a8\u7b97\u7b2c\u4e8c\u79cd\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    • \u5047\u8bbe\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u5219\u53f6\u8282\u70b9\u6570\u91cf\u4e3a \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u4e3a\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u5316\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\((n - 1) / 2\\) \u3002
    • \u5728\u4ece\u9876\u81f3\u5e95\u5806\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e2a\u8282\u70b9\u6700\u591a\u5806\u5316\u5230\u53f6\u8282\u70b9\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u4e3a\u4e8c\u53c9\u6811\u9ad8\u5ea6 \\(\\log n\\) \u3002

    \u5c06\u4e0a\u8ff0\u4e24\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u8fc7\u7a0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u4f46\u8fd9\u4e2a\u4f30\u7b97\u7ed3\u679c\u5e76\u4e0d\u51c6\u786e\uff0c\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u8003\u8651\u5230\u4e8c\u53c9\u6811\u5e95\u5c42\u8282\u70b9\u6570\u91cf\u8fdc\u591a\u4e8e\u9876\u5c42\u8282\u70b9\u7684\u6027\u8d28\u3002

    \u63a5\u4e0b\u6765\u6211\u4eec\u6765\u8fdb\u884c\u66f4\u4e3a\u51c6\u786e\u7684\u8ba1\u7b97\u3002\u4e3a\u4e86\u964d\u4f4e\u8ba1\u7b97\u96be\u5ea6\uff0c\u5047\u8bbe\u7ed9\u5b9a\u4e00\u4e2a\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \u3001\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff0c\u8be5\u5047\u8bbe\u4e0d\u4f1a\u5f71\u54cd\u8ba1\u7b97\u7ed3\u679c\u7684\u6b63\u786e\u6027\u3002

    \u56fe 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u5404\u5c42\u8282\u70b9\u6570\u91cf

    \u5982\u56fe 8-5 \u6240\u793a\uff0c\u8282\u70b9\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u7b49\u4e8e\u8be5\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u800c\u8be5\u8ddd\u79bb\u6b63\u662f\u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u5404\u5c42\u7684\u201c\u8282\u70b9\u6570\u91cf \\(\\times\\) \u8282\u70b9\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u8282\u70b9\u7684\u5806\u5316\u8fed\u4ee3\u6b21\u6570\u7684\u603b\u548c\u3002

    \\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

    \u5316\u7b80\u4e0a\u5f0f\u9700\u8981\u501f\u52a9\u4e2d\u5b66\u7684\u6570\u5217\u77e5\u8bc6\uff0c\u5148\u5c06 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230\uff1a

    \\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^{h}\\times1 \\newline \\end{aligned} \\]

    \u4f7f\u7528\u9519\u4f4d\u76f8\u51cf\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u51cf\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97\uff1a

    \\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

    \u89c2\u5bdf\u4e0a\u5f0f\uff0c\u53d1\u73b0 \\(T(h)\\) \u662f\u4e00\u4e2a\u7b49\u6bd4\u6570\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

    \\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

    \u8fdb\u4e00\u6b65\uff0c\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u590d\u6742\u5ea6\u4e3a \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806","text":"

    \u5806\uff08heap\uff09\u662f\u4e00\u79cd\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u4e3b\u8981\u53ef\u5206\u4e3a\u4e24\u79cd\u7c7b\u578b\uff0c\u5982\u56fe 8-1 \u6240\u793a\u3002

    • \u5c0f\u9876\u5806\uff08min heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\leq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002
    • \u5927\u9876\u5806\uff08max heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\geq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002

    \u56fe 8-1 \u00a0 \u5c0f\u9876\u5806\u4e0e\u5927\u9876\u5806

    \u5806\u4f5c\u4e3a\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u6700\u5e95\u5c42\u8282\u70b9\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u3002
    • \u6211\u4eec\u5c06\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u9876\u201d\uff0c\u5c06\u5e95\u5c42\u6700\u9760\u53f3\u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u5e95\u201d\u3002
    • \u5bf9\u4e8e\u5927\u9876\u5806\uff08\u5c0f\u9876\u5806\uff09\uff0c\u5806\u9876\u5143\u7d20\uff08\u6839\u8282\u70b9\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
    "},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u662f\u4f18\u5148\u961f\u5217\uff08priority queue\uff09\uff0c\u8fd9\u662f\u4e00\u79cd\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b9a\u4e49\u4e3a\u5177\u6709\u4f18\u5148\u7ea7\u6392\u5e8f\u7684\u961f\u5217\u3002

    \u5b9e\u9645\u4e0a\uff0c\u5806\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u4f18\u5148\u961f\u5217\uff0c\u5927\u9876\u5806\u76f8\u5f53\u4e8e\u5143\u7d20\u6309\u4ece\u5927\u5230\u5c0f\u7684\u987a\u5e8f\u51fa\u961f\u7684\u4f18\u5148\u961f\u5217\u3002\u4ece\u4f7f\u7528\u89d2\u5ea6\u6765\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u201c\u4f18\u5148\u961f\u5217\u201d\u548c\u201c\u5806\u201d\u770b\u4f5c\u7b49\u4ef7\u7684\u6570\u636e\u7ed3\u6784\u3002\u56e0\u6b64\uff0c\u672c\u4e66\u5bf9\u4e24\u8005\u4e0d\u505a\u7279\u522b\u533a\u5206\uff0c\u7edf\u4e00\u79f0\u4f5c\u201c\u5806\u201d\u3002

    \u5806\u7684\u5e38\u7528\u64cd\u4f5c\u89c1\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

    \u8868 8-1 \u00a0 \u5806\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u5806 \\(O(\\log n)\\) pop() \u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) peek() \u8bbf\u95ee\u5806\u9876\u5143\u7d20\uff08\u5bf9\u4e8e\u5927 / \u5c0f\u9876\u5806\u5206\u522b\u4e3a\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u83b7\u53d6\u5806\u7684\u5143\u7d20\u6570\u91cf \\(O(1)\\) isEmpty() \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a \\(O(1)\\)

    \u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u5806\u7c7b\uff08\u6216\u4f18\u5148\u961f\u5217\u7c7b\uff09\u3002

    \u7c7b\u4f3c\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u201c\u4ece\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u4ece\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e2a flag \u6216\u4fee\u6539 Comparator \u5b9e\u73b0\u201c\u5c0f\u9876\u5806\u201d\u4e0e\u201c\u5927\u9876\u5806\u201d\u4e4b\u95f4\u7684\u8f6c\u6362\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u5757\u9ed8\u8ba4\u5b9e\u73b0\u5c0f\u9876\u5806\n# \u8003\u8651\u5c06\u201c\u5143\u7d20\u53d6\u8d1f\u201d\u540e\u518d\u5165\u5806\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5c06\u5927\u5c0f\u5173\u7cfb\u98a0\u5012\uff0c\u4ece\u800c\u5b9e\u73b0\u5927\u9876\u5806\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u65f6\u5bf9\u5e94\u5c0f\u9876\u5806\uff0cflag = -1 \u65f6\u5bf9\u5e94\u5927\u9876\u5806\n\n# \u5143\u7d20\u5165\u5806\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u9876\u5143\u7d20\u51fa\u5806\n# \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
    heap.cpp
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9876\u5806\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
    heap.java
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
    heap.cs
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
    heap.go
    // Go \u8bed\u8a00\u4e2d\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0 heap.Interface \u6765\u6784\u5efa\u6574\u6570\u5927\u9876\u5806\n// \u5b9e\u73b0 heap.Interface \u9700\u8981\u540c\u65f6\u5b9e\u73b0 sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u63a8\u5165\u5143\u7d20\u5230\u5806\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u4e3a\u53c2\u6570\n    // \u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4f1a\u5bf9\u5207\u7247\u7684\u5185\u5bb9\u8fdb\u884c\u8c03\u6574\uff0c\u8fd8\u4f1a\u4fee\u6539\u5207\u7247\u7684\u957f\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u5f39\u51fa\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u5143\u7d20\u5b58\u653e\u5728\u6700\u540e\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5b9e\u73b0\u5c0f\u9876\u5806\uff0c\u5219\u9700\u8981\u8c03\u6574\u4e3a\u5c0f\u4e8e\u53f7\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806 */\n    // \u521d\u59cb\u5316\u5927\u9876\u5806\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n\n    /* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
    heap.swift
    /* \u521d\u59cb\u5316\u5806 */\n// Swift \u7684 Heap \u7c7b\u578b\u540c\u65f6\u652f\u6301\u6700\u5927\u5806\u548c\u6700\u5c0f\u5806\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806 */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
    heap.js
    // JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.ts
    // TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.dart
    // Dart \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.rs
    use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806 */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
    heap.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.kt
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
    heap.rb
    # Ruby \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7684\u5b9e\u73b0","text":"

    \u4e0b\u6587\u5b9e\u73b0\u7684\u662f\u5927\u9876\u5806\u3002\u82e5\u8981\u5c06\u5176\u8f6c\u6362\u4e3a\u5c0f\u9876\u5806\uff0c\u53ea\u9700\u5c06\u6240\u6709\u5927\u5c0f\u903b\u8f91\u5224\u65ad\u8fdb\u884c\u9006\u8f6c\uff08\u4f8b\u5982\uff0c\u5c06 \\(\\geq\\) \u66ff\u6362\u4e3a \\(\\leq\\) \uff09\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

    "},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7684\u5b58\u50a8\u4e0e\u8868\u793a","text":"

    \u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u8bb2\u8fc7\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u7531\u4e8e\u5806\u6b63\u662f\u4e00\u79cd\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u91c7\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002

    \u5f53\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u4e8c\u53c9\u6811\u65f6\uff0c\u5143\u7d20\u4ee3\u8868\u8282\u70b9\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u8282\u70b9\u5728\u4e8c\u53c9\u6811\u4e2d\u7684\u4f4d\u7f6e\u3002\u8282\u70b9\u6307\u9488\u901a\u8fc7\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u6765\u5b9e\u73b0\u3002

    \u5982\u56fe 8-2 \u6240\u793a\uff0c\u7ed9\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 2\\) \uff0c\u7236\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u5f53\u7d22\u5f15\u8d8a\u754c\u65f6\uff0c\u8868\u793a\u7a7a\u8282\u70b9\u6216\u8282\u70b9\u4e0d\u5b58\u5728\u3002

    \u56fe 8-2 \u00a0 \u5806\u7684\u8868\u793a\u4e0e\u5b58\u50a8

    \u6211\u4eec\u53ef\u4ee5\u5c06\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def left(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
    my_heap.cpp
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.java
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.cs
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.go
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
    my_heap.swift
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.js
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.ts
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.dart
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rs
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.c
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
    my_heap.kt
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rb
    ### \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
    my_heap.zig
    // \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
    "},{"location":"chapter_heap/heap/#2","title":"2. \u00a0 \u8bbf\u95ee\u5806\u9876\u5143\u7d20","text":"

    \u5806\u9876\u5143\u7d20\u5373\u4e3a\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u4e5f\u5c31\u662f\u5217\u8868\u7684\u9996\u4e2a\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def peek(self) -> int:\n    \"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
    my_heap.cpp
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
    my_heap.java
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
    my_heap.cs
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
    my_heap.go
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
    my_heap.swift
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
    my_heap.js
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
    my_heap.ts
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
    my_heap.dart
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
    my_heap.rs
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
    my_heap.c
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
    my_heap.kt
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
    my_heap.rb
    ### \u8bbf\u95ee\u5806\u9876\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
    my_heap.zig
    // \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806","text":"

    \u7ed9\u5b9a\u5143\u7d20 val \uff0c\u6211\u4eec\u9996\u5148\u5c06\u5176\u6dfb\u52a0\u5230\u5806\u5e95\u3002\u6dfb\u52a0\u4e4b\u540e\uff0c\u7531\u4e8e val \u53ef\u80fd\u5927\u4e8e\u5806\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7684\u6210\u7acb\u6761\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u574f\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u590d\u4ece\u63d2\u5165\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u8fd9\u4e2a\u64cd\u4f5c\u88ab\u79f0\u4e3a\u5806\u5316\uff08heapify\uff09\u3002

    \u8003\u8651\u4ece\u5165\u5806\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u6267\u884c\u5806\u5316\u3002\u5982\u56fe 8-3 \u6240\u793a\uff0c\u6211\u4eec\u6bd4\u8f83\u63d2\u5165\u8282\u70b9\u4e0e\u5176\u7236\u8282\u70b9\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u8282\u70b9\u66f4\u5927\uff0c\u5219\u5c06\u5b83\u4eec\u4ea4\u6362\u3002\u7136\u540e\u7ee7\u7eed\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4ece\u5e95\u81f3\u9876\u4fee\u590d\u5806\u4e2d\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u76f4\u81f3\u8d8a\u8fc7\u6839\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

    <1><2><3><4><5><6><7><8><9>

    \u56fe 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u6b65\u9aa4

    \u8bbe\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \uff0c\u5219\u6811\u7684\u9ad8\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u5316\u64cd\u4f5c\u7684\u5faa\u73af\u8f6e\u6570\u6700\u591a\u4e3a \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n    # \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.append(val)\n    # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\n    while True:\n        # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p = self.parent(i)\n        # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p)\n        # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n
    my_heap.cpp
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.push_back(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap[i], maxHeap[p]);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u5165\u5806 */\nvoid Push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.Add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n    // \u6dfb\u52a0\u8282\u70b9\n    h.data = append(h.data, val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p := h.parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.append(val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = parent(i: i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u5165\u5806 */\npush(val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.#maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.#parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n  // \u6dfb\u52a0\u8282\u70b9\n  _maxHeap.add(val);\n  // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    int p = _parent(i);\n    // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, p);\n    // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u5165\u5806 */\nfn push(&mut self, val: i32) {\n    // \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u8282\u70b9 i \u5df2\u7ecf\u662f\u5806\u9876\u8282\u70b9\u4e86\uff0c\u7ed3\u675f\u5806\u5316\n        if i == 0 {\n            break;\n        }\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = Self::parent(i);\n        // \u5f53\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(maxHeap, i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u5165\u5806 */\nfun push(_val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(_val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        val p = parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
    my_heap.rb
    ### \u5143\u7d20\u5165\u5806 ###\ndef push(val)\n  # \u6dfb\u52a0\u8282\u70b9\n  @max_heap << val\n  # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  sift_up(size - 1)\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    p = parent(i)\n    # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, p)\n    # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p\n  end\nend\n
    my_heap.zig
    // \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n    // \u6dfb\u52a0\u8282\u70b9\n    try self.max_heap.?.append(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        var p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806","text":"

    \u5806\u9876\u5143\u7d20\u662f\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u5373\u5217\u8868\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u4eec\u76f4\u63a5\u4ece\u5217\u8868\u4e2d\u5220\u9664\u9996\u5143\u7d20\uff0c\u90a3\u4e48\u4e8c\u53c9\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u7d22\u5f15\u90fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u8fd9\u5c06\u4f7f\u5f97\u540e\u7eed\u4f7f\u7528\u5806\u5316\u8fdb\u884c\u4fee\u590d\u53d8\u5f97\u56f0\u96be\u3002\u4e3a\u4e86\u5c3d\u91cf\u51cf\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u53d8\u52a8\uff0c\u6211\u4eec\u91c7\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9aa4\u3002

    1. \u4ea4\u6362\u5806\u9876\u5143\u7d20\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff09\u3002
    2. \u4ea4\u6362\u5b8c\u6210\u540e\uff0c\u5c06\u5806\u5e95\u4ece\u5217\u8868\u4e2d\u5220\u9664\uff08\u6ce8\u610f\uff0c\u7531\u4e8e\u5df2\u7ecf\u4ea4\u6362\uff0c\u56e0\u6b64\u5b9e\u9645\u4e0a\u5220\u9664\u7684\u662f\u539f\u6765\u7684\u5806\u9876\u5143\u7d20\uff09\u3002
    3. \u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u6267\u884c\u5806\u5316\u3002

    \u5982\u56fe 8-4 \u6240\u793a\uff0c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u4e0e\u201c\u4ece\u5e95\u81f3\u9876\u5806\u5316\u201d\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u6839\u8282\u70b9\u7684\u503c\u4e0e\u5176\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u503c\u8fdb\u884c\u6bd4\u8f83\uff0c\u5c06\u6700\u5927\u7684\u5b50\u8282\u70b9\u4e0e\u6839\u8282\u70b9\u4ea4\u6362\u3002\u7136\u540e\u5faa\u73af\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

    <1><2><3><4><5><6><7><8><9><10>

    \u56fe 8-4 \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806\u6b65\u9aa4

    \u4e0e\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u9876\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n    # \u5224\u7a7a\u5904\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u4e3a\u7a7a\")\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u5220\u9664\u8282\u70b9\n    val = self.max_heap.pop()\n    # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma)\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n
    my_heap.cpp
    /* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u4e3a\u7a7a\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u5220\u9664\u8282\u70b9\n    maxHeap.pop_back();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.remove(size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u51fa\u5806 */\nint Pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u5904\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u5220\u9664\u8282\u70b9\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, max)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u5904\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u4e3a\u7a7a\")\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    let val = maxHeap.remove(at: size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u51fa\u5806 */\npop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.#maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n  // \u5224\u7a7a\u5904\u7406\n  if (isEmpty()) throw Exception('\u5806\u4e3a\u7a7a');\n  // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u5220\u9664\u8282\u70b9\n  int val = _maxHeap.removeLast();\n  // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, ma);\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u51fa\u5806 */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u5904\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    let val = self.max_heap.pop().unwrap();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u51fa\u5806 */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, max);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u51fa\u5806 */\nfun pop(): Int {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return _val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
    my_heap.rb
    ### \u5143\u7d20\u51fa\u5806 ###\ndef pop\n  # \u5224\u7a7a\u5904\u7406\n  raise IndexError, \"\u5806\u4e3a\u7a7a\" if is_empty?\n  # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u5220\u9664\u8282\u70b9\n  val = @max_heap.pop\n  # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  val\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, ma)\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n
    my_heap.zig
    // \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n    // \u5224\u65ad\u5904\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    var val = self.max_heap.?.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n} \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7684\u5e38\u89c1\u5e94\u7528","text":"
    • \u4f18\u5148\u961f\u5217\uff1a\u5806\u901a\u5e38\u4f5c\u4e3a\u5b9e\u73b0\u4f18\u5148\u961f\u5217\u7684\u9996\u9009\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \uff0c\u800c\u5efa\u5806\u64cd\u4f5c\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
    • \u5806\u6392\u5e8f\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u5b83\u4eec\u5efa\u7acb\u4e00\u4e2a\u5806\uff0c\u7136\u540e\u4e0d\u65ad\u5730\u6267\u884c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u6570\u636e\u3002\u7136\u800c\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u4f7f\u7528\u4e00\u79cd\u66f4\u4f18\u96c5\u7684\u65b9\u5f0f\u5b9e\u73b0\u5806\u6392\u5e8f\uff0c\u8be6\u89c1\u201c\u5806\u6392\u5e8f\u201d\u7ae0\u8282\u3002
    • \u83b7\u53d6\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff1a\u8fd9\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u7b97\u6cd5\u95ee\u9898\uff0c\u540c\u65f6\u4e5f\u662f\u4e00\u79cd\u5178\u578b\u5e94\u7528\uff0c\u4f8b\u5982\u9009\u62e9\u70ed\u5ea6\u524d 10 \u7684\u65b0\u95fb\u4f5c\u4e3a\u5fae\u535a\u70ed\u641c\uff0c\u9009\u53d6\u9500\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
    "},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u5806\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u6839\u636e\u6210\u7acb\u6761\u4ef6\u53ef\u5206\u4e3a\u5927\u9876\u5806\u548c\u5c0f\u9876\u5806\u3002\u5927\uff08\u5c0f\uff09\u9876\u5806\u7684\u5806\u9876\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
    • \u4f18\u5148\u961f\u5217\u7684\u5b9a\u4e49\u662f\u5177\u6709\u51fa\u961f\u4f18\u5148\u7ea7\u7684\u961f\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u6765\u5b9e\u73b0\u3002
    • \u5806\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806 \\(O(\\log n)\\)\u3001\u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) \u548c\u8bbf\u95ee\u5806\u9876\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
    • \u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u8868\u793a\uff0c\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002
    • \u5806\u5316\u64cd\u4f5c\u7528\u4e8e\u7ef4\u62a4\u5806\u7684\u6027\u8d28\uff0c\u5728\u5165\u5806\u548c\u51fa\u5806\u64cd\u4f5c\u4e2d\u90fd\u4f1a\u7528\u5230\u3002
    • \u8f93\u5165 \\(n\\) \u4e2a\u5143\u7d20\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
    • Top-k \u662f\u4e00\u4e2a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u6570\u636e\u7ed3\u6784\u9ad8\u6548\u89e3\u51b3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002
    "},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6570\u636e\u7ed3\u6784\u7684\u201c\u5806\u201d\u4e0e\u5185\u5b58\u7ba1\u7406\u7684\u201c\u5806\u201d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\u5417\uff1f

    \u4e24\u8005\u4e0d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u201d\u3002\u8ba1\u7b97\u673a\u7cfb\u7edf\u5185\u5b58\u4e2d\u7684\u5806\u662f\u52a8\u6001\u5185\u5b58\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5e8f\u5728\u8fd0\u884c\u65f6\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5b58\u50a8\u6570\u636e\u3002\u7a0b\u5e8f\u53ef\u4ee5\u8bf7\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u5185\u5b58\uff0c\u7528\u4e8e\u5b58\u50a8\u5982\u5bf9\u8c61\u548c\u6570\u7ec4\u7b49\u590d\u6742\u7ed3\u6784\u3002\u5f53\u8fd9\u4e9b\u6570\u636e\u4e0d\u518d\u9700\u8981\u65f6\uff0c\u7a0b\u5e8f\u9700\u8981\u91ca\u653e\u8fd9\u4e9b\u5185\u5b58\uff0c\u4ee5\u9632\u6b62\u5185\u5b58\u6cc4\u6f0f\u3002\u76f8\u8f83\u4e8e\u6808\u5185\u5b58\uff0c\u5806\u5185\u5b58\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8c28\u614e\uff0c\u4f7f\u7528\u4e0d\u5f53\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\u548c\u91ce\u6307\u9488\u7b49\u95ee\u9898\u3002

    "},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u65e0\u5e8f\u6570\u7ec4 nums \uff0c\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002

    \u5bf9\u4e8e\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u5148\u4ecb\u7ecd\u4e24\u79cd\u601d\u8def\u6bd4\u8f83\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7ecd\u6548\u7387\u66f4\u9ad8\u7684\u5806\u89e3\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u904d\u5386\u9009\u62e9","text":"

    \u6211\u4eec\u53ef\u4ee5\u8fdb\u884c\u56fe 8-6 \u6240\u793a\u7684 \\(k\\) \u8f6e\u904d\u5386\uff0c\u5206\u522b\u5728\u6bcf\u8f6e\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\) \u3002

    \u6b64\u65b9\u6cd5\u53ea\u9002\u7528\u4e8e \\(k \\ll n\\) \u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u5f53 \\(k\\) \u4e0e \\(n\\) \u6bd4\u8f83\u63a5\u8fd1\u65f6\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411\u4e8e \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u65f6\u3002

    \u56fe 8-6 \u00a0 \u904d\u5386\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

    Tip

    \u5f53 \\(k = n\\) \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u65f6\u7b49\u4ef7\u4e8e\u201c\u9009\u62e9\u6392\u5e8f\u201d\u7b97\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

    \u5982\u56fe 8-7 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u5bf9\u6570\u7ec4 nums \u8fdb\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u8fb9\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    \u663e\u7136\uff0c\u8be5\u65b9\u6cd5\u201c\u8d85\u989d\u201d\u5b8c\u6210\u4efb\u52a1\u4e86\uff0c\u56e0\u4e3a\u6211\u4eec\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

    \u56fe 8-7 \u00a0 \u6392\u5e8f\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

    "},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806","text":"

    \u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u5806\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u51b3 Top-k \u95ee\u9898\uff0c\u6d41\u7a0b\u5982\u56fe 8-8 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5176\u5806\u9876\u5143\u7d20\u6700\u5c0f\u3002
    2. \u5148\u5c06\u6570\u7ec4\u7684\u524d \\(k\\) \u4e2a\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u3002
    3. \u4ece\u7b2c \\(k + 1\\) \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\uff0c\u5e76\u5c06\u5f53\u524d\u5143\u7d20\u5165\u5806\u3002
    4. \u904d\u5386\u5b8c\u6210\u540e\uff0c\u5806\u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002
    <1><2><3><4><5><6><7><8><9>

    \u56fe 8-8 \u00a0 \u57fa\u4e8e\u5806\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
    def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    heap = []\n    # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in range(k, len(nums)):\n        # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
    top_k.cpp
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.java
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.cs
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    PriorityQueue<int, int> heap = new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.go
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
    top_k.swift
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5e76\u5c06\u524d k \u4e2a\u5143\u7d20\u5efa\u5806\n    var heap = Heap(nums.prefix(k))\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
    top_k.js
    /* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.ts
    /* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.dart
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9876\u5806\uff0c\u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
    top_k.rs
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9876\u5806\uff0c\u4f7f\u7528 Reverse \u5c06\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u5b9e\u73b0\u5c0f\u9876\u5806\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
    top_k.c
    /* \u5143\u7d20\u5165\u5806 */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\u7684\u51fd\u6570\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91ca\u653e\u5185\u5b58\n    delMaxHeap(maxHeap);\n    return res;\n}\n
    top_k.kt
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    val heap = PriorityQueue<Int>()\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (i in k..<nums.size) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
    top_k.rb
    ### \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n  # \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n  max_heap = MaxHeap.new([])\n\n  # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for i in k...nums.length\n    # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u603b\u5171\u6267\u884c\u4e86 \\(n\\) \u8f6e\u5165\u5806\u548c\u51fa\u5806\uff0c\u5806\u7684\u6700\u5927\u957f\u5ea6\u4e3a \\(k\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002\u8be5\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u5f53 \\(k\\) \u8f83\u5c0f\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \uff1b\u5f53 \\(k\\) \u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(O(n \\log n)\\) \u3002

    \u53e6\u5916\uff0c\u8be5\u65b9\u6cd5\u9002\u7528\u4e8e\u52a8\u6001\u6570\u636e\u6d41\u7684\u4f7f\u7528\u573a\u666f\u3002\u5728\u4e0d\u65ad\u52a0\u5165\u6570\u636e\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u6301\u7eed\u7ef4\u62a4\u5806\u5185\u7684\u5143\u7d20\uff0c\u4ece\u800c\u5b9e\u73b0\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u7684\u52a8\u6001\u66f4\u65b0\u3002

    "},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

    \u51e0\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u5251\u6307 Offer\u201d\u7cfb\u5217\u9898\u89e3\uff0c\u53d7\u5230\u4e86\u8bb8\u591a\u8bfb\u8005\u7684\u9f13\u52b1\u548c\u652f\u6301\u3002\u5728\u4e0e\u8bfb\u8005\u4ea4\u6d41\u671f\u95f4\uff0c\u6211\u6700\u5e38\u88ab\u95ee\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u201c\u5982\u4f55\u5165\u95e8\u7b97\u6cd5\u201d\u3002\u9010\u6e10\u5730\uff0c\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u4ea7\u751f\u4e86\u6d53\u539a\u7684\u5174\u8da3\u3002

    \u4e24\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u9898\u4f3c\u4e4e\u662f\u6700\u53d7\u6b22\u8fce\u7684\u65b9\u6cd5\uff0c\u7b80\u5355\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u9898\u5c31\u5982\u540c\u73a9\u201c\u626b\u96f7\u201d\u6e38\u620f\uff0c\u81ea\u5b66\u80fd\u529b\u5f3a\u7684\u4eba\u80fd\u591f\u987a\u5229\u5c06\u5730\u96f7\u9010\u4e2a\u6392\u6389\uff0c\u800c\u57fa\u7840\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6ee1\u5934\u662f\u5305\uff0c\u5e76\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7f29\u3002\u901a\u8bfb\u6559\u6750\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u505a\u6cd5\uff0c\u4f46\u5bf9\u4e8e\u9762\u5411\u6c42\u804c\u7684\u4eba\u6765\u8bf4\uff0c\u6bd5\u4e1a\u8bba\u6587\u3001\u6295\u9012\u7b80\u5386\u3001\u51c6\u5907\u7b14\u8bd5\u548c\u9762\u8bd5\u5df2\u7ecf\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u4e66\u5f80\u5f80\u53d8\u6210\u4e86\u4e00\u9879\u8270\u5de8\u7684\u6311\u6218\u3002

    \u5982\u679c\u4f60\u4e5f\u9762\u4e34\u7c7b\u4f3c\u7684\u56f0\u6270\uff0c\u90a3\u4e48\u5f88\u5e78\u8fd0\u8fd9\u672c\u4e66\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u4e66\u662f\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u7ed9\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u4f18\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u79ef\u6781\u7684\u5c1d\u8bd5\u3002\u672c\u4e66\u867d\u7136\u4e0d\u8db3\u4ee5\u8ba9\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u4f1a\u5f15\u5bfc\u4f60\u63a2\u7d22\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u201c\u77e5\u8bc6\u5730\u56fe\u201d\uff0c\u5e26\u4f60\u4e86\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72b6\u3001\u5927\u5c0f\u548c\u5206\u5e03\u4f4d\u7f6e\uff0c\u8ba9\u4f60\u638c\u63e1\u5404\u79cd\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u8fd9\u4e9b\u672c\u9886\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u9898\u548c\u9605\u8bfb\u6587\u732e\uff0c\u9010\u6b65\u6784\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8bc6\u4f53\u7cfb\u3002

    \u6211\u6df1\u6df1\u8d5e\u540c\u8d39\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u4ece\u8fd9\u4e2a\u610f\u4e49\u4e0a\u770b\uff0c\u8fd9\u672c\u4e66\u5e76\u975e\u5b8c\u5168\u201c\u514d\u8d39\u201d\u3002\u4e3a\u4e86\u4e0d\u8f9c\u8d1f\u4f60\u4e3a\u672c\u4e66\u6240\u4ed8\u51fa\u7684\u5b9d\u8d35\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u4f1a\u7aed\u5c3d\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u6765\u5b8c\u6210\u672c\u4e66\u7684\u521b\u4f5c\u3002

    \u672c\u4eba\u81ea\u77e5\u5b66\u758f\u624d\u6d45\uff0c\u4e66\u4e2d\u5185\u5bb9\u867d\u7136\u5df2\u7ecf\u8fc7\u4e00\u6bb5\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8bb8\u591a\u9519\u8bef\uff0c\u6073\u8bf7\u5404\u4f4d\u8001\u5e08\u548c\u540c\u5b66\u6279\u8bc4\u6307\u6b63\u3002

    Hello\uff0c\u7b97\u6cd5\uff01

    \u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u7ed9\u4e16\u754c\u5e26\u6765\u4e86\u5de8\u5927\u53d8\u9769\uff0c\u5b83\u51ed\u501f\u9ad8\u901f\u7684\u8ba1\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7f16\u7a0b\u6027\uff0c\u6210\u4e3a\u4e86\u6267\u884c\u7b97\u6cd5\u4e0e\u5904\u7406\u6570\u636e\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u65e0\u8bba\u662f\u7535\u5b50\u6e38\u620f\u7684\u903c\u771f\u753b\u9762\u3001\u81ea\u52a8\u9a7e\u9a76\u7684\u667a\u80fd\u51b3\u7b56\uff0c\u8fd8\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4ea4\u4e92\uff0c\u8fd9\u4e9b\u5e94\u7528\u90fd\u662f\u7b97\u6cd5\u5728\u8ba1\u7b97\u673a\u4e0a\u7684\u7cbe\u5999\u6f14\u7ece\u3002

    \u4e8b\u5b9e\u4e0a\uff0c\u5728\u8ba1\u7b97\u673a\u95ee\u4e16\u4e4b\u524d\uff0c\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u5c31\u5df2\u7ecf\u5b58\u5728\u4e8e\u4e16\u754c\u7684\u5404\u4e2a\u89d2\u843d\u3002\u65e9\u671f\u7684\u7b97\u6cd5\u76f8\u5bf9\u7b80\u5355\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8ba1\u6570\u65b9\u6cd5\u548c\u5de5\u5177\u5236\u4f5c\u6b65\u9aa4\u7b49\u3002\u968f\u7740\u6587\u660e\u7684\u8fdb\u6b65\uff0c\u7b97\u6cd5\u9010\u6e10\u53d8\u5f97\u66f4\u52a0\u7cbe\u7ec6\u548c\u590d\u6742\u3002\u4ece\u5de7\u593a\u5929\u5de5\u7684\u5320\u4eba\u6280\u827a\u3001\u5230\u89e3\u653e\u751f\u4ea7\u529b\u7684\u5de5\u4e1a\u4ea7\u54c1\u3001\u518d\u5230\u5b87\u5b99\u8fd0\u884c\u7684\u79d1\u5b66\u89c4\u5f8b\uff0c\u51e0\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u60ca\u53f9\u7684\u4e8b\u7269\u80cc\u540e\uff0c\u90fd\u9690\u85cf\u7740\u7cbe\u5999\u7684\u7b97\u6cd5\u601d\u60f3\u3002

    \u540c\u6837\uff0c\u6570\u636e\u7ed3\u6784\u65e0\u5904\u4e0d\u5728\uff1a\u5927\u5230\u793e\u4f1a\u7f51\u7edc\uff0c\u5c0f\u5230\u5730\u94c1\u7ebf\u8def\uff0c\u8bb8\u591a\u7cfb\u7edf\u90fd\u53ef\u4ee5\u5efa\u6a21\u4e3a\u201c\u56fe\u201d\uff1b\u5927\u5230\u4e00\u4e2a\u56fd\u5bb6\uff0c\u5c0f\u5230\u4e00\u4e2a\u5bb6\u5ead\uff0c\u793e\u4f1a\u7684\u4e3b\u8981\u7ec4\u7ec7\u5f62\u5f0f\u5448\u73b0\u51fa\u201c\u6811\u201d\u7684\u7279\u5f81\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u6808\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u540e\u624d\u80fd\u8131\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5219\u5982\u540c\u201c\u961f\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u4e2a\u201c\u54c8\u5e0c\u8868\u201d\uff0c\u80fd\u591f\u5feb\u901f\u67e5\u627e\u76ee\u6807\u8bcd\u6761\u3002

    \u672c\u4e66\u65e8\u5728\u901a\u8fc7\u6e05\u6670\u6613\u61c2\u7684\u52a8\u753b\u56fe\u89e3\u548c\u53ef\u8fd0\u884c\u7684\u4ee3\u7801\u793a\u4f8b\uff0c\u4f7f\u8bfb\u8005\u7406\u89e3\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u5e76\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u6765\u5b9e\u73b0\u5b83\u4eec\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u672c\u4e66\u81f4\u529b\u4e8e\u63ed\u793a\u7b97\u6cd5\u5728\u590d\u6742\u4e16\u754c\u4e2d\u7684\u751f\u52a8\u4f53\u73b0\uff0c\u5c55\u73b0\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

    "},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8bc6\u7b97\u6cd5","text":"

    Abstract

    \u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u4e0e\u6570\u636e\u4ea4\u7ec7\u5728\u4e00\u8d77\uff0c\u88d9\u6446\u4e0a\u98d8\u626c\u7740\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

    \u5979\u9080\u8bf7\u4f60\u5171\u821e\uff0c\u8bf7\u7d27\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6ee1\u903b\u8f91\u4e0e\u7f8e\u611f\u7684\u7b97\u6cd5\u4e16\u754c\u3002

    "},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728
    • 1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48
    • 1.3 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728","text":"

    \u5f53\u6211\u4eec\u542c\u5230\u201c\u7b97\u6cd5\u201d\u8fd9\u4e2a\u8bcd\u65f6\uff0c\u5f88\u81ea\u7136\u5730\u4f1a\u60f3\u5230\u6570\u5b66\u3002\u7136\u800c\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7b97\u6cd5\u5e76\u4e0d\u6d89\u53ca\u590d\u6742\u6570\u5b66\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8d56\u57fa\u672c\u903b\u8f91\uff0c\u8fd9\u4e9b\u903b\u8f91\u5728\u6211\u4eec\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u5904\u5904\u53ef\u89c1\u3002

    \u5728\u6b63\u5f0f\u63a2\u8ba8\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u4e2a\u6709\u8da3\u7684\u4e8b\u5b9e\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u5e76\u4e60\u60ef\u5c06\u5b83\u4eec\u5e94\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c06\u4e3e\u51e0\u4e2a\u5177\u4f53\u7684\u4f8b\u5b50\u6765\u8bc1\u5b9e\u8fd9\u4e00\u70b9\u3002

    \u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u91cc\uff0c\u6bcf\u4e2a\u6c49\u5b57\u90fd\u5bf9\u5e94\u4e00\u4e2a\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\u7684\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2a\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u4f1a\u6309\u7167\u56fe 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5b9e\u73b0\u3002

    1. \u7ffb\u5f00\u5b57\u5178\u7ea6\u4e00\u534a\u7684\u9875\u6570\uff0c\u67e5\u770b\u8be5\u9875\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u4e48\uff0c\u5047\u8bbe\u9996\u5b57\u6bcd\u4e3a \\(m\\) \u3002
    2. \u7531\u4e8e\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u4e8e \\(m\\) \u4e4b\u540e\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u627e\u8303\u56f4\u7f29\u5c0f\u5230\u540e\u534a\u90e8\u5206\u3002
    3. \u4e0d\u65ad\u91cd\u590d\u6b65\u9aa4 1. \u548c \u6b65\u9aa4 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u9875\u7801\u4e3a\u6b62\u3002
    <1><2><3><4><5>

    \u56fe 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9aa4

    \u67e5\u5b57\u5178\u8fd9\u4e2a\u5c0f\u5b66\u751f\u5fc5\u5907\u6280\u80fd\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u7b97\u6cd5\u3002\u4ece\u6570\u636e\u7ed3\u6784\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b57\u5178\u89c6\u4e3a\u4e00\u4e2a\u5df2\u6392\u5e8f\u7684\u201c\u6570\u7ec4\u201d\uff1b\u4ece\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u67e5\u627e\u201d\u3002

    \u4f8b\u4e8c\uff1a\u6574\u7406\u6251\u514b\u3002\u6211\u4eec\u5728\u6253\u724c\u65f6\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u6251\u514b\u724c\uff0c\u4f7f\u5176\u4ece\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5b9e\u73b0\u6d41\u7a0b\u5982\u56fe 1-2 \u6240\u793a\u3002

    1. \u5c06\u6251\u514b\u724c\u5212\u5206\u4e3a\u201c\u6709\u5e8f\u201d\u548c\u201c\u65e0\u5e8f\u201d\u4e24\u90e8\u5206\uff0c\u5e76\u5047\u8bbe\u521d\u59cb\u72b6\u6001\u4e0b\u6700\u5de6 1 \u5f20\u6251\u514b\u724c\u5df2\u7ecf\u6709\u5e8f\u3002
    2. \u5728\u65e0\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f20\u6251\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\uff1b\u5b8c\u6210\u540e\u6700\u5de6 2 \u5f20\u6251\u514b\u5df2\u7ecf\u6709\u5e8f\u3002
    3. \u4e0d\u65ad\u5faa\u73af\u6b65\u9aa4 2. \uff0c\u6bcf\u4e00\u8f6e\u5c06\u4e00\u5f20\u6251\u514b\u724c\u4ece\u65e0\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u6251\u514b\u724c\u90fd\u6709\u5e8f\u3002

    \u56fe 1-2 \u00a0 \u6251\u514b\u6392\u5e8f\u6b65\u9aa4

    \u4e0a\u8ff0\u6574\u7406\u6251\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u7b97\u6cd5\uff0c\u5b83\u5728\u5904\u7406\u5c0f\u578b\u6570\u636e\u96c6\u65f6\u975e\u5e38\u9ad8\u6548\u3002\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u7684\u6392\u5e8f\u5e93\u51fd\u6570\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

    \u4f8b\u4e09\uff1a\u8d27\u5e01\u627e\u96f6\u3002\u5047\u8bbe\u6211\u4eec\u5728\u8d85\u5e02\u8d2d\u4e70\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7ed9\u4e86\u6536\u94f6\u5458 \\(100\\) \u5143\uff0c\u5219\u6536\u94f6\u5458\u9700\u8981\u627e\u6211\u4eec \\(31\\) \u5143\u3002\u4ed6\u4f1a\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u56fe 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

    1. \u53ef\u9009\u9879\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8d27\u5e01\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
    2. \u4ece\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u4f59 \\(31 - 20 = 11\\) \u5143\u3002
    3. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u4f59 \\(11 - 10 = 1\\) \u5143\u3002
    4. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u4f59 \\(1 - 1 = 0\\) \u5143\u3002
    5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u4e3a \\(20 + 10 + 1 = 31\\) \u5143\u3002

    \u56fe 1-3 \u00a0 \u8d27\u5e01\u627e\u96f6\u8fc7\u7a0b

    \u5728\u4ee5\u4e0a\u6b65\u9aa4\u4e2d\uff0c\u6211\u4eec\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\uff08\u5c3d\u53ef\u80fd\u7528\u5927\u9762\u989d\u7684\u8d27\u5e01\uff09\uff0c\u6700\u7ec8\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u8d2a\u5fc3\u201d\u7b97\u6cd5\u3002

    \u5c0f\u5230\u70f9\u996a\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u9645\u822a\u884c\uff0c\u51e0\u4e4e\u6240\u6709\u95ee\u9898\u7684\u89e3\u51b3\u90fd\u79bb\u4e0d\u5f00\u7b97\u6cd5\u3002\u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u4f7f\u5f97\u6211\u4eec\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u5c06\u6570\u636e\u7ed3\u6784\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\uff0c\u540c\u65f6\u7f16\u5199\u4ee3\u7801\u8c03\u7528 CPU \u548c GPU \u6267\u884c\u7b97\u6cd5\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u95ee\u9898\u8f6c\u79fb\u5230\u8ba1\u7b97\u673a\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u51b3\u5404\u79cd\u590d\u6742\u95ee\u9898\u3002

    Tip

    \u5982\u679c\u4f60\u5bf9\u6570\u636e\u7ed3\u6784\u3001\u7b97\u6cd5\u3001\u6570\u7ec4\u548c\u4e8c\u5206\u67e5\u627e\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8bf7\u7ee7\u7eed\u5f80\u4e0b\u9605\u8bfb\uff0c\u672c\u4e66\u5c06\u5f15\u5bfc\u4f60\u8fc8\u5165\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u77e5\u8bc6\u6bbf\u5802\u3002

    "},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7ed3","text":"
    • \u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u65e0\u5904\u4e0d\u5728\uff0c\u5e76\u4e0d\u662f\u9065\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8bc6\u3002\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u51b3\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u95ee\u9898\u3002
    • \u67e5\u5b57\u5178\u7684\u539f\u7406\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u4f53\u73b0\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u7b97\u6cd5\u601d\u60f3\u3002
    • \u6574\u7406\u6251\u514b\u7684\u8fc7\u7a0b\u4e0e\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u975e\u5e38\u7c7b\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u9002\u5408\u6392\u5e8f\u5c0f\u578b\u6570\u636e\u96c6\u3002
    • \u8d27\u5e01\u627e\u96f6\u7684\u6b65\u9aa4\u672c\u8d28\u4e0a\u662f\u8d2a\u5fc3\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\u3002
    • \u7b97\u6cd5\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u800c\u6570\u636e\u7ed3\u6784\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002
    • \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7d27\u5bc6\u76f8\u8fde\u3002\u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002
    • \u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728\uff0c\u79ef\u6728\u4ee3\u8868\u6570\u636e\uff0c\u79ef\u6728\u7684\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u7b49\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u62fc\u88c5\u79ef\u6728\u7684\u6b65\u9aa4\u5219\u5bf9\u5e94\u7b97\u6cd5\u3002
    "},{"location":"chapter_introduction/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

    Q\uff1a\u4f5c\u4e3a\u4e00\u540d\u7a0b\u5e8f\u5458\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u4ece\u672a\u7528\u7b97\u6cd5\u89e3\u51b3\u8fc7\u95ee\u9898\uff0c\u5e38\u7528\u7b97\u6cd5\u90fd\u88ab\u7f16\u7a0b\u8bed\u8a00\u5c01\u88c5\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u8fd9\u662f\u5426\u610f\u5473\u7740\u6211\u4eec\u5de5\u4f5c\u4e2d\u7684\u95ee\u9898\u8fd8\u6ca1\u6709\u5230\u8fbe\u9700\u8981\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

    \u5982\u679c\u628a\u5177\u4f53\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8bdd\uff0c\u90a3\u4e48\u57fa\u7840\u79d1\u76ee\u5e94\u8be5\u66f4\u50cf\u662f\u201c\u5185\u529f\u201d\u3002

    \u6211\u8ba4\u4e3a\u5b66\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u7840\u79d1\u76ee\uff09\u7684\u610f\u4e49\u4e0d\u662f\u5728\u4e8e\u5728\u5de5\u4f5c\u4e2d\u4ece\u96f6\u5b9e\u73b0\u5b83\uff0c\u800c\u662f\u57fa\u4e8e\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5728\u89e3\u51b3\u95ee\u9898\u65f6\u80fd\u591f\u4f5c\u51fa\u4e13\u4e1a\u7684\u53cd\u5e94\u548c\u5224\u65ad\uff0c\u4ece\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u4f53\u8d28\u91cf\u3002\u4e3e\u4e00\u4e2a\u7b80\u5355\u4f8b\u5b50\uff0c\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u5185\u7f6e\u4e86\u6392\u5e8f\u51fd\u6570\uff1a

    • \u5982\u679c\u6211\u4eec\u6ca1\u6709\u5b66\u8fc7\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff0c\u90a3\u4e48\u7ed9\u5b9a\u4efb\u4f55\u6570\u636e\uff0c\u6211\u4eec\u53ef\u80fd\u90fd\u585e\u7ed9\u8fd9\u4e2a\u6392\u5e8f\u51fd\u6570\u53bb\u505a\u4e86\u3002\u8fd0\u884c\u987a\u7545\u3001\u6027\u80fd\u4e0d\u9519\uff0c\u770b\u4e0a\u53bb\u5e76\u6ca1\u6709\u4ec0\u4e48\u95ee\u9898\u3002
    • \u4f46\u5982\u679c\u5b66\u8fc7\u7b97\u6cd5\uff0c\u6211\u4eec\u5c31\u4f1a\u77e5\u9053\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7ed9\u5b9a\u7684\u6570\u636e\u662f\u56fa\u5b9a\u4f4d\u6570\u7684\u6574\u6570\uff08\u4f8b\u5982\u5b66\u53f7\uff09\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6570\u6392\u5e8f\u201d\u6765\u505a\uff0c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u4e3a \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u4e3a\u4f4d\u6570\u3002\u5f53\u6570\u636e\u4f53\u91cf\u5f88\u5927\u65f6\uff0c\u8282\u7701\u51fa\u6765\u7684\u8fd0\u884c\u65f6\u95f4\u5c31\u80fd\u521b\u9020\u8f83\u5927\u4ef7\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u4f53\u9a8c\u53d8\u597d\u7b49\uff09\u3002

    \u5728\u5de5\u7a0b\u9886\u57df\u4e2d\uff0c\u5927\u91cf\u95ee\u9898\u662f\u96be\u4ee5\u8fbe\u5230\u6700\u4f18\u89e3\u7684\uff0c\u8bb8\u591a\u95ee\u9898\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u51b3\u4e86\u3002\u95ee\u9898\u7684\u96be\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u51b3\u4e8e\u95ee\u9898\u672c\u8eab\u7684\u6027\u8d28\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u51b3\u4e8e\u89c2\u6d4b\u95ee\u9898\u7684\u4eba\u7684\u77e5\u8bc6\u50a8\u5907\u3002\u4eba\u7684\u77e5\u8bc6\u8d8a\u5b8c\u5907\u3001\u7ecf\u9a8c\u8d8a\u591a\uff0c\u5206\u6790\u95ee\u9898\u5c31\u4f1a\u8d8a\u6df1\u5165\uff0c\u95ee\u9898\u5c31\u80fd\u88ab\u89e3\u51b3\u5f97\u66f4\u4f18\u96c5\u3002

    "},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u7b97\u6cd5\u5b9a\u4e49","text":"

    \u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u95ee\u9898\u662f\u660e\u786e\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f93\u5165\u548c\u8f93\u51fa\u5b9a\u4e49\u3002
    • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u591f\u5728\u6709\u9650\u6b65\u9aa4\u3001\u65f6\u95f4\u548c\u5185\u5b58\u7a7a\u95f4\u4e0b\u5b8c\u6210\u3002
    • \u5404\u6b65\u9aa4\u90fd\u6709\u786e\u5b9a\u7684\u542b\u4e49\uff0c\u5728\u76f8\u540c\u7684\u8f93\u5165\u548c\u8fd0\u884c\u6761\u4ef6\u4e0b\uff0c\u8f93\u51fa\u59cb\u7ec8\u76f8\u540c\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u6570\u636e\u7ed3\u6784\u5b9a\u4e49","text":"

    \u6570\u636e\u7ed3\u6784\uff08data structure\uff09\u662f\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\uff0c\u6db5\u76d6\u6570\u636e\u5185\u5bb9\u3001\u6570\u636e\u4e4b\u95f4\u5173\u7cfb\u548c\u6570\u636e\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u8bbe\u8ba1\u76ee\u6807\u3002

    • \u7a7a\u95f4\u5360\u7528\u5c3d\u91cf\u5c11\uff0c\u4ee5\u8282\u7701\u8ba1\u7b97\u673a\u5185\u5b58\u3002
    • \u6570\u636e\u64cd\u4f5c\u5c3d\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u76d6\u6570\u636e\u8bbf\u95ee\u3001\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66f4\u65b0\u7b49\u3002
    • \u63d0\u4f9b\u7b80\u6d01\u7684\u6570\u636e\u8868\u793a\u548c\u903b\u8f91\u4fe1\u606f\uff0c\u4ee5\u4fbf\u7b97\u6cd5\u9ad8\u6548\u8fd0\u884c\u3002

    \u6570\u636e\u7ed3\u6784\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5145\u6ee1\u6743\u8861\u7684\u8fc7\u7a0b\u3002\u5982\u679c\u60f3\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u63d0\u5347\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u534f\u3002\u4e0b\u9762\u4e3e\u4e24\u4e2a\u4f8b\u5b50\u3002

    • \u94fe\u8868\u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5728\u6570\u636e\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u727a\u7272\u4e86\u6570\u636e\u8bbf\u95ee\u901f\u5ea6\u3002
    • \u56fe\u76f8\u8f83\u4e8e\u94fe\u8868\uff0c\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u903b\u8f91\u4fe1\u606f\uff0c\u4f46\u9700\u8981\u5360\u7528\u66f4\u5927\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb","text":"

    \u5982\u56fe 1-4 \u6240\u793a\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u5173\u3001\u7d27\u5bc6\u7ed3\u5408\uff0c\u5177\u4f53\u8868\u73b0\u5728\u4ee5\u4e0b\u4e09\u4e2a\u65b9\u9762\u3002

    • \u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u6570\u636e\u7ed3\u6784\u4e3a\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7ed3\u6784\u5316\u5b58\u50a8\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u64cd\u4f5c\u6570\u636e\u7684\u65b9\u6cd5\u3002
    • \u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002\u6570\u636e\u7ed3\u6784\u672c\u8eab\u4ec5\u5b58\u50a8\u6570\u636e\u4fe1\u606f\uff0c\u7ed3\u5408\u7b97\u6cd5\u624d\u80fd\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u3002
    • \u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u4e8e\u4e0d\u540c\u7684\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u4f46\u6267\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9009\u62e9\u5408\u9002\u7684\u6570\u636e\u7ed3\u6784\u662f\u5173\u952e\u3002

    \u56fe 1-4 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb

    \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u72b9\u5982\u56fe 1-5 \u6240\u793a\u7684\u62fc\u88c5\u79ef\u6728\u3002\u4e00\u5957\u79ef\u6728\uff0c\u9664\u4e86\u5305\u542b\u8bb8\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u8fd8\u9644\u6709\u8be6\u7ec6\u7684\u7ec4\u88c5\u8bf4\u660e\u4e66\u3002\u6211\u4eec\u6309\u7167\u8bf4\u660e\u4e66\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7ec4\u88c5\u51fa\u7cbe\u7f8e\u7684\u79ef\u6728\u6a21\u578b\u3002

    \u56fe 1-5 \u00a0 \u62fc\u88c5\u79ef\u6728

    \u4e24\u8005\u7684\u8be6\u7ec6\u5bf9\u5e94\u5173\u7cfb\u5982\u8868 1-1 \u6240\u793a\u3002

    \u8868 1-1 \u00a0 \u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728

    \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 \u62fc\u88c5\u79ef\u6728 \u8f93\u5165\u6570\u636e \u672a\u62fc\u88c5\u7684\u79ef\u6728 \u6570\u636e\u7ed3\u6784 \u79ef\u6728\u7ec4\u7ec7\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72b6\u3001\u5927\u5c0f\u3001\u8fde\u63a5\u65b9\u5f0f\u7b49 \u7b97\u6cd5 \u628a\u79ef\u6728\u62fc\u6210\u76ee\u6807\u5f62\u6001\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9aa4 \u8f93\u51fa\u6570\u636e \u79ef\u6728\u6a21\u578b

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u662f\u72ec\u7acb\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u4e66\u5f97\u4ee5\u63d0\u4f9b\u57fa\u4e8e\u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u7684\u5b9e\u73b0\u3002

    \u7ea6\u5b9a\u4fd7\u6210\u7684\u7b80\u79f0

    \u5728\u5b9e\u9645\u8ba8\u8bba\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u201c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u201d\u7b80\u79f0\u4e3a\u201c\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u4f17\u6240\u5468\u77e5\u7684 LeetCode \u7b97\u6cd5\u9898\u76ee\uff0c\u5b9e\u9645\u4e0a\u540c\u65f6\u8003\u67e5\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e24\u65b9\u9762\u7684\u77e5\u8bc6\u3002

    "},{"location":"chapter_paperbook/","title":"\u7eb8\u8d28\u4e66","text":"

    \u7ecf\u8fc7\u957f\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u300aHello \u7b97\u6cd5\u300b\u7eb8\u8d28\u4e66\u7ec8\u4e8e\u53d1\u5e03\u4e86\uff01\u6b64\u65f6\u7684\u5fc3\u60c5\u53ef\u4ee5\u7528\u4e00\u53e5\u8bd7\u6765\u5f62\u5bb9\uff1a

    \u8ffd\u98ce\u8d76\u6708\u83ab\u505c\u7559\uff0c\u5e73\u829c\u5c3d\u5904\u662f\u6625\u5c71\u3002

    \u4ee5\u4e0b\u89c6\u9891\u5c55\u793a\u4e86\u7eb8\u8d28\u4e66\uff0c\u5e76\u4e14\u5305\u542b\u6211\u7684\u4e00\u4e9b\u601d\u8003\uff1a

    • \u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u6027\u3002
    • \u4e3a\u4ec0\u4e48\u5728\u7eb8\u8d28\u4e66\u4e2d\u9009\u62e9 Python\u3002
    • \u5bf9\u77e5\u8bc6\u5206\u4eab\u7684\u7406\u89e3\u3002

    \u65b0\u4eba UP \u4e3b\uff0c\u8bf7\u591a\u591a\u5173\u7167\u3001\u4e00\u952e\u4e09\u8fde\uff5e\u8c22\u8c22\uff01

    \u9644\u7eb8\u8d28\u4e66\u5feb\u7167\uff1a

    "},{"location":"chapter_paperbook/#_2","title":"\u4f18\u52bf\u4e0e\u4e0d\u8db3","text":"

    \u603b\u7ed3\u4e00\u4e0b\u7eb8\u8d28\u4e66\u53ef\u80fd\u4f1a\u7ed9\u5927\u5bb6\u5e26\u6765\u60ca\u559c\u7684\u5730\u65b9\uff1a

    • \u91c7\u7528\u5168\u5f69\u5370\u5237\uff0c\u80fd\u591f\u539f\u6c41\u539f\u5473\u5730\u53d1\u6325\u51fa\u672c\u4e66\u201c\u52a8\u753b\u56fe\u89e3\u201d\u7684\u4f18\u52bf\u3002
    • \u8003\u7a76\u7eb8\u5f20\u6750\u8d28\uff0c\u65e2\u4fdd\u8bc1\u8272\u5f69\u9ad8\u5ea6\u8fd8\u539f\uff0c\u4e5f\u4fdd\u7559\u7eb8\u8d28\u4e66\u7279\u6709\u7684\u8d28\u611f\u3002
    • \u7eb8\u8d28\u7248\u6bd4\u7f51\u9875\u7248\u7684\u683c\u5f0f\u66f4\u52a0\u89c4\u8303\uff0c\u4f8b\u5982\u56fe\u4e2d\u7684\u516c\u5f0f\u4f7f\u7528\u659c\u4f53\u3002
    • \u5728\u4e0d\u63d0\u5347\u5b9a\u4ef7\u7684\u524d\u63d0\u4e0b\uff0c\u9644\u8d60\u601d\u7ef4\u5bfc\u56fe\u6298\u9875\u3001\u4e66\u7b7e\u3002
    • \u7eb8\u8d28\u4e66\u3001\u7f51\u9875\u7248\u3001PDF \u7248\u5185\u5bb9\u540c\u6b65\uff0c\u968f\u610f\u5207\u6362\u9605\u8bfb\u3002

    Tip

    \u7531\u4e8e\u7eb8\u8d28\u4e66\u548c\u7f51\u9875\u7248\u7684\u540c\u6b65\u96be\u5ea6\u8f83\u5927\uff0c\u56e0\u6b64\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u7ec6\u8282\u4e0a\u7684\u4e0d\u540c\uff0c\u8bf7\u60a8\u89c1\u8c05\uff01

    \u5f53\u7136\uff0c\u7eb8\u8d28\u4e66\u4e5f\u6709\u4e00\u4e9b\u503c\u5f97\u5927\u5bb6\u5165\u624b\u524d\u8003\u8651\u7684\u5730\u65b9\uff1a

    • \u4f7f\u7528 Python \u8bed\u8a00\uff0c\u53ef\u80fd\u4e0d\u5339\u914d\u4f60\u7684\u4e3b\u8bed\u8a00\uff08\u53ef\u4ee5\u628a Python \u770b\u4f5c\u4f2a\u4ee3\u7801\uff0c\u91cd\u5728\u7406\u89e3\u601d\u8def\uff09\u3002
    • \u5168\u5f69\u5370\u5237\u867d\u7136\u5927\u5e45\u63d0\u5347\u4e86\u56fe\u89e3\u548c\u4ee3\u7801\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u4f46\u4ef7\u683c\u4f1a\u6bd4\u9ed1\u767d\u5370\u5237\u9ad8\u4e00\u4e9b\u3002

    Tip

    \u201c\u5370\u5237\u8d28\u91cf\u201d\u548c\u201c\u4ef7\u683c\u201d\u5c31\u50cf\u7b97\u6cd5\u4e2d\u7684\u201c\u65f6\u95f4\u6548\u7387\u201d\u548c\u201c\u7a7a\u95f4\u6548\u7387\u201d\uff0c\u96be\u4ee5\u4e24\u5168\u3002\u800c\u6211\u8ba4\u4e3a\uff0c\u201c\u5370\u5237\u8d28\u91cf\u201d\u5bf9\u5e94\u7684\u662f\u201c\u65f6\u95f4\u6548\u7387\u201d\uff0c\u66f4\u5e94\u8be5\u88ab\u6ce8\u91cd\u3002

    "},{"location":"chapter_paperbook/#_3","title":"\u8d2d\u4e70\u94fe\u63a5","text":"

    \u5982\u679c\u4f60\u5bf9\u7eb8\u8d28\u4e66\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u8003\u8651\u5165\u624b\u4e00\u672c\u3002\u6211\u4eec\u4e3a\u5927\u5bb6\u4e89\u53d6\u5230\u4e86\u65b0\u4e66 5 \u6298\u4f18\u60e0\uff0c\u8bf7\u89c1\u6b64\u94fe\u63a5\u6216\u626b\u63cf\u4ee5\u4e0b\u4e8c\u7ef4\u7801\uff1a

    "},{"location":"chapter_paperbook/#_4","title":"\u5c3e\u8bb0","text":"

    \u8d77\u521d\uff0c\u6211\u4f4e\u4f30\u4e86\u7eb8\u8d28\u4e66\u51fa\u7248\u7684\u5de5\u4f5c\u91cf\uff0c\u4ee5\u4e3a\u53ea\u8981\u7ef4\u62a4\u597d\u4e86\u5f00\u6e90\u9879\u76ee\uff0c\u7eb8\u8d28\u7248\u5c31\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e9b\u81ea\u52a8\u5316\u624b\u6bb5\u751f\u6210\u51fa\u6765\u3002\u5b9e\u8df5\u8bc1\u660e\uff0c\u7eb8\u8d28\u4e66\u7684\u751f\u4ea7\u6d41\u7a0b\u4e0e\u5f00\u6e90\u9879\u76ee\u7684\u66f4\u65b0\u673a\u5236\u5b58\u5728\u5f88\u5927\u7684\u4e0d\u540c\uff0c\u4e24\u8005\u4e4b\u95f4\u7684\u8f6c\u5316\u9700\u8981\u505a\u8bb8\u591a\u989d\u5916\u5de5\u4f5c\u3002

    \u4e00\u672c\u4e66\u7684\u521d\u7a3f\u4e0e\u8fbe\u5230\u51fa\u7248\u6807\u51c6\u7684\u5b9a\u7a3f\u4e4b\u95f4\u4ecd\u6709\u8f83\u957f\u8ddd\u79bb\uff0c\u9700\u8981\u51fa\u7248\u793e\uff08\u7b56\u5212\u3001\u7f16\u8f91\u3001\u8bbe\u8ba1\u3001\u5e02\u573a\u7b49\uff09\u4e0e\u4f5c\u8005\u7684\u901a\u529b\u5408\u4f5c\u3001\u957f\u671f\u96d5\u7422\u3002\u5728\u6b64\u611f\u8c22\u56fe\u7075\u7b56\u5212\u7f16\u8f91\u738b\u519b\u82b1\u3001\u4ee5\u53ca\u4eba\u6c11\u90ae\u7535\u51fa\u7248\u793e\u548c\u56fe\u7075\u793e\u533a\u6bcf\u4f4d\u53c2\u4e0e\u672c\u4e66\u51fa\u7248\u6d41\u7a0b\u7684\u5de5\u4f5c\u4eba\u5458\uff01

    \u5e0c\u671b\u8fd9\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

    "},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

    Abstract

    \u7b97\u6cd5\u72b9\u5982\u7f8e\u5999\u7684\u4ea4\u54cd\u4e50\uff0c\u6bcf\u4e00\u884c\u4ee3\u7801\u90fd\u50cf\u97f5\u5f8b\u822c\u6d41\u6dcc\u3002

    \u613f\u8fd9\u672c\u4e66\u5728\u4f60\u7684\u8111\u6d77\u4e2d\u8f7b\u8f7b\u54cd\u8d77\uff0c\u7559\u4e0b\u72ec\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

    "},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 0.1 \u00a0 \u5173\u4e8e\u672c\u4e66
    • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66
    • 0.3 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u5173\u4e8e\u672c\u4e66","text":"

    \u672c\u9879\u76ee\u65e8\u5728\u521b\u5efa\u4e00\u672c\u5f00\u6e90\u3001\u514d\u8d39\u3001\u5bf9\u65b0\u624b\u53cb\u597d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5165\u95e8\u6559\u7a0b\u3002

    • \u5168\u4e66\u91c7\u7528\u52a8\u753b\u56fe\u89e3\uff0c\u7ed3\u6784\u5316\u5730\u8bb2\u89e3\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u5185\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\u3002
    • \u7b97\u6cd5\u6e90\u4ee3\u7801\u7686\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8bed\u8a00\u3002
    • \u9f13\u52b1\u8bfb\u8005\u5728\u7ebf\u4e0a\u7ae0\u8282\u8bc4\u8bba\u533a\u4e92\u5e2e\u4e92\u52a9\u3001\u5171\u540c\u8fdb\u6b65\uff0c\u63d0\u95ee\u4e0e\u8bc4\u8bba\u901a\u5e38\u53ef\u5728\u4e24\u65e5\u5185\u5f97\u5230\u56de\u590d\u3002
    "},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8bfb\u8005\u5bf9\u8c61","text":"

    \u82e5\u4f60\u662f\u7b97\u6cd5\u521d\u5b66\u8005\uff0c\u4ece\u672a\u63a5\u89e6\u8fc7\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7ecf\u6709\u4e00\u4e9b\u5237\u9898\u7ecf\u9a8c\uff0c\u5bf9\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8ba4\u8bc6\uff0c\u5728\u4f1a\u4e0e\u4e0d\u4f1a\u4e4b\u95f4\u53cd\u590d\u6a2a\u8df3\uff0c\u90a3\u4e48\u672c\u4e66\u6b63\u662f\u4e3a\u4f60\u91cf\u8eab\u5b9a\u5236\u7684\uff01

    \u5982\u679c\u4f60\u5df2\u7ecf\u79ef\u7d2f\u4e00\u5b9a\u7684\u5237\u9898\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u9898\u578b\uff0c\u90a3\u4e48\u672c\u4e66\u53ef\u52a9\u4f60\u56de\u987e\u4e0e\u68b3\u7406\u7b97\u6cd5\u77e5\u8bc6\u4f53\u7cfb\uff0c\u4ed3\u5e93\u6e90\u4ee3\u7801\u53ef\u4ee5\u5f53\u4f5c\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u6216\u201c\u7b97\u6cd5\u5b57\u5178\u201d\u6765\u4f7f\u7528\u3002

    \u82e5\u4f60\u662f\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u4eec\u671f\u5f85\u6536\u5230\u4f60\u7684\u5b9d\u8d35\u5efa\u8bae\uff0c\u6216\u8005\u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c\u3002

    \u524d\u7f6e\u6761\u4ef6

    \u4f60\u9700\u8981\u81f3\u5c11\u5177\u5907\u4efb\u4e00\u8bed\u8a00\u7684\u7f16\u7a0b\u57fa\u7840\uff0c\u80fd\u591f\u9605\u8bfb\u548c\u7f16\u5199\u7b80\u5355\u4ee3\u7801\u3002

    "},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5185\u5bb9\u7ed3\u6784","text":"

    \u672c\u4e66\u7684\u4e3b\u8981\u5185\u5bb9\u5982\u56fe 0-1 \u6240\u793a\u3002

    • \u590d\u6742\u5ea6\u5206\u6790\uff1a\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u7684\u8bc4\u4ef7\u7ef4\u5ea6\u4e0e\u65b9\u6cd5\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u793a\u4f8b\u7b49\u3002
    • \u6570\u636e\u7ed3\u6784\uff1a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u6570\u636e\u7ed3\u6784\u7684\u5206\u7c7b\u65b9\u6cd5\u3002\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u5178\u578b\u5e94\u7528\u3001\u5b9e\u73b0\u65b9\u6cd5\u7b49\u3002
    • \u7b97\u6cd5\uff1a\u641c\u7d22\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u6548\u7387\u3001\u5e94\u7528\u573a\u666f\u3001\u89e3\u9898\u6b65\u9aa4\u548c\u793a\u4f8b\u95ee\u9898\u7b49\u3002

    \u56fe 0-1 \u00a0 \u672c\u4e66\u4e3b\u8981\u5185\u5bb9

    "},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8c22","text":"

    \u672c\u4e66\u5728\u5f00\u6e90\u793e\u533a\u4f17\u591a\u8d21\u732e\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65ad\u5b8c\u5584\u3002\u611f\u8c22\u6bcf\u4e00\u4f4d\u6295\u5165\u65f6\u95f4\u4e0e\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u4eec\u662f\uff08\u6309\u7167 GitHub \u81ea\u52a8\u751f\u6210\u7684\u987a\u5e8f\uff09\uff1akrahets\u3001Gonglja\u3001nuomi1\u3001codingonion\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001RiverTwilight\u3001gyt95\u3001zhuoqinyue\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001khoaxuantu\u3001FangYuan33\u3001GN-Yu\u3001longsizhuo\u3001mgisr\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001K3v123\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001pengchzn\u3001Guanngxu\u3001QiLOL\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001rongyi\u3001JeffersonHuang\u3001longranger2\u3001theNefelibatas\u3001yuelinxin\u3001xiongsp\u3001nanlei\u3001a16su\u3001cy-by-side\u3001gaofer\u3001malone6\u3001Wonderdch\u3001hongyun-robot\u3001XiaChuerwu\u3001yd-j\u3001bluebean-cloud\u3001iron-irax\u3001he-weilai\u3001Nigh\u3001MolDuM\u3001Phoenix0415\u3001XC-Zero\u3001SamJin98\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001luluxia\u3001boloboloda\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001coderlef\u3001czruby\u3001beintentional\u3001KeiichiKasai\u3001xb534\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001siqyka\u3001selear\u3001sdshaoda\u3001noobcodemaker\u3001chadyi\u3001lyl625760\u3001lucaswangdev\u3001liuxjerry\u30010130w\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001Transmigration-zhou\u3001fanchenggang\u3001gltianwen\u3001Dr-XYZ\u3001curly210102\u3001CuB3y0nd\u3001youshaoXG\u3001bubble9um\u3001fanenr\u300152coder\u3001foursevenlove\u3001KorsChen\u3001ZongYangL\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001Suremotoo\u3001Allen-Scai\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh \u548c Keynman \u3002

    \u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\uff09\u3002\u611f\u8c22\u4ed6\u4eec\u4ed8\u51fa\u7684\u65f6\u95f4\u4e0e\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u4eec\u786e\u4fdd\u4e86\u5404\u8bed\u8a00\u4ee3\u7801\u7684\u89c4\u8303\u4e0e\u7edf\u4e00\u3002

    \u5728\u672c\u4e66\u7684\u521b\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8bb8\u591a\u4eba\u7684\u5e2e\u52a9\u3002

    • \u611f\u8c22\u6211\u5728\u516c\u53f8\u7684\u5bfc\u5e08\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u7545\u8c08\u4e2d\u4f60\u9f13\u52b1\u6211\u201c\u5feb\u884c\u52a8\u8d77\u6765\u201d\uff0c\u575a\u5b9a\u4e86\u6211\u5199\u8fd9\u672c\u4e66\u7684\u51b3\u5fc3\uff1b
    • \u611f\u8c22\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u4e3a\u672c\u4e66\u7684\u9996\u4f4d\u8bfb\u8005\uff0c\u4ece\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8bb8\u591a\u5b9d\u8d35\u5efa\u8bae\uff0c\u4f7f\u5f97\u672c\u4e66\u66f4\u9002\u5408\u65b0\u624b\u9605\u8bfb\uff1b
    • \u611f\u8c22\u817e\u5b9d\u3001\u7426\u5b9d\u3001\u98de\u5b9d\u4e3a\u672c\u4e66\u8d77\u4e86\u4e00\u4e2a\u5bcc\u6709\u521b\u610f\u7684\u540d\u5b57\uff0c\u5524\u8d77\u5927\u5bb6\u5199\u4e0b\u7b2c\u4e00\u884c\u4ee3\u7801\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u5fc6\uff1b
    • \u611f\u8c22\u6821\u94e8\u5728\u77e5\u8bc6\u4ea7\u6743\u65b9\u9762\u63d0\u4f9b\u7684\u4e13\u4e1a\u5e2e\u52a9\uff0c\u8fd9\u5bf9\u672c\u5f00\u6e90\u4e66\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
    • \u611f\u8c22\u82cf\u6f7c\u4e3a\u672c\u4e66\u8bbe\u8ba1\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u5e76\u5728\u6211\u7684\u5f3a\u8feb\u75c7\u7684\u9a71\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
    • \u611f\u8c22 @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8bae\uff0c\u4ee5\u53ca\u4ed6\u5f00\u53d1\u7684\u5f00\u6e90\u6587\u6863\u4e3b\u9898 Material-for-MkDocs \u3002

    \u5728\u5199\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u9605\u8bfb\u4e86\u8bb8\u591a\u5173\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u8fd9\u4e9b\u4f5c\u54c1\u4e3a\u672c\u4e66\u63d0\u4f9b\u4e86\u4f18\u79c0\u7684\u8303\u672c\uff0c\u786e\u4fdd\u4e86\u672c\u4e66\u5185\u5bb9\u7684\u51c6\u786e\u6027\u4e0e\u54c1\u8d28\u3002\u5728\u6b64\u611f\u8c22\u6240\u6709\u8001\u5e08\u548c\u524d\u8f88\u7684\u6770\u51fa\u8d21\u732e\uff01

    \u672c\u4e66\u5021\u5bfc\u624b\u8111\u5e76\u7528\u7684\u5b66\u4e60\u65b9\u5f0f\uff0c\u5728\u8fd9\u4e00\u70b9\u4e0a\u6211\u6df1\u53d7\u300a\u52a8\u624b\u5b66\u6df1\u5ea6\u5b66\u4e60\u300b\u7684\u542f\u53d1\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8bfb\u8005\u5f3a\u70c8\u63a8\u8350\u8fd9\u672c\u4f18\u79c0\u7684\u8457\u4f5c\u3002

    \u8877\u5fc3\u611f\u8c22\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u4eec\u4e00\u76f4\u4ee5\u6765\u7684\u652f\u6301\u4e0e\u9f13\u52b1\uff0c\u8ba9\u6211\u6709\u673a\u4f1a\u505a\u8fd9\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

    "},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66","text":"

    Tip

    \u4e3a\u4e86\u83b7\u5f97\u6700\u4f73\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u5efa\u8bae\u4f60\u901a\u8bfb\u672c\u8282\u5185\u5bb9\u3002

    "},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98ce\u683c\u7ea6\u5b9a","text":"
    • \u6807\u9898\u540e\u6807\u6ce8 * \u7684\u662f\u9009\u8bfb\u7ae0\u8282\uff0c\u5185\u5bb9\u76f8\u5bf9\u56f0\u96be\u3002\u5982\u679c\u4f60\u7684\u65f6\u95f4\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\u3002
    • \u4e13\u4e1a\u672f\u8bed\u4f1a\u4f7f\u7528\u9ed1\u4f53\uff08\u7eb8\u8d28\u7248\u548c PDF \u7248\uff09\u6216\u6dfb\u52a0\u4e0b\u5212\u7ebf\uff08\u7f51\u9875\u7248\uff09\uff0c\u4f8b\u5982\u6570\u7ec4\uff08array\uff09\u3002\u5efa\u8bae\u8bb0\u4f4f\u5b83\u4eec\uff0c\u4ee5\u4fbf\u9605\u8bfb\u6587\u732e\u3002
    • \u91cd\u70b9\u5185\u5bb9\u548c\u603b\u7ed3\u6027\u8bed\u53e5\u4f1a \u52a0\u7c97\uff0c\u8fd9\u7c7b\u6587\u5b57\u503c\u5f97\u7279\u522b\u5173\u6ce8\u3002
    • \u6709\u7279\u6307\u542b\u4e49\u7684\u8bcd\u53e5\u4f1a\u4f7f\u7528\u201c\u5f15\u53f7\u201d\u6807\u6ce8\uff0c\u4ee5\u907f\u514d\u6b67\u4e49\u3002
    • \u5f53\u6d89\u53ca\u7f16\u7a0b\u8bed\u8a00\u4e4b\u95f4\u4e0d\u4e00\u81f4\u7684\u540d\u8bcd\u65f6\uff0c\u672c\u4e66\u5747\u4ee5 Python \u4e3a\u51c6\uff0c\u4f8b\u5982\u4f7f\u7528 None \u6765\u8868\u793a\u201c\u7a7a\u201d\u3002
    • \u672c\u4e66\u90e8\u5206\u653e\u5f03\u4e86\u7f16\u7a0b\u8bed\u8a00\u7684\u6ce8\u91ca\u89c4\u8303\uff0c\u4ee5\u6362\u53d6\u66f4\u52a0\u7d27\u51d1\u7684\u5185\u5bb9\u6392\u7248\u3002\u6ce8\u91ca\u4e3b\u8981\u5206\u4e3a\u4e09\u79cd\u7c7b\u578b\uff1a\u6807\u9898\u6ce8\u91ca\u3001\u5185\u5bb9\u6ce8\u91ca\u3001\u591a\u884c\u6ce8\u91ca\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    \"\"\"\u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\"\"\"\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n\"\"\"\n\u591a\u884c\n\u6ce8\u91ca\n\"\"\"\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    ### \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 ###\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n# \u591a\u884c\n# \u6ce8\u91ca\n
    // \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n// \u591a\u884c\n// \u6ce8\u91ca\n
    "},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52a8\u753b\u56fe\u89e3\u4e2d\u9ad8\u6548\u5b66\u4e60","text":"

    \u76f8\u8f83\u4e8e\u6587\u5b57\uff0c\u89c6\u9891\u548c\u56fe\u7247\u5177\u6709\u66f4\u9ad8\u7684\u4fe1\u606f\u5bc6\u5ea6\u548c\u7ed3\u6784\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u4e8e\u7406\u89e3\u3002\u5728\u672c\u4e66\u4e2d\uff0c\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u5c06\u4e3b\u8981\u901a\u8fc7\u52a8\u753b\u4ee5\u56fe\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5219\u4f5c\u4e3a\u89e3\u91ca\u4e0e\u8865\u5145\u3002

    \u5982\u679c\u4f60\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u53d1\u73b0\u67d0\u6bb5\u5185\u5bb9\u63d0\u4f9b\u4e86\u5982\u56fe 0-2 \u6240\u793a\u7684\u52a8\u753b\u56fe\u89e3\uff0c\u8bf7\u4ee5\u56fe\u4e3a\u4e3b\u3001\u4ee5\u6587\u5b57\u4e3a\u8f85\uff0c\u7efc\u5408\u4e24\u8005\u6765\u7406\u89e3\u5185\u5bb9\u3002

    \u56fe 0-2 \u00a0 \u52a8\u753b\u56fe\u89e3\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u4ee3\u7801\u5b9e\u8df5\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

    \u672c\u4e66\u7684\u914d\u5957\u4ee3\u7801\u6258\u7ba1\u5728 GitHub \u4ed3\u5e93\u3002\u5982\u56fe 0-3 \u6240\u793a\uff0c\u6e90\u4ee3\u7801\u9644\u6709\u6d4b\u8bd5\u6837\u4f8b\uff0c\u53ef\u4e00\u952e\u8fd0\u884c\u3002

    \u5982\u679c\u65f6\u95f4\u5141\u8bb8\uff0c\u5efa\u8bae\u4f60\u53c2\u7167\u4ee3\u7801\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b66\u4e60\u65f6\u95f4\u6709\u9650\uff0c\u8bf7\u81f3\u5c11\u901a\u8bfb\u5e76\u8fd0\u884c\u6240\u6709\u4ee3\u7801\u3002

    \u4e0e\u9605\u8bfb\u4ee3\u7801\u76f8\u6bd4\uff0c\u7f16\u5199\u4ee3\u7801\u7684\u8fc7\u7a0b\u5f80\u5f80\u80fd\u5e26\u6765\u66f4\u591a\u6536\u83b7\u3002\u52a8\u624b\u5b66\uff0c\u624d\u662f\u771f\u7684\u5b66\u3002

    \u56fe 0-3 \u00a0 \u8fd0\u884c\u4ee3\u7801\u793a\u4f8b

    \u8fd0\u884c\u4ee3\u7801\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\u3002

    \u7b2c\u4e00\u6b65\uff1a\u5b89\u88c5\u672c\u5730\u7f16\u7a0b\u73af\u5883\u3002\u8bf7\u53c2\u7167\u9644\u5f55\u6240\u793a\u7684\u6559\u7a0b\u8fdb\u884c\u5b89\u88c5\uff0c\u5982\u679c\u5df2\u5b89\u88c5\uff0c\u5219\u53ef\u8df3\u8fc7\u6b64\u6b65\u9aa4\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f7d\u4ee3\u7801\u4ed3\u5e93\u3002\u524d\u5f80 GitHub \u4ed3\u5e93\u3002\u5982\u679c\u5df2\u7ecf\u5b89\u88c5 Git \uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u4ed3\u5e93\uff1a

    git clone https://github.com/krahets/hello-algo.git\n

    \u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u56fe 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u70b9\u51fb\u201cDownload ZIP\u201d\u6309\u94ae\u76f4\u63a5\u4e0b\u8f7d\u4ee3\u7801\u538b\u7f29\u5305\uff0c\u7136\u540e\u5728\u672c\u5730\u89e3\u538b\u5373\u53ef\u3002

    \u56fe 0-4 \u00a0 \u514b\u9686\u4ed3\u5e93\u4e0e\u4e0b\u8f7d\u4ee3\u7801

    \u7b2c\u4e09\u6b65\uff1a\u8fd0\u884c\u6e90\u4ee3\u7801\u3002\u5982\u56fe 0-5 \u6240\u793a\uff0c\u5bf9\u4e8e\u9876\u90e8\u6807\u6709\u6587\u4ef6\u540d\u79f0\u7684\u4ee3\u7801\u5757\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4ed3\u5e93\u7684 codes \u6587\u4ef6\u5939\u5185\u627e\u5230\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6\u3002\u6e90\u4ee3\u7801\u6587\u4ef6\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u5c06\u5e2e\u52a9\u4f60\u8282\u7701\u4e0d\u5fc5\u8981\u7684\u8c03\u8bd5\u65f6\u95f4\uff0c\u8ba9\u4f60\u80fd\u591f\u4e13\u6ce8\u4e8e\u5b66\u4e60\u5185\u5bb9\u3002

    \u56fe 0-5 \u00a0 \u4ee3\u7801\u5757\u4e0e\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6

    \u9664\u4e86\u672c\u5730\u8fd0\u884c\u4ee3\u7801\uff0c\u7f51\u9875\u7248\u8fd8\u652f\u6301 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c\uff08\u57fa\u4e8e pythontutor \u5b9e\u73b0\uff09\u3002\u5982\u56fe 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u70b9\u51fb\u4ee3\u7801\u5757\u4e0b\u65b9\u7684\u201c\u53ef\u89c6\u5316\u8fd0\u884c\u201d\u6765\u5c55\u5f00\u89c6\u56fe\uff0c\u89c2\u5bdf\u7b97\u6cd5\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u70b9\u51fb\u201c\u5168\u5c4f\u89c2\u770b\u201d\uff0c\u4ee5\u83b7\u5f97\u66f4\u597d\u7684\u9605\u89c8\u4f53\u9a8c\u3002

    \u56fe 0-6 \u00a0 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c

    "},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u95ee\u8ba8\u8bba\u4e2d\u5171\u540c\u6210\u957f","text":"

    \u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u8bf7\u4e0d\u8981\u8f7b\u6613\u8df3\u8fc7\u90a3\u4e9b\u6ca1\u5b66\u660e\u767d\u7684\u77e5\u8bc6\u70b9\u3002\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u63d0\u51fa\u4f60\u7684\u95ee\u9898\uff0c\u6211\u548c\u5c0f\u4f19\u4f34\u4eec\u5c06\u7aed\u8bda\u4e3a\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5728\u4e24\u5929\u5185\u56de\u590d\u3002

    \u5982\u56fe 0-7 \u6240\u793a\uff0c\u7f51\u9875\u7248\u6bcf\u4e2a\u7ae0\u8282\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8bc4\u8bba\u533a\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u5173\u6ce8\u8bc4\u8bba\u533a\u7684\u5185\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u4e86\u89e3\u5927\u5bb6\u9047\u5230\u7684\u95ee\u9898\uff0c\u4ece\u800c\u67e5\u6f0f\u8865\u7f3a\uff0c\u6fc0\u53d1\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u4f19\u4f34\u7684\u95ee\u9898\uff0c\u5206\u4eab\u4f60\u7684\u89c1\u89e3\uff0c\u5e2e\u52a9\u4ed6\u4eba\u8fdb\u6b65\u3002

    \u56fe 0-7 \u00a0 \u8bc4\u8bba\u533a\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf","text":"

    \u4ece\u603b\u4f53\u4e0a\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8fc7\u7a0b\u5212\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\u3002

    1. \u9636\u6bb5\u4e00\uff1a\u7b97\u6cd5\u5165\u95e8\u3002\u6211\u4eec\u9700\u8981\u719f\u6089\u5404\u79cd\u6570\u636e\u7ed3\u6784\u7684\u7279\u70b9\u548c\u7528\u6cd5\uff0c\u5b66\u4e60\u4e0d\u540c\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5185\u5bb9\u3002
    2. \u9636\u6bb5\u4e8c\uff1a\u5237\u7b97\u6cd5\u9898\u3002\u5efa\u8bae\u4ece\u70ed\u95e8\u9898\u76ee\u5f00\u5237\uff0c\u5148\u79ef\u7d2f\u81f3\u5c11 100 \u9053\u9898\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u7b97\u6cd5\u95ee\u9898\u3002\u521d\u6b21\u5237\u9898\u65f6\uff0c\u201c\u77e5\u8bc6\u9057\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u4e2a\u6311\u6218\uff0c\u4f46\u8bf7\u653e\u5fc3\uff0c\u8fd9\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u4eec\u53ef\u4ee5\u6309\u7167\u201c\u827e\u5bbe\u6d69\u65af\u9057\u5fd8\u66f2\u7ebf\u201d\u6765\u590d\u4e60\u9898\u76ee\uff0c\u901a\u5e38\u5728\u8fdb\u884c 3\uff5e5 \u8f6e\u7684\u91cd\u590d\u540e\uff0c\u5c31\u80fd\u5c06\u5176\u7262\u8bb0\u5728\u5fc3\u3002\u63a8\u8350\u7684\u9898\u5355\u548c\u5237\u9898\u8ba1\u5212\u8bf7\u89c1\u6b64 GitHub \u4ed3\u5e93\u3002
    3. \u9636\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5b66\u4e60\u65b9\u9762\uff0c\u6211\u4eec\u53ef\u4ee5\u9605\u8bfb\u7b97\u6cd5\u4e13\u680f\u6587\u7ae0\u3001\u89e3\u9898\u6846\u67b6\u548c\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65ad\u4e30\u5bcc\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5237\u9898\u65b9\u9762\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u91c7\u7528\u8fdb\u9636\u5237\u9898\u7b56\u7565\uff0c\u5982\u6309\u4e13\u9898\u5206\u7c7b\u3001\u4e00\u9898\u591a\u89e3\u3001\u4e00\u89e3\u591a\u9898\u7b49\uff0c\u76f8\u5173\u7684\u5237\u9898\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u4e2a\u793e\u533a\u627e\u5230\u3002

    \u5982\u56fe 0-8 \u6240\u793a\uff0c\u672c\u4e66\u5185\u5bb9\u4e3b\u8981\u6db5\u76d6\u201c\u9636\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e2e\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u5f00\u9636\u6bb5\u4e8c\u548c\u9636\u6bb5\u4e09\u7684\u5b66\u4e60\u3002

    \u56fe 0-8 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf

    "},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7ed3","text":"
    • \u672c\u4e66\u7684\u4e3b\u8981\u53d7\u4f17\u662f\u7b97\u6cd5\u521d\u5b66\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u7840\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u4f60\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u4e66\u4e2d\u6e90\u4ee3\u7801\u4e5f\u53ef\u4f5c\u4e3a\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u4f7f\u7528\u3002
    • \u4e66\u4e2d\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u590d\u6742\u5ea6\u5206\u6790\u3001\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u5927\u90e8\u5206\u4e3b\u9898\u3002
    • \u5bf9\u4e8e\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b66\u9636\u6bb5\u9605\u8bfb\u4e00\u672c\u5165\u95e8\u4e66\u81f3\u5173\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8bb8\u591a\u5f2f\u8def\u3002
    • \u4e66\u4e2d\u7684\u52a8\u753b\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u3002\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5e94\u7ed9\u4e88\u8fd9\u4e9b\u5185\u5bb9\u66f4\u591a\u5173\u6ce8\u3002
    • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\u3002\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u4ee3\u7801\u3002
    • \u672c\u4e66\u7f51\u9875\u7248\u7684\u6bcf\u4e2a\u7ae0\u8282\u90fd\u8bbe\u6709\u8bc4\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\u4e0e\u89c1\u89e3\u3002
    "},{"location":"chapter_reference/","title":"\u53c2\u8003\u6587\u732e","text":"

    [1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

    [2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

    [3] Robert Sedgewick, et al. Algorithms (4th Edition).

    [4] \u4e25\u851a\u654f. \u6570\u636e\u7ed3\u6784\uff08C \u8bed\u8a00\u7248\uff09.

    [5] \u9093\u4fca\u8f89. \u6570\u636e\u7ed3\u6784\uff08C++ \u8bed\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

    [6] \u9a6c\u514b \u827e\u4f26 \u7ef4\u65af\u8457\uff0c\u9648\u8d8a\u8bd1. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5206\u6790\uff1aJava\u8bed\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

    [7] \u7a0b\u6770. \u5927\u8bdd\u6570\u636e\u7ed3\u6784.

    [8] \u738b\u4e89. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u7f8e.

    [9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

    [10] Aston Zhang, et al. Dive into Deep Learning.

    "},{"location":"chapter_searching/","title":"\u7b2c 10 \u7ae0 \u00a0 \u641c\u7d22","text":"

    Abstract

    \u641c\u7d22\u662f\u4e00\u573a\u672a\u77e5\u7684\u5192\u9669\uff0c\u6211\u4eec\u6216\u8bb8\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u95f4\u7684\u6bcf\u4e2a\u89d2\u843d\uff0c\u53c8\u6216\u8bb8\u53ef\u4ee5\u5feb\u901f\u9501\u5b9a\u76ee\u6807\u3002

    \u5728\u8fd9\u573a\u5bfb\u89c5\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u4e2a\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

    "},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 10.1 \u00a0 \u4e8c\u5206\u67e5\u627e
    • 10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9
    • 10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c
    • 10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565
    • 10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5
    • 10.6 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

    \u4e8c\u5206\u67e5\u627e\uff08binary search\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u7d22\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\u641c\u7d22\u8303\u56f4\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u4e3a\u6b62\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u590d\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u8be5\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 10-1 \u6240\u793a\u3002

    \u56fe 10-1 \u00a0 \u4e8c\u5206\u67e5\u627e\u793a\u4f8b\u6570\u636e

    \u5982\u56fe 10-2 \u6240\u793a\uff0c\u6211\u4eec\u5148\u521d\u59cb\u5316\u6307\u9488 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u7d22\u533a\u95f4 \\([0, n - 1]\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u4e2d\u62ec\u53f7\u8868\u793a\u95ed\u533a\u95f4\uff0c\u5176\u5305\u542b\u8fb9\u754c\u503c\u672c\u8eab\u3002

    \u63a5\u4e0b\u6765\uff0c\u5faa\u73af\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

    1. \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
    2. \u5224\u65ad nums[m] \u548c target \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e09\u79cd\u60c5\u51b5\u3002
      1. \u5f53 nums[m] < target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(i = m + 1\\) \u3002
      2. \u5f53 nums[m] > target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(j = m - 1\\) \u3002
      3. \u5f53 nums[m] = target \u65f6\uff0c\u8bf4\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

    \u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20\uff0c\u641c\u7d22\u533a\u95f4\u6700\u7ec8\u4f1a\u7f29\u5c0f\u4e3a\u7a7a\u3002\u6b64\u65f6\u8fd4\u56de \\(-1\\) \u3002

    <1><2><3><4><5><6><7>

    \u56fe 10-2 \u00a0 \u4e8c\u5206\u67e5\u627e\u6d41\u7a0b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u7c7b\u578b\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u4e3a\u4e86\u907f\u514d\u5927\u6570\u8d8a\u754c\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u6765\u8ba1\u7b97\u4e2d\u70b9\u3002

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8bba\u4e0a Python \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while i <= j\n    # \u7406\u8bba\u4e0a Ruby \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n    m = (i + j) / 2   # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u5faa\u73af\u4e2d\uff0c\u533a\u95f4\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u4e3a \\(\\log_2 n\\) \u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7a7a\u95f4\u3002

    "},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u533a\u95f4\u8868\u793a\u65b9\u6cd5","text":"

    \u9664\u4e86\u4e0a\u8ff0\u53cc\u95ed\u533a\u95f4\u5916\uff0c\u5e38\u89c1\u7684\u533a\u95f4\u8868\u793a\u8fd8\u6709\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u533a\u95f4\uff0c\u5b9a\u4e49\u4e3a \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8be5\u8868\u793a\u4e0b\uff0c\u533a\u95f4 \\([i, j)\\) \u5728 \\(i = j\\) \u65f6\u4e3a\u7a7a\u3002

    \u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u8be5\u8868\u793a\u5b9e\u73b0\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while i < j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 10-3 \u6240\u793a\uff0c\u5728\u4e24\u79cd\u533a\u95f4\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u5faa\u73af\u6761\u4ef6\u548c\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

    \u7531\u4e8e\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u8fb9\u754c\u90fd\u88ab\u5b9a\u4e49\u4e3a\u95ed\u533a\u95f4\uff0c\u56e0\u6b64\u901a\u8fc7\u6307\u9488 \\(i\\) \u548c\u6307\u9488 \\(j\\) \u7f29\u5c0f\u533a\u95f4\u7684\u64cd\u4f5c\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8bae\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

    \u56fe 10-3 \u00a0 \u4e24\u79cd\u533a\u95f4\u5b9a\u4e49

    "},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u4e8c\u5206\u67e5\u627e\u5728\u65f6\u95f4\u548c\u7a7a\u95f4\u65b9\u9762\u90fd\u6709\u8f83\u597d\u7684\u6027\u80fd\u3002

    • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u6548\u7387\u9ad8\u3002\u5728\u5927\u6570\u636e\u91cf\u4e0b\uff0c\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5177\u6709\u663e\u8457\u4f18\u52bf\u3002\u4f8b\u5982\uff0c\u5f53\u6570\u636e\u5927\u5c0f \\(n = 2^{20}\\) \u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u9700\u8981 \\(2^{20} = 1048576\\) \u8f6e\u5faa\u73af\uff0c\u800c\u4e8c\u5206\u67e5\u627e\u4ec5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f6e\u5faa\u73af\u3002
    • \u4e8c\u5206\u67e5\u627e\u65e0\u987b\u989d\u5916\u7a7a\u95f4\u3002\u76f8\u8f83\u4e8e\u9700\u8981\u501f\u52a9\u989d\u5916\u7a7a\u95f4\u7684\u641c\u7d22\u7b97\u6cd5\uff08\u4f8b\u5982\u54c8\u5e0c\u67e5\u627e\uff09\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

    \u7136\u800c\uff0c\u4e8c\u5206\u67e5\u627e\u5e76\u975e\u9002\u7528\u4e8e\u6240\u6709\u60c5\u51b5\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6709\u5e8f\u6570\u636e\u3002\u82e5\u8f93\u5165\u6570\u636e\u65e0\u5e8f\uff0c\u4e3a\u4e86\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\u800c\u4e13\u95e8\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u507f\u5931\u3002\u56e0\u4e3a\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u6bd4\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u90fd\u66f4\u9ad8\u3002\u5bf9\u4e8e\u9891\u7e41\u63d2\u5165\u5143\u7d20\u7684\u573a\u666f\uff0c\u4e3a\u4fdd\u6301\u6570\u7ec4\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c06\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8d35\u7684\u3002
    • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002\u4e8c\u5206\u67e5\u627e\u9700\u8981\u8df3\u8dc3\u5f0f\uff08\u975e\u8fde\u7eed\u5730\uff09\u8bbf\u95ee\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u6267\u884c\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u7684\u6548\u7387\u8f83\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5e94\u7528\u5728\u94fe\u8868\u6216\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
    • \u5c0f\u6570\u636e\u91cf\u4e0b\uff0c\u7ebf\u6027\u67e5\u627e\u6027\u80fd\u66f4\u4f73\u3002\u5728\u7ebf\u6027\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u9700 1 \u6b21\u5224\u65ad\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65ad\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u51cf\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u5f53\u6570\u636e\u91cf \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u53cd\u800c\u6bd4\u4e8c\u5206\u67e5\u627e\u66f4\u5feb\u3002
    "},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u627e\u5de6\u8fb9\u754c","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    \u56de\u5fc6\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u7684\u65b9\u6cd5\uff0c\u641c\u7d22\u5b8c\u6210\u540e \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target \uff0c\u56e0\u6b64\u67e5\u627e\u63d2\u5165\u70b9\u672c\u8d28\u4e0a\u662f\u5728\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002

    \u8003\u8651\u901a\u8fc7\u67e5\u627e\u63d2\u5165\u70b9\u7684\u51fd\u6570\u5b9e\u73b0\u67e5\u627e\u5de6\u8fb9\u754c\u3002\u8bf7\u6ce8\u610f\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u8fd9\u79cd\u60c5\u51b5\u53ef\u80fd\u5bfc\u81f4\u4ee5\u4e0b\u4e24\u79cd\u7ed3\u679c\u3002

    • \u63d2\u5165\u70b9\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
    • \u5143\u7d20 nums[i] \u4e0e target \u4e0d\u76f8\u7b49\u3002

    \u5f53\u9047\u5230\u4ee5\u4e0a\u4e24\u79cd\u60c5\u51b5\u65f6\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
    def binary_search_left_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target\"\"\"\n    # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i = binary_search_insertion(nums, target)\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) or nums[i] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size() || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.cs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.Length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i := binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binarySearchInsertion(nums: nums, target: target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.endIndex || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
    binary_search_edge.js
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.ts
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.dart
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  int i = binarySearchInsertion(nums, target);\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (i == nums.length || nums[i] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n  return i;\n}\n
    binary_search_edge.rs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binary_search_insertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.len() as i32 || nums[i as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    i\n}\n
    binary_search_edge.c
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, numSize, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == numSize || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.kt
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    val i = binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size || nums[i] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
    binary_search_edge.rb
    ### \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  i = binary_search_insertion(nums, target)\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\nend\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchLeftEdge}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u627e\u53f3\u8fb9\u754c","text":"

    \u90a3\u4e48\u5982\u4f55\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u4ee3\u7801\uff0c\u66ff\u6362\u5728 nums[m] == target \u60c5\u51b5\u4e0b\u7684\u6307\u9488\u6536\u7f29\u64cd\u4f5c\u3002\u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

    \u4e0b\u9762\u6211\u4eec\u4ecb\u7ecd\u4e24\u79cd\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

    "},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u590d\u7528\u67e5\u627e\u5de6\u8fb9\u754c","text":"

    \u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u67e5\u627e\u6700\u5de6\u5143\u7d20\u7684\u51fd\u6570\u6765\u67e5\u627e\u6700\u53f3\u5143\u7d20\uff0c\u5177\u4f53\u65b9\u6cd5\u4e3a\uff1a\u5c06\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\u3002

    \u5982\u56fe 10-7 \u6240\u793a\uff0c\u67e5\u627e\u5b8c\u6210\u540e\uff0c\u6307\u9488 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

    \u56fe 10-7 \u00a0 \u5c06\u67e5\u627e\u53f3\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5de6\u8fb9\u754c

    \u8bf7\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u70b9\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c06\u5176\u51cf \\(1\\) \uff0c\u4ece\u800c\u83b7\u5f97 \\(j\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target\"\"\"\n    # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j = i - 1\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 or nums[j] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.cs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j := i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
    binary_search_edge.js
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.ts
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.dart
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  int j = i - 1;\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (j == -1 || nums[j] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n  return j;\n}\n
    binary_search_edge.rs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    j\n}\n
    binary_search_edge.c
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.kt
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    val j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
    binary_search_edge.rb
    ### \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  j = i - 1\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if j == -1 || nums[j] != target\n\n  j # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\nend\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchRightEdge}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20","text":"

    \u6211\u4eec\u77e5\u9053\uff0c\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u6700\u7ec8 \\(i\\) \u548c \\(j\\) \u4f1a\u5206\u522b\u6307\u5411\u9996\u4e2a\u5927\u4e8e\u3001\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002

    \u56e0\u6b64\uff0c\u5982\u56fe 10-8 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u4e8e\u67e5\u627e\u5de6\u53f3\u8fb9\u754c\u3002

    • \u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target - 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(i\\) \u3002
    • \u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target + 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(j\\) \u3002

    \u56fe 10-8 \u00a0 \u5c06\u67e5\u627e\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20

    \u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u4e24\u70b9\u503c\u5f97\u6ce8\u610f\u3002

    • \u7ed9\u5b9a\u6570\u7ec4\u4e0d\u5305\u542b\u5c0f\u6570\uff0c\u8fd9\u610f\u5473\u7740\u6211\u4eec\u65e0\u987b\u5173\u5fc3\u5982\u4f55\u5904\u7406\u76f8\u7b49\u7684\u60c5\u51b5\u3002
    • \u56e0\u4e3a\u8be5\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6570\uff0c\u6240\u4ee5\u9700\u8981\u5c06\u51fd\u6570\u4e2d\u7684\u53d8\u91cf target \u6539\u4e3a\u6d6e\u70b9\u6570\u7c7b\u578b\uff08Python \u65e0\u987b\u6539\u52a8\uff09\u3002
    "},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9","text":"

    \u4e8c\u5206\u67e5\u627e\u4e0d\u4ec5\u53ef\u7528\u4e8e\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff0c\u8fd8\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u53d8\u79cd\u95ee\u9898\uff0c\u6bd4\u5982\u641c\u7d22\u76ee\u6807\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

    "},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u5143\u7d20 target \uff0c\u6570\u7ec4\u4e0d\u5b58\u5728\u91cd\u590d\u5143\u7d20\u3002\u73b0\u5c06 target \u63d2\u5165\u6570\u7ec4 nums \u4e2d\uff0c\u5e76\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u6570\u7ec4\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5219\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8bf7\u8fd4\u56de\u63d2\u5165\u540e target \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u56fe 10-4 \u6240\u793a\u3002

    \u56fe 10-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u793a\u4f8b\u6570\u636e

    \u5982\u679c\u60f3\u590d\u7528\u4e0a\u4e00\u8282\u7684\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\uff0c\u5219\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u4e24\u4e2a\u95ee\u9898\u3002

    \u95ee\u9898\u4e00\uff1a\u5f53\u6570\u7ec4\u4e2d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u662f\u5426\u662f\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u9898\u76ee\u8981\u6c42\u5c06 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u8fb9\uff0c\u8fd9\u610f\u5473\u7740\u65b0\u63d2\u5165\u7684 target \u66ff\u6362\u4e86\u539f\u6765 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u6570\u7ec4\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u5c31\u662f\u8be5 target \u7684\u7d22\u5f15\u3002

    \u95ee\u9898\u4e8c\uff1a\u5f53\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728 target \u65f6\uff0c\u63d2\u5165\u70b9\u662f\u54ea\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u8fdb\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u67e5\u627e\u8fc7\u7a0b\uff1a\u5f53 nums[m] < target \u65f6 \\(i\\) \u79fb\u52a8\uff0c\u8fd9\u610f\u5473\u7740\u6307\u9488 \\(i\\) \u5728\u5411\u5927\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u9488 \\(j\\) \u59cb\u7ec8\u5728\u5411\u5c0f\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u56e0\u6b64\u4e8c\u5206\u7ed3\u675f\u65f6\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002\u6613\u5f97\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u7d22\u5f15\u4e3a \\(i\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
    def binary_search_insertion_simple(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(\n    nums: Array<number>,\n    target: number\n): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertionSimple}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u5728\u4e0a\u4e00\u9898\u7684\u57fa\u7840\u4e0a\uff0c\u89c4\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u5176\u4f59\u4e0d\u53d8\u3002

    \u5047\u8bbe\u6570\u7ec4\u4e2d\u5b58\u5728\u591a\u4e2a target \uff0c\u5219\u666e\u901a\u4e8c\u5206\u67e5\u627e\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u800c\u65e0\u6cd5\u786e\u5b9a\u8be5\u5143\u7d20\u7684\u5de6\u8fb9\u548c\u53f3\u8fb9\u8fd8\u6709\u591a\u5c11 target\u3002

    \u9898\u76ee\u8981\u6c42\u5c06\u76ee\u6807\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u8fb9\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u8651\u901a\u8fc7\u56fe 10-5 \u6240\u793a\u7684\u6b65\u9aa4\u5b9e\u73b0\u3002

    1. \u6267\u884c\u4e8c\u5206\u67e5\u627e\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\(k\\) \u3002
    2. \u4ece\u7d22\u5f15 \\(k\\) \u5f00\u59cb\uff0c\u5411\u5de6\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u5f53\u627e\u5230\u6700\u5de6\u8fb9\u7684 target \u65f6\u8fd4\u56de\u3002

    \u56fe 10-5 \u00a0 \u7ebf\u6027\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9

    \u6b64\u65b9\u6cd5\u867d\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7ebf\u6027\u67e5\u627e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5f53\u6570\u7ec4\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u590d\u7684 target \u65f6\uff0c\u8be5\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

    \u73b0\u8003\u8651\u62d3\u5c55\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\u3002\u5982\u56fe 10-6 \u6240\u793a\uff0c\u6574\u4f53\u6d41\u7a0b\u4fdd\u6301\u4e0d\u53d8\uff0c\u6bcf\u8f6e\u5148\u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65ad target \u548c nums[m] \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u51e0\u79cd\u60c5\u51b5\u3002

    • \u5f53 nums[m] < target \u6216 nums[m] > target \u65f6\uff0c\u8bf4\u660e\u8fd8\u6ca1\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u91c7\u7528\u666e\u901a\u4e8c\u5206\u67e5\u627e\u7684\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
    • \u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u91c7\u7528 \\(j = m - 1\\) \u6765\u7f29\u5c0f\u533a\u95f4\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(j\\) \u5411\u5c0f\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u5faa\u73af\u5b8c\u6210\u540e\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u8fb9\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u70b9\u3002

    <1><2><3><4><5><6><7><8>

    \u56fe 10-6 \u00a0 \u4e8c\u5206\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9\u7684\u6b65\u9aa4

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5224\u65ad\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u4e24\u8005\u53ef\u4ee5\u5408\u5e76\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5c06\u5224\u65ad\u6761\u4ef6\u4fdd\u6301\u5c55\u5f00\uff0c\u56e0\u4e3a\u5176\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8bfb\u6027\u66f4\u597d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
    def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\npub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertion}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Tip

    \u672c\u8282\u7684\u4ee3\u7801\u90fd\u662f\u201c\u53cc\u95ed\u533a\u95f4\u201d\u5199\u6cd5\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u5199\u6cd5\u3002

    \u603b\u7684\u6765\u770b\uff0c\u4e8c\u5206\u67e5\u627e\u65e0\u975e\u5c31\u662f\u7ed9\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u522b\u8bbe\u5b9a\u641c\u7d22\u76ee\u6807\uff0c\u76ee\u6807\u53ef\u80fd\u662f\u4e00\u4e2a\u5177\u4f53\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u4e2a\u5143\u7d20\u8303\u56f4\uff08\u4f8b\u5982\u5c0f\u4e8e target \u7684\u5143\u7d20\uff09\u3002

    \u5728\u4e0d\u65ad\u7684\u5faa\u73af\u4e8c\u5206\u4e2d\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6e10\u903c\u8fd1\u9884\u5148\u8bbe\u5b9a\u7684\u76ee\u6807\u3002\u6700\u7ec8\uff0c\u5b83\u4eec\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u8fc7\u8fb9\u754c\u540e\u505c\u6b62\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565","text":"

    \u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u5e38\u901a\u8fc7\u5c06\u7ebf\u6027\u67e5\u627e\u66ff\u6362\u4e3a\u54c8\u5e0c\u67e5\u627e\u6765\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u7b97\u6cd5\u9898\u6765\u52a0\u6df1\u7406\u89e3\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u5143\u7d20 target \uff0c\u8bf7\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u201c\u548c\u201d\u4e3a target \u7684\u4e24\u4e2a\u5143\u7d20\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u4e2a\u89e3\u5373\u53ef\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7ebf\u6027\u67e5\u627e\uff1a\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4","text":"

    \u8003\u8651\u76f4\u63a5\u904d\u5386\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\u3002\u5982\u56fe 10-9 \u6240\u793a\uff0c\u6211\u4eec\u5f00\u542f\u4e00\u4e2a\u4e24\u5c42\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u5224\u65ad\u4e24\u4e2a\u6574\u6570\u7684\u548c\u662f\u5426\u4e3a target \uff0c\u82e5\u662f\uff0c\u5219\u8fd4\u56de\u5b83\u4eec\u7684\u7d22\u5f15\u3002

    \u56fe 10-9 \u00a0 \u7ebf\u6027\u67e5\u627e\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
    def two_sum_brute_force(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\"\"\"\n    # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in range(len(nums) - 1):\n        for j in range(i + 1, len(nums)):\n            if nums[i] + nums[j] == target:\n                return [i, j]\n    return []\n
    two_sum.cpp
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return {i, j};\n        }\n    }\n    return {};\n}\n
    two_sum.java
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return new int[] { i, j };\n        }\n    }\n    return new int[0];\n}\n
    two_sum.cs
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return [i, j];\n        }\n    }\n    return [];\n}\n
    two_sum.go
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in nums.indices.dropLast() {\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[i] + nums[j] == target {\n                return [i, j]\n            }\n        }\n    }\n    return [0]\n}\n
    two_sum.js
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
    two_sum.ts
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
    two_sum.dart
    /* \u65b9\u6cd5\u4e00\uff1a \u66b4\u529b\u679a\u4e3e */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for (var i = 0; i < size - 1; i++) {\n    for (var j = i + 1; j < size; j++) {\n      if (nums[i] + nums[j] == target) return [i, j];\n    }\n  }\n  return [0];\n}\n
    two_sum.rs
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in 0..size - 1 {\n        for j in i + 1..size {\n            if nums[i] + nums[j] == target {\n                return Some(vec![i as i32, j as i32]);\n            }\n        }\n    }\n    None\n}\n
    two_sum.c
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\n    for (int i = 0; i < numsSize; ++i) {\n        for (int j = i + 1; j < numsSize; ++j) {\n            if (nums[i] + nums[j] == target) {\n                int *res = malloc(sizeof(int) * 2);\n                res[0] = i, res[1] = j;\n                *returnSize = 2;\n                return res;\n            }\n        }\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
    two_sum.kt
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (i in 0..<size - 1) {\n        for (j in i + 1..<size) {\n            if (nums[i] + nums[j] == target) return intArrayOf(i, j)\n        }\n    }\n    return IntArray(0)\n}\n
    two_sum.rb
    ### \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e ###\ndef two_sum_brute_force(nums, target)\n  # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n
    two_sum.zig
    // \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    while (i < size - 1) : (i += 1) {\n        var j = i + 1;\n        while (j < size) : (j += 1) {\n            if (nums[i] + nums[j] == target) {\n                return [_]i32{@intCast(i), @intCast(j)};\n            }\n        }\n    }\n    return null;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6b64\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u975e\u5e38\u8017\u65f6\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

    \u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u952e\u503c\u5bf9\u5206\u522b\u4e3a\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u6267\u884c\u56fe 10-10 \u6240\u793a\u7684\u6b65\u9aa4\u3002

    1. \u5224\u65ad\u6570\u5b57 target - nums[i] \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002
    2. \u5c06\u952e\u503c\u5bf9 nums[i] \u548c\u7d22\u5f15 i \u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\u3002
    <1><2><3>

    \u56fe 10-10 \u00a0 \u8f85\u52a9\u54c8\u5e0c\u8868\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff0c\u4ec5\u9700\u5355\u5c42\u5faa\u73af\u5373\u53ef\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
    def two_sum_hash_table(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\"\"\"\n    # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    dic = {}\n    # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in range(len(nums)):\n        if target - nums[i] in dic:\n            return [dic[target - nums[i]], i]\n        dic[nums[i]] = i\n    return []\n
    two_sum.cpp
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    unordered_map<int, int> dic;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.find(target - nums[i]) != dic.end()) {\n            return {dic[target - nums[i]], i};\n        }\n        dic.emplace(nums[i], i);\n    }\n    return {};\n}\n
    two_sum.java
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.containsKey(target - nums[i])) {\n            return new int[] { dic.get(target - nums[i]), i };\n        }\n        dic.put(nums[i], i);\n    }\n    return new int[0];\n}\n
    two_sum.cs
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Dictionary<int, int> dic = [];\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.ContainsKey(target - nums[i])) {\n            return [dic[target - nums[i]], i];\n        }\n        dic.Add(nums[i], i);\n    }\n    return [];\n}\n
    two_sum.go
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    hashTable := map[int]int{}\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for idx, val := range nums {\n        if preIdx, ok := hashTable[target-val]; ok {\n            return []int{preIdx, idx}\n        }\n        hashTable[val] = idx\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic: [Int: Int] = [:]\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in nums.indices {\n        if let j = dic[target - nums[i]] {\n            return [j, i]\n        }\n        dic[nums[i]] = i\n    }\n    return [0]\n}\n
    two_sum.js
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m = {};\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        if (m[target - nums[i]] !== undefined) {\n            return [m[target - nums[i]], i];\n        } else {\n            m[nums[i]] = i;\n        }\n    }\n    return [];\n}\n
    two_sum.ts
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m: Map<number, number> = new Map();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        let index = m.get(target - nums[i]);\n        if (index !== undefined) {\n            return [index, i];\n        } else {\n            m.set(nums[i], i);\n        }\n    }\n    return [];\n}\n
    two_sum.dart
    /* \u65b9\u6cd5\u4e8c\uff1a \u8f85\u52a9\u54c8\u5e0c\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  Map<int, int> dic = HashMap();\n  // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for (var i = 0; i < size; i++) {\n    if (dic.containsKey(target - nums[i])) {\n      return [dic[target - nums[i]]!, i];\n    }\n    dic.putIfAbsent(nums[i], () => i);\n  }\n  return [0];\n}\n
    two_sum.rs
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let mut dic = HashMap::new();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i, num) in nums.iter().enumerate() {\n        match dic.get(&(target - num)) {\n            Some(v) => return Some(vec![*v as i32, i as i32]),\n            None => dic.insert(num, i as i32),\n        };\n    }\n    None\n}\n
    two_sum.c
    /* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u54c8\u5e0c\u8868\u67e5\u8be2 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u54c8\u5e0c\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(HashTable *h, int key, int val) {\n    HashTable *t = find(h, key);\n    if (t == NULL) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = key, tmp->val = val;\n        HASH_ADD_INT(h, key, tmp);\n    } else {\n        t->val = val;\n    }\n}\n\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\n    HashTable *hashtable = NULL;\n    for (int i = 0; i < numsSize; i++) {\n        HashTable *t = find(hashtable, target - nums[i]);\n        if (t != NULL) {\n            int *res = malloc(sizeof(int) * 2);\n            res[0] = t->val, res[1] = i;\n            *returnSize = 2;\n            return res;\n        }\n        insert(hashtable, nums[i], i);\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
    two_sum.kt
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    val dic = HashMap<Int, Int>()\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i in 0..<size) {\n        if (dic.containsKey(target - nums[i])) {\n            return intArrayOf(dic[target - nums[i]]!!, i)\n        }\n        dic[nums[i]] = i\n    }\n    return IntArray(0)\n}\n
    two_sum.rb
    ### \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  dic = {}\n  # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for i in 0...nums.length\n    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])\n\n    dic[nums[i]] = i\n  end\n\n  []\nend\n
    two_sum.zig
    // \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    while (i < size) : (i += 1) {\n        if (dic.contains(target - nums[i])) {\n            return [_]i32{dic.get(target - nums[i]).?, @intCast(i)};\n        }\n        try dic.put(nums[i], @intCast(i));\n    }\n    return null;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6b64\u65b9\u6cd5\u901a\u8fc7\u54c8\u5e0c\u67e5\u627e\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u8fd0\u884c\u6548\u7387\u3002

    \u7531\u4e8e\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u989d\u5916\u7684\u54c8\u5e0c\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5c3d\u7ba1\u5982\u6b64\uff0c\u8be5\u65b9\u6cd5\u7684\u6574\u4f53\u65f6\u7a7a\u6548\u7387\u66f4\u4e3a\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u9898\u7684\u6700\u4f18\u89e3\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5","text":"

    \u641c\u7d22\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u4e8e\u5728\u6570\u636e\u7ed3\u6784\uff08\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u6216\u56fe\uff09\u4e2d\u641c\u7d22\u4e00\u4e2a\u6216\u4e00\u7ec4\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5143\u7d20\u3002

    \u641c\u7d22\u7b97\u6cd5\u53ef\u6839\u636e\u5b9e\u73b0\u601d\u8def\u5206\u4e3a\u4ee5\u4e0b\u4e24\u7c7b\u3002

    • \u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\uff0c\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u7b49\u3002
    • \u5229\u7528\u6570\u636e\u7ec4\u7ec7\u7ed3\u6784\u6216\u6570\u636e\u5305\u542b\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u5b9e\u73b0\u9ad8\u6548\u5143\u7d20\u67e5\u627e\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u548c\u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u7b49\u3002

    \u4e0d\u96be\u53d1\u73b0\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u70b9\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u56e0\u6b64\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ece\u66f4\u52a0\u7cfb\u7edf\u7684\u89c6\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5ba1\u89c6\u641c\u7d22\u7b97\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u7d22","text":"

    \u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u7684\u6bcf\u4e2a\u5143\u7d20\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

    • \u201c\u7ebf\u6027\u641c\u7d22\u201d\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\u7b49\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u5b83\u4ece\u6570\u636e\u7ed3\u6784\u7684\u4e00\u7aef\u5f00\u59cb\uff0c\u9010\u4e2a\u8bbf\u95ee\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u5230\u8fbe\u53e6\u4e00\u7aef\u4ecd\u6ca1\u6709\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
    • \u201c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u548c\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u662f\u56fe\u548c\u6811\u7684\u4e24\u79cd\u904d\u5386\u7b56\u7565\u3002\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\u9010\u5c42\u641c\u7d22\uff0c\u7531\u8fd1\u53ca\u8fdc\u5730\u8bbf\u95ee\u5404\u4e2a\u8282\u70b9\u3002\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\uff0c\u6cbf\u7740\u4e00\u6761\u8def\u5f84\u8d70\u5230\u5934\uff0c\u518d\u56de\u6eaf\u5e76\u5c1d\u8bd5\u5176\u4ed6\u8def\u5f84\uff0c\u76f4\u5230\u904d\u5386\u5b8c\u6574\u4e2a\u6570\u636e\u7ed3\u6784\u3002

    \u66b4\u529b\u641c\u7d22\u7684\u4f18\u70b9\u662f\u7b80\u5355\u4e14\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u505a\u9884\u5904\u7406\u548c\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\u3002

    \u7136\u800c\uff0c\u6b64\u7c7b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u5143\u7d20\u6570\u91cf\uff0c\u56e0\u6b64\u5728\u6570\u636e\u91cf\u8f83\u5927\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u8f83\u5dee\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9002\u5e94\u641c\u7d22","text":"

    \u81ea\u9002\u5e94\u641c\u7d22\u5229\u7528\u6570\u636e\u7684\u7279\u6709\u5c5e\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u6765\u4f18\u5316\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ece\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

    • \u201c\u4e8c\u5206\u67e5\u627e\u201d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\u5b9e\u73b0\u9ad8\u6548\u67e5\u627e\uff0c\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002
    • \u201c\u54c8\u5e0c\u67e5\u627e\u201d\u5229\u7528\u54c8\u5e0c\u8868\u5c06\u641c\u7d22\u6570\u636e\u548c\u76ee\u6807\u6570\u636e\u5efa\u7acb\u4e3a\u952e\u503c\u5bf9\u6620\u5c04\uff0c\u4ece\u800c\u5b9e\u73b0\u67e5\u8be2\u64cd\u4f5c\u3002
    • \u201c\u6811\u67e5\u627e\u201d\u5728\u7279\u5b9a\u7684\u6811\u7ed3\u6784\uff08\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\uff09\u4e2d\uff0c\u57fa\u4e8e\u6bd4\u8f83\u8282\u70b9\u503c\u6765\u5feb\u901f\u6392\u9664\u8282\u70b9\uff0c\u4ece\u800c\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

    \u6b64\u7c7b\u7b97\u6cd5\u7684\u4f18\u70b9\u662f\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u7136\u800c\uff0c\u4f7f\u7528\u8fd9\u4e9b\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u67e5\u627e\u9700\u8981\u9884\u5148\u5bf9\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\uff0c\u54c8\u5e0c\u67e5\u627e\u548c\u6811\u67e5\u627e\u90fd\u9700\u8981\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u7ef4\u62a4\u8fd9\u4e9b\u6570\u636e\u7ed3\u6784\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u5f00\u9500\u3002

    Tip

    \u81ea\u9002\u5e94\u641c\u7d22\u7b97\u6cd5\u5e38\u88ab\u79f0\u4e3a\u67e5\u627e\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u4e8e\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u68c0\u7d22\u76ee\u6807\u5143\u7d20\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u7d22\u65b9\u6cd5\u9009\u53d6","text":"

    \u7ed9\u5b9a\u5927\u5c0f\u4e3a \\(n\\) \u7684\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u7ebf\u6027\u641c\u7d22\u3001\u4e8c\u5206\u67e5\u627e\u3001\u6811\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u7b49\u591a\u79cd\u65b9\u6cd5\u4ece\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\u3002\u5404\u4e2a\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u56fe 10-11 \u6240\u793a\u3002

    \u56fe 10-11 \u00a0 \u591a\u79cd\u641c\u7d22\u7b56\u7565

    \u4e0a\u8ff0\u51e0\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u4e0e\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

    \u8868 10-1 \u00a0 \u67e5\u627e\u7b97\u6cd5\u6548\u7387\u5bf9\u6bd4

    \u7ebf\u6027\u641c\u7d22 \u4e8c\u5206\u67e5\u627e \u6811\u67e5\u627e \u54c8\u5e0c\u67e5\u627e \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u989d\u5916\u7a7a\u95f4 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u6570\u636e\u9884\u5904\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6811 \\(O(n \\log n)\\) \u5efa\u54c8\u5e0c\u8868 \\(O(n)\\) \u6570\u636e\u662f\u5426\u6709\u5e8f \u65e0\u5e8f \u6709\u5e8f \u6709\u5e8f \u65e0\u5e8f

    \u641c\u7d22\u7b97\u6cd5\u7684\u9009\u62e9\u8fd8\u53d6\u51b3\u4e8e\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u4e0e\u66f4\u65b0\u9891\u7387\u7b49\u3002

    \u7ebf\u6027\u641c\u7d22

    • \u901a\u7528\u6027\u8f83\u597d\uff0c\u65e0\u987b\u4efb\u4f55\u6570\u636e\u9884\u5904\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u4eec\u4ec5\u9700\u67e5\u8be2\u4e00\u6b21\u6570\u636e\uff0c\u90a3\u4e48\u5176\u4ed6\u4e09\u79cd\u65b9\u6cd5\u7684\u6570\u636e\u9884\u5904\u7406\u7684\u65f6\u95f4\u6bd4\u7ebf\u6027\u641c\u7d22\u7684\u65f6\u95f4\u8fd8\u8981\u66f4\u957f\u3002
    • \u9002\u7528\u4e8e\u4f53\u91cf\u8f83\u5c0f\u7684\u6570\u636e\uff0c\u6b64\u60c5\u51b5\u4e0b\u65f6\u95f4\u590d\u6742\u5ea6\u5bf9\u6548\u7387\u5f71\u54cd\u8f83\u5c0f\u3002
    • \u9002\u7528\u4e8e\u6570\u636e\u66f4\u65b0\u9891\u7387\u8f83\u9ad8\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u8be5\u65b9\u6cd5\u4e0d\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u4efb\u4f55\u989d\u5916\u7ef4\u62a4\u3002

    \u4e8c\u5206\u67e5\u627e

    • \u9002\u7528\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u6548\u7387\u8868\u73b0\u7a33\u5b9a\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002
    • \u6570\u636e\u91cf\u4e0d\u80fd\u8fc7\u5927\uff0c\u56e0\u4e3a\u5b58\u50a8\u6570\u7ec4\u9700\u8981\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    • \u4e0d\u9002\u7528\u4e8e\u9ad8\u9891\u589e\u5220\u6570\u636e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u7ef4\u62a4\u6709\u5e8f\u6570\u7ec4\u7684\u5f00\u9500\u8f83\u5927\u3002

    \u54c8\u5e0c\u67e5\u627e

    • \u9002\u5408\u5bf9\u67e5\u8be2\u6027\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u573a\u666f\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002
    • \u4e0d\u9002\u5408\u9700\u8981\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u65e0\u6cd5\u7ef4\u62a4\u6570\u636e\u7684\u6709\u5e8f\u6027\u3002
    • \u5bf9\u54c8\u5e0c\u51fd\u6570\u548c\u54c8\u5e0c\u51b2\u7a81\u5904\u7406\u7b56\u7565\u7684\u4f9d\u8d56\u6027\u8f83\u9ad8\uff0c\u5177\u6709\u8f83\u5927\u7684\u6027\u80fd\u52a3\u5316\u98ce\u9669\u3002
    • \u4e0d\u9002\u5408\u6570\u636e\u91cf\u8fc7\u5927\u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u9700\u8981\u989d\u5916\u7a7a\u95f4\u6765\u6700\u5927\u7a0b\u5ea6\u5730\u51cf\u5c11\u51b2\u7a81\uff0c\u4ece\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8be2\u6027\u80fd\u3002

    \u6811\u67e5\u627e

    • \u9002\u7528\u4e8e\u6d77\u91cf\u6570\u636e\uff0c\u56e0\u4e3a\u6811\u8282\u70b9\u5728\u5185\u5b58\u4e2d\u662f\u5206\u6563\u5b58\u50a8\u7684\u3002
    • \u9002\u5408\u9700\u8981\u7ef4\u62a4\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\u3002
    • \u5728\u6301\u7eed\u589e\u5220\u8282\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u4ea7\u751f\u503e\u659c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • \u82e5\u4f7f\u7528 AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u5219\u5404\u9879\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a33\u5b9a\u8fd0\u884c\uff0c\u4f46\u7ef4\u62a4\u6811\u5e73\u8861\u7684\u64cd\u4f5c\u4f1a\u589e\u52a0\u989d\u5916\u7684\u5f00\u9500\u3002
    "},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7ed3","text":"
    • \u4e8c\u5206\u67e5\u627e\u4f9d\u8d56\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u5faa\u73af\u9010\u6b65\u7f29\u51cf\u4e00\u534a\u641c\u7d22\u533a\u95f4\u6765\u8fdb\u884c\u67e5\u627e\u3002\u5b83\u8981\u6c42\u8f93\u5165\u6570\u636e\u6709\u5e8f\uff0c\u4e14\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u6216\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
    • \u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u6570\u636e\u3002\u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\uff0c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u548c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u9002\u7528\u4e8e\u56fe\u548c\u6811\u3002\u6b64\u7c7b\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\uff0c\u4f46\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u8f83\u9ad8\u3002
    • \u54c8\u5e0c\u67e5\u627e\u3001\u6811\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u5c5e\u4e8e\u9ad8\u6548\u641c\u7d22\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002\u6b64\u7c7b\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u501f\u52a9\u989d\u5916\u6570\u636e\u7ed3\u6784\u3002
    • \u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5bf9\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u548c\u66f4\u65b0\u9891\u7387\u7b49\u56e0\u7d20\u8fdb\u884c\u5177\u4f53\u5206\u6790\uff0c\u4ece\u800c\u9009\u62e9\u5408\u9002\u7684\u641c\u7d22\u65b9\u6cd5\u3002
    • \u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u5c0f\u578b\u6216\u9891\u7e41\u66f4\u65b0\u7684\u6570\u636e\uff1b\u4e8c\u5206\u67e5\u627e\u9002\u7528\u4e8e\u5927\u578b\u3001\u6392\u5e8f\u7684\u6570\u636e\uff1b\u54c8\u5e0c\u67e5\u627e\u9002\u7528\u4e8e\u5bf9\u67e5\u8be2\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u4e14\u65e0\u987b\u8303\u56f4\u67e5\u8be2\u7684\u6570\u636e\uff1b\u6811\u67e5\u627e\u9002\u7528\u4e8e\u9700\u8981\u7ef4\u62a4\u987a\u5e8f\u548c\u652f\u6301\u8303\u56f4\u67e5\u8be2\u7684\u5927\u578b\u52a8\u6001\u6570\u636e\u3002
    • \u7528\u54c8\u5e0c\u67e5\u627e\u66ff\u6362\u7ebf\u6027\u67e5\u627e\u662f\u4e00\u79cd\u5e38\u7528\u7684\u4f18\u5316\u8fd0\u884c\u65f6\u95f4\u7684\u7b56\u7565\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
    "},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

    Abstract

    \u6392\u5e8f\u72b9\u5982\u4e00\u628a\u5c06\u6df7\u4e71\u53d8\u4e3a\u79e9\u5e8f\u7684\u9b54\u6cd5\u94a5\u5319\uff0c\u4f7f\u6211\u4eec\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u4e0e\u5904\u7406\u6570\u636e\u3002

    \u65e0\u8bba\u662f\u7b80\u5355\u7684\u5347\u5e8f\uff0c\u8fd8\u662f\u590d\u6742\u7684\u5206\u7c7b\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u4eec\u5c55\u793a\u4e86\u6570\u636e\u7684\u548c\u8c10\u7f8e\u611f\u3002

    "},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5
    • 11.2 \u00a0 \u9009\u62e9\u6392\u5e8f
    • 11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f
    • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
    • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
    • 11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f
    • 11.7 \u00a0 \u5806\u6392\u5e8f
    • 11.8 \u00a0 \u6876\u6392\u5e8f
    • 11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f
    • 11.10 \u00a0 \u57fa\u6570\u6392\u5e8f
    • 11.11 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

    \u5192\u6ce1\u6392\u5e8f\uff08bubble sort\uff09\u901a\u8fc7\u8fde\u7eed\u5730\u6bd4\u8f83\u4e0e\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u5b9e\u73b0\u6392\u5e8f\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u6c14\u6ce1\u4ece\u5e95\u90e8\u5347\u5230\u9876\u90e8\u4e00\u6837\uff0c\u56e0\u6b64\u5f97\u540d\u5192\u6ce1\u6392\u5e8f\u3002

    \u5982\u56fe 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u8fc7\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6765\u6a21\u62df\uff1a\u4ece\u6570\u7ec4\u6700\u5de6\u7aef\u5f00\u59cb\u5411\u53f3\u904d\u5386\uff0c\u4f9d\u6b21\u6bd4\u8f83\u76f8\u90bb\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u6362\u4e8c\u8005\u3002\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6700\u5927\u7684\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u5230\u6570\u7ec4\u7684\u6700\u53f3\u7aef\u3002

    <1><2><3><4><5><6><7>

    \u56fe 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u5192\u6ce1

    "},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6b65\u9aa4\u5982\u56fe 11-5 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5bf9 \\(n\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    2. \u63a5\u4e0b\u6765\uff0c\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u201c\u5192\u6ce1\u201d\u540e\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    4. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002

    \u56fe 11-5 \u00a0 \u5192\u6ce1\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
    bubble_sort.cpp
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.java
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.cs
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.go
    /* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
    bubble_sort.js
    /* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.ts
    /* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.dart
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n      }\n    }\n  }\n}\n
    bubble_sort.rs
    /* \u5192\u6ce1\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swap(j, j + 1);\n            }\n        }\n    }\n}\n
    bubble_sort.c
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n            }\n        }\n    }\n}\n
    bubble_sort.kt
    /* \u5192\u6ce1\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n            }\n        }\n    }\n}\n
    bubble_sort.rb
    ### \u5192\u6ce1\u6392\u5e8f ###\ndef bubble_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (n - 1).downto(1)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n      end\n    end\n  end\nend\n
    bubble_sort.zig
    // \u5192\u6ce1\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u4f18\u5316","text":"

    \u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u201c\u5192\u6ce1\u201d\u4e2d\u6ca1\u6709\u6267\u884c\u4efb\u4f55\u4ea4\u6362\u64cd\u4f5c\uff0c\u8bf4\u660e\u6570\u7ec4\u5df2\u7ecf\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7ed3\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d flag \u6765\u76d1\u6d4b\u8fd9\u79cd\u60c5\u51b5\uff0c\u4e00\u65e6\u51fa\u73b0\u5c31\u7acb\u5373\u8fd4\u56de\u3002

    \u7ecf\u8fc7\u4f18\u5316\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(n^2)\\) \uff1b\u4f46\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u53ef\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
    bubble_sort.cpp
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.java
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.cs
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.go
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.js
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.ts
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.dart
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
    bubble_sort.rs
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swap(j, j + 1);\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
    bubble_sort.c
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n                flag = true;\n            }\n        }\n        if (!flag)\n            break;\n    }\n}\n
    bubble_sort.kt
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.rb
    ### \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09###\ndef bubble_sort_with_flag(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (n - 1).downto(1)\n    flag = false # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n        flag = true # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n      end\n    end\n\n    break unless flag # \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  end\nend\n
    bubble_sort.zig
    // \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true;\n            }\n        }\n        if (!flag) break;   // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5404\u8f6e\u201c\u5192\u6ce1\u201d\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u603b\u548c\u4e3a \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\u3002
    "},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

    \u524d\u8ff0\u51e0\u79cd\u6392\u5e8f\u7b97\u6cd5\u90fd\u5c5e\u4e8e\u201c\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u901a\u8fc7\u6bd4\u8f83\u5143\u7d20\u95f4\u7684\u5927\u5c0f\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u6b64\u7c7b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u65e0\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u63a2\u8ba8\u51e0\u79cd\u201c\u975e\u6bd4\u8f83\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u7ebf\u6027\u9636\u3002

    \u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u987a\u5e8f\u7684\u6876\uff0c\u6bcf\u4e2a\u6876\u5bf9\u5e94\u4e00\u4e2a\u6570\u636e\u8303\u56f4\uff0c\u5c06\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff1b\u7136\u540e\uff0c\u5728\u6bcf\u4e2a\u6876\u5185\u90e8\u5206\u522b\u6267\u884c\u6392\u5e8f\uff1b\u6700\u7ec8\u6309\u7167\u6876\u7684\u987a\u5e8f\u5c06\u6240\u6709\u6570\u636e\u5408\u5e76\u3002

    "},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8003\u8651\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u5176\u5143\u7d20\u662f\u8303\u56f4 \\([0, 1)\\) \u5185\u7684\u6d6e\u70b9\u6570\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-13 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316 \\(k\\) \u4e2a\u6876\uff0c\u5c06 \\(n\\) \u4e2a\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u4e2a\u6876\u4e2d\u3002
    2. \u5bf9\u6bcf\u4e2a\u6876\u5206\u522b\u6267\u884c\u6392\u5e8f\uff08\u8fd9\u91cc\u91c7\u7528\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff09\u3002
    3. \u6309\u7167\u6876\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u5408\u5e76\u7ed3\u679c\u3002

    \u56fe 11-13 \u00a0 \u6876\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bucket_sort.py
    def bucket_sort(nums: list[float]):\n    \"\"\"\u6876\u6392\u5e8f\"\"\"\n    # \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums:\n        # \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i = int(num * k)\n        # \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    # 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i = 0\n    for bucket in buckets:\n        for num in bucket:\n            nums[i] = num\n            i += 1\n
    bucket_sort.cpp
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(vector<float> &nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = num * k;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (vector<float> &bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.java
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.length / 2;\n    List<List<Float>> buckets = new ArrayList<>();\n    for (int i = 0; i < k; i++) {\n        buckets.add(new ArrayList<>());\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int) (num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (List<Float> bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.cs
    /* \u6876\u6392\u5e8f */\nvoid BucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.Length / 2;\n    List<List<float>> buckets = [];\n    for (int i = 0; i < k; i++) {\n        buckets.Add([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int)(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int j = 0;\n    foreach (List<float> bucket in buckets) {\n        foreach (float num in bucket) {\n            nums[j++] = num;\n        }\n    }\n}\n
    bucket_sort.go
    /* \u6876\u6392\u5e8f */\nfunc bucketSort(nums []float64) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k := len(nums) / 2\n    buckets := make([][]float64, k)\n    for i := 0; i < k; i++ {\n        buckets[i] = make([]float64, 0)\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i := int(num * float64(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5185\u7f6e\u5207\u7247\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i := 0\n    for _, bucket := range buckets {\n        for _, num := range bucket {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
    bucket_sort.swift
    /* \u6876\u6392\u5e8f */\nfunc bucketSort(nums: inout [Double]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = nums.startIndex\n    for bucket in buckets {\n        for num in bucket {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
    bucket_sort.js
    /* \u6876\u6392\u5e8f */\nfunction bucketSort(nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.ts
    /* \u6876\u6392\u5e8f */\nfunction bucketSort(nums: number[]): void {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets: number[][] = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.dart
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(List<double> nums) {\n  // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 _num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c06 _num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n  int i = 0;\n  for (List<double> bucket in buckets) {\n    for (double _num in bucket) {\n      nums[i++] = _num;\n    }\n  }\n}\n
    bucket_sort.rs
    /* \u6876\u6392\u5e8f */\nfn bucket_sort(nums: &mut [f64]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for &num in nums.iter() {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let mut i = 0;\n    for bucket in buckets.iter() {\n        for &num in bucket.iter() {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    bucket_sort.c
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8bb0\u5f55\u6bcf\u4e2a\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52a8\u6001\u6570\u7ec4\u7684\u6570\u7ec4\uff08\u6876\uff09\n    // \u4e3a\u6bcf\u4e2a\u6876\u9884\u5206\u914d\u8db3\u591f\u7684\u7a7a\u95f4\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (int i = 0; i < n; ++i) {\n        int idx = (int)(nums[i] * k);\n        buckets[idx][sizes[idx]++] = nums[i];\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u5e76\u6392\u5e8f\u540e\u7684\u6876\n    int idx = 0;\n    for (int i = 0; i < k; ++i) {\n        for (int j = 0; j < sizes[i]; ++j) {\n            nums[idx++] = buckets[i][j];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(buckets[i]);\n    }\n}\n
    bucket_sort.kt
    /* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    val k = nums.size / 2\n    val buckets = mutableListOf<MutableList<Float>>()\n    for (i in 0..<k) {\n        buckets.add(mutableListOf())\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = 0\n    for (bucket in buckets) {\n        for (num in bucket) {\n            nums[i++] = num\n        }\n    }\n}\n
    bucket_sort.rb
    ### \u6876\u6392\u5e8f ###\ndef bucket_sort(nums)\n  # \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n  k = nums.length / 2\n  buckets = Array.new(k) { [] }\n\n  # 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n  nums.each do |num|\n    # \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n    i = (num * k).to_i\n    # \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n    buckets[i] << num\n  end\n\n  # 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n  buckets.each do |bucket|\n    # \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n    bucket.sort!\n  end\n\n  # 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n  i = 0\n  buckets.each do |bucket|\n    bucket.each do |num|\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    bucket_sort.zig
    [class]{}-[func]{bucketSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

    \u6876\u6392\u5e8f\u9002\u7528\u4e8e\u5904\u7406\u4f53\u91cf\u5f88\u5927\u7684\u6570\u636e\u3002\u4f8b\u5982\uff0c\u8f93\u5165\u6570\u636e\u5305\u542b 100 \u4e07\u4e2a\u5143\u7d20\uff0c\u7531\u4e8e\u7a7a\u95f4\u9650\u5236\uff0c\u7cfb\u7edf\u5185\u5b58\u65e0\u6cd5\u4e00\u6b21\u6027\u52a0\u8f7d\u6240\u6709\u6570\u636e\u3002\u6b64\u65f6\uff0c\u53ef\u4ee5\u5c06\u6570\u636e\u5206\u6210 1000 \u4e2a\u6876\uff0c\u7136\u540e\u5206\u522b\u5bf9\u6bcf\u4e2a\u6876\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u7ed3\u679c\u5408\u5e76\u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\) \uff1a\u5047\u8bbe\u5143\u7d20\u5728\u5404\u4e2a\u6876\u5185\u5e73\u5747\u5206\u5e03\uff0c\u90a3\u4e48\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u6570\u91cf\u4e3a \\(\\frac{n}{k}\\) \u3002\u5047\u8bbe\u6392\u5e8f\u5355\u4e2a\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u65f6\u95f4\uff0c\u5219\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u65f6\u95f4\u3002\u5f53\u6876\u6570\u91cf \\(k\\) \u6bd4\u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5219\u8d8b\u5411\u4e8e \\(O(n)\\) \u3002\u5408\u5e76\u7ed3\u679c\u65f6\u9700\u8981\u904d\u5386\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8d39 \\(O(n + k)\\) \u65f6\u95f4\u3002
    • \u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u6570\u636e\u88ab\u5206\u914d\u5230\u4e00\u4e2a\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8be5\u6876\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u6876\u6392\u5e8f\u662f\u5426\u7a33\u5b9a\u53d6\u51b3\u4e8e\u6392\u5e8f\u6876\u5185\u5143\u7d20\u7684\u7b97\u6cd5\u662f\u5426\u7a33\u5b9a\u3002
    "},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5b9e\u73b0\u5e73\u5747\u5206\u914d","text":"

    \u6876\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7406\u8bba\u4e0a\u53ef\u4ee5\u8fbe\u5230 \\(O(n)\\) \uff0c\u5173\u952e\u5728\u4e8e\u5c06\u5143\u7d20\u5747\u5300\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u56e0\u4e3a\u5b9e\u9645\u6570\u636e\u5f80\u5f80\u4e0d\u662f\u5747\u5300\u5206\u5e03\u7684\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u60f3\u8981\u5c06\u6dd8\u5b9d\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u4ef7\u683c\u8303\u56f4\u5e73\u5747\u5206\u914d\u5230 10 \u4e2a\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u4ef7\u683c\u5206\u5e03\u4e0d\u5747\uff0c\u4f4e\u4e8e 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u4e8e 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c06\u4ef7\u683c\u533a\u95f4\u5e73\u5747\u5212\u5206\u4e3a 10 \u4e2a\uff0c\u5404\u4e2a\u6876\u4e2d\u7684\u5546\u54c1\u6570\u91cf\u5dee\u8ddd\u4f1a\u975e\u5e38\u5927\u3002

    \u4e3a\u5b9e\u73b0\u5e73\u5747\u5206\u914d\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u8bbe\u5b9a\u4e00\u6761\u5927\u81f4\u7684\u5206\u754c\u7ebf\uff0c\u5c06\u6570\u636e\u7c97\u7565\u5730\u5206\u5230 3 \u4e2a\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u6bd5\u540e\uff0c\u518d\u5c06\u5546\u54c1\u8f83\u591a\u7684\u6876\u7ee7\u7eed\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6570\u91cf\u5927\u81f4\u76f8\u7b49\u3002

    \u5982\u56fe 11-14 \u6240\u793a\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u521b\u5efa\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u76ee\u6807\u662f\u8ba9\u53f6\u8282\u70b9\u7684\u503c\u5c3d\u53ef\u80fd\u5e73\u5747\u3002\u5f53\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f6e\u5c06\u6570\u636e\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u5177\u4f53\u5212\u5206\u65b9\u5f0f\u53ef\u6839\u636e\u6570\u636e\u7279\u70b9\u7075\u6d3b\u9009\u62e9\u3002

    \u56fe 11-14 \u00a0 \u9012\u5f52\u5212\u5206\u6876

    \u5982\u679c\u6211\u4eec\u63d0\u524d\u77e5\u9053\u5546\u54c1\u4ef7\u683c\u7684\u6982\u7387\u5206\u5e03\uff0c\u5219\u53ef\u4ee5\u6839\u636e\u6570\u636e\u6982\u7387\u5206\u5e03\u8bbe\u7f6e\u6bcf\u4e2a\u6876\u7684\u4ef7\u683c\u5206\u754c\u7ebf\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u636e\u5206\u5e03\u5e76\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7edf\u8ba1\uff0c\u4e5f\u53ef\u4ee5\u6839\u636e\u6570\u636e\u7279\u70b9\u91c7\u7528\u67d0\u79cd\u6982\u7387\u6a21\u578b\u8fdb\u884c\u8fd1\u4f3c\u3002

    \u5982\u56fe 11-15 \u6240\u793a\uff0c\u6211\u4eec\u5047\u8bbe\u5546\u54c1\u4ef7\u683c\u670d\u4ece\u6b63\u6001\u5206\u5e03\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8bbe\u5b9a\u4ef7\u683c\u533a\u95f4\uff0c\u4ece\u800c\u5c06\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\u3002

    \u56fe 11-15 \u00a0 \u6839\u636e\u6982\u7387\u5206\u5e03\u5212\u5206\u6876

    "},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f","text":"

    \u8ba1\u6570\u6392\u5e8f\uff08counting sort\uff09\u901a\u8fc7\u7edf\u8ba1\u5143\u7d20\u6570\u91cf\u6765\u5b9e\u73b0\u6392\u5e8f\uff0c\u901a\u5e38\u5e94\u7528\u4e8e\u6574\u6570\u6570\u7ec4\u3002

    "},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7b80\u5355\u5b9e\u73b0","text":"

    \u5148\u6765\u770b\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u3002\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8d1f\u6574\u6570\u201d\uff0c\u8ba1\u6570\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-16 \u6240\u793a\u3002

    1. \u904d\u5386\u6570\u7ec4\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6570\u5b57\uff0c\u8bb0\u4e3a \\(m\\) \uff0c\u7136\u540e\u521b\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(m + 1\\) \u7684\u8f85\u52a9\u6570\u7ec4 counter \u3002
    2. \u501f\u52a9 counter \u7edf\u8ba1 nums \u4e2d\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\uff0c\u5176\u4e2d counter[num] \u5bf9\u5e94\u6570\u5b57 num \u7684\u51fa\u73b0\u6b21\u6570\u3002\u7edf\u8ba1\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u904d\u5386 nums\uff08\u8bbe\u5f53\u524d\u6570\u5b57\u4e3a num\uff09\uff0c\u6bcf\u8f6e\u5c06 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
    3. \u7531\u4e8e counter \u7684\u5404\u4e2a\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u5f53\u4e8e\u6240\u6709\u6570\u5b57\u5df2\u7ecf\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u904d\u5386 counter \uff0c\u6839\u636e\u5404\u6570\u5b57\u51fa\u73b0\u6b21\u6570\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

    \u56fe 11-16 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    i = 0\n    for num in range(m + 1):\n        for _ in range(counter[num]):\n            nums[i] = num\n            i += 1\n
    counting_sort.cpp
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.java
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.cs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.go
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    for i, num := 0, 0; num < m+1; num++ {\n        for j := 0; j < counter[num]; j++ {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
    counting_sort.swift
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for num in 0 ..< m + 1 {\n        for _ in 0 ..< counter[num] {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
    counting_sort.js
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.ts
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.dart
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n  int i = 0;\n  for (int _num = 0; _num < m + 1; _num++) {\n    for (int j = 0; j < counter[_num]; j++, i++) {\n      nums[i] = _num;\n    }\n  }\n}\n
    counting_sort.rs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.iter().max().unwrap();\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m as usize + 1];\n    for &num in nums.iter() {\n        counter[num as usize] += 1;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let mut i = 0;\n    for num in 0..m + 1 {\n        for _ in 0..counter[num as usize] {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    counting_sort.c
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n    // 4. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for (num in 0..<m + 1) {\n        var j = 0\n        while (j < counter[num]) {\n            nums[i] = num\n            j++\n            i++\n        }\n    }\n}\n
    counting_sort.rb
    ### \u8ba1\u6570\u6392\u5e8f ###\ndef counting_sort_naive(nums)\n  # \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\n  # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  m = 0\n  nums.each { |num| m = [m, num].max }\n  # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n  counter = Array.new(m + 1, 0)\n  nums.each { |num| counter[num] += 1 }\n  # 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n  i = 0\n  for num in 0...(m + 1)\n    (0...counter[num]).each do\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    counting_sort.zig
    [class]{}-[func]{countingSortNaive}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u8ba1\u6570\u6392\u5e8f\u4e0e\u6876\u6392\u5e8f\u7684\u8054\u7cfb

    \u4ece\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u6570\u6392\u5e8f\u4e2d\u7684\u8ba1\u6570\u6570\u7ec4 counter \u7684\u6bcf\u4e2a\u7d22\u5f15\u89c6\u4e3a\u4e00\u4e2a\u6876\uff0c\u5c06\u7edf\u8ba1\u6570\u91cf\u7684\u8fc7\u7a0b\u770b\u4f5c\u5c06\u5404\u4e2a\u5143\u7d20\u5206\u914d\u5230\u5bf9\u5e94\u7684\u6876\u4e2d\u3002\u672c\u8d28\u4e0a\uff0c\u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u6570\u636e\u4e0b\u7684\u4e00\u4e2a\u7279\u4f8b\u3002

    "},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5b9e\u73b0","text":"

    \u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u5982\u679c\u8f93\u5165\u6570\u636e\u662f\u5bf9\u8c61\uff0c\u4e0a\u8ff0\u6b65\u9aa4 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u662f\u5546\u54c1\u5bf9\u8c61\uff0c\u6211\u4eec\u60f3\u6309\u7167\u5546\u54c1\u4ef7\u683c\uff08\u7c7b\u7684\u6210\u5458\u53d8\u91cf\uff09\u5bf9\u5546\u54c1\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u7b97\u6cd5\u53ea\u80fd\u7ed9\u51fa\u4ef7\u683c\u7684\u6392\u5e8f\u7ed3\u679c\u3002

    \u90a3\u4e48\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u6570\u636e\u7684\u6392\u5e8f\u7ed3\u679c\u5462\uff1f\u6211\u4eec\u9996\u5148\u8ba1\u7b97 counter \u7684\u201c\u524d\u7f00\u548c\u201d\u3002\u987e\u540d\u601d\u4e49\uff0c\u7d22\u5f15 i \u5904\u7684\u524d\u7f00\u548c prefix[i] \u7b49\u4e8e\u6570\u7ec4\u524d i \u4e2a\u5143\u7d20\u4e4b\u548c\uff1a

    \\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

    \u524d\u7f00\u548c\u5177\u6709\u660e\u786e\u7684\u610f\u4e49\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7ed3\u679c\u6570\u7ec4 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\u3002\u8fd9\u4e2a\u4fe1\u606f\u975e\u5e38\u5173\u952e\uff0c\u56e0\u4e3a\u5b83\u544a\u8bc9\u6211\u4eec\u5404\u4e2a\u5143\u7d20\u5e94\u8be5\u51fa\u73b0\u5728\u7ed3\u679c\u6570\u7ec4\u7684\u54ea\u4e2a\u4f4d\u7f6e\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5012\u5e8f\u904d\u5386\u539f\u6570\u7ec4 nums \u7684\u6bcf\u4e2a\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

    1. \u5c06 num \u586b\u5165\u6570\u7ec4 res \u7684\u7d22\u5f15 prefix[num] - 1 \u5904\u3002
    2. \u4ee4\u524d\u7f00\u548c prefix[num] \u51cf\u5c0f \\(1\\) \uff0c\u4ece\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

    \u904d\u5386\u5b8c\u6210\u540e\uff0c\u6570\u7ec4 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7ed3\u679c\uff0c\u6700\u540e\u4f7f\u7528 res \u8986\u76d6\u539f\u6570\u7ec4 nums \u5373\u53ef\u3002\u56fe 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b\u3002

    <1><2><3><4><5><6><7><8>

    \u56fe 11-17 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6b65\u9aa4

    \u8ba1\u6570\u6392\u5e8f\u7684\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    # \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n = len(nums)\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        num = nums[i]\n        res[counter[num] - 1] = num  # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1  # \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n
    counting_sort.cpp
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.size();\n    vector<int> res(n);\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums = res;\n}\n
    counting_sort.java
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.cs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.Length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.go
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    copy(nums, res)\n}\n
    counting_sort.swift
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1 // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.js
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res = new Array(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.ts
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res: number[] = new Array<number>(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.dart
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n  // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n  int n = nums.length;\n  List<int> res = List.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int _num = nums[i];\n    res[counter[_num] - 1] = _num; // \u5c06 _num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n    counter[_num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n  nums.setAll(0, res);\n}\n
    counting_sort.rs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.iter().max().unwrap() as usize;\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m + 1];\n    for &num in nums.iter() {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0..m {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    let n = nums.len();\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let num = nums[i];\n        res[counter[num as usize] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums.copy_from_slice(&res)\n}\n
    counting_sort.c
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int *res = malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    val n = nums.size\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]-- // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.rb
    ### \u8ba1\u6570\u6392\u5e8f ###\ndef counting_sort(nums)\n  # \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\n  # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  m = nums.max\n  # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n  counter = Array.new(m + 1, 0)\n  nums.each { |num| counter[num] += 1 }\n  # 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n  # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n  (0...m).each { |i| counter[i + 1] += counter[i] }\n  # 4. \u5012\u5e8f\u904d\u5386 nums, \u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n  # \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n  n = nums.length\n  res = Array.new(n, 0)\n  (n - 1).downto(0).each do |i|\n    num = nums[i]\n    res[counter[num] - 1] = num # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n    counter[num] -= 1 # \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n  end\n  # \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\n
    counting_sort.zig
    [class]{}-[func]{countingSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u6d89\u53ca\u904d\u5386 nums \u548c\u904d\u5386 counter \uff0c\u90fd\u4f7f\u7528\u7ebf\u6027\u65f6\u95f4\u3002\u4e00\u822c\u60c5\u51b5\u4e0b \\(n \\gg m\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u4e8e \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u987a\u5e8f\u662f\u201c\u4ece\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u904d\u5386 nums \u53ef\u4ee5\u907f\u514d\u6539\u53d8\u76f8\u7b49\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b9e\u73b0\u7a33\u5b9a\u6392\u5e8f\u3002\u5b9e\u9645\u4e0a\uff0c\u6b63\u5e8f\u904d\u5386 nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\uff0c\u4f46\u7ed3\u679c\u662f\u975e\u7a33\u5b9a\u7684\u3002
    "},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u5c40\u9650\u6027","text":"

    \u770b\u5230\u8fd9\u91cc\uff0c\u4f60\u4e5f\u8bb8\u4f1a\u89c9\u5f97\u8ba1\u6570\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u4ec5\u901a\u8fc7\u7edf\u8ba1\u6570\u91cf\u5c31\u53ef\u4ee5\u5b9e\u73b0\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\u76f8\u5bf9\u8f83\u4e3a\u4e25\u683c\u3002

    \u8ba1\u6570\u6392\u5e8f\u53ea\u9002\u7528\u4e8e\u975e\u8d1f\u6574\u6570\u3002\u82e5\u60f3\u5c06\u5176\u7528\u4e8e\u5176\u4ed6\u7c7b\u578b\u7684\u6570\u636e\uff0c\u9700\u8981\u786e\u4fdd\u8fd9\u4e9b\u6570\u636e\u53ef\u4ee5\u8f6c\u6362\u4e3a\u975e\u8d1f\u6574\u6570\uff0c\u5e76\u4e14\u5728\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u4e0d\u80fd\u6539\u53d8\u5404\u4e2a\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u5927\u5c0f\u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u5bf9\u4e8e\u5305\u542b\u8d1f\u6570\u7684\u6574\u6570\u6570\u7ec4\uff0c\u53ef\u4ee5\u5148\u7ed9\u6240\u6709\u6570\u5b57\u52a0\u4e0a\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5168\u90e8\u6570\u5b57\u8f6c\u5316\u4e3a\u6b63\u6570\uff0c\u6392\u5e8f\u5b8c\u6210\u540e\u518d\u8f6c\u6362\u56de\u53bb\u3002

    \u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5219\u4f1a\u5360\u7528\u8fc7\u591a\u7a7a\u95f4\u3002\u800c\u5f53 \\(n \\ll m\\) \u65f6\uff0c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u7b97\u6cd5\u8fd8\u8981\u6162\u3002

    "},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u6392\u5e8f","text":"

    Tip

    \u9605\u8bfb\u672c\u8282\u524d\uff0c\u8bf7\u786e\u4fdd\u5df2\u5b66\u5b8c\u201c\u5806\u201c\u7ae0\u8282\u3002

    \u5806\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5806\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\u7684\u9ad8\u6548\u6392\u5e8f\u7b97\u6cd5\u3002\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5df2\u7ecf\u5b66\u8fc7\u7684\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\u5806\u6392\u5e8f\u3002

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5c0f\u9876\u5806\uff0c\u6b64\u65f6\u6700\u5c0f\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u4e0d\u65ad\u6267\u884c\u51fa\u5806\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8bb0\u5f55\u51fa\u5806\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

    \u4ee5\u4e0a\u65b9\u6cd5\u867d\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u989d\u5916\u6570\u7ec4\u6765\u4fdd\u5b58\u5f39\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f83\u6d6a\u8d39\u7a7a\u95f4\u3002\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4e00\u79cd\u66f4\u52a0\u4f18\u96c5\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002

    "},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5806\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-12 \u6240\u793a\u3002

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5927\u9876\u5806\u3002\u5b8c\u6210\u540e\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u5c06\u5806\u9876\u5143\u7d20\uff08\u7b2c\u4e00\u4e2a\u5143\u7d20\uff09\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u6700\u540e\u4e00\u4e2a\u5143\u7d20\uff09\u4ea4\u6362\u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u5806\u7684\u957f\u5ea6\u51cf \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u52a0 \\(1\\) \u3002
    3. \u4ece\u5806\u9876\u5143\u7d20\u5f00\u59cb\uff0c\u4ece\u9876\u5230\u5e95\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u5316\u540e\uff0c\u5806\u7684\u6027\u8d28\u5f97\u5230\u4fee\u590d\u3002
    4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u5faa\u73af \\(n - 1\\) \u8f6e\u540e\uff0c\u5373\u53ef\u5b8c\u6210\u6570\u7ec4\u6392\u5e8f\u3002

    Tip

    \u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u4e2a\u5f39\u51fa\u5143\u7d20\u7684\u6b65\u9aa4\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12>

    \u56fe 11-12 \u00a0 \u5806\u6392\u5e8f\u6b65\u9aa4

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u4e0e\u201c\u5806\u201d\u7ae0\u8282\u76f8\u540c\u7684\u4ece\u9876\u81f3\u5e95\u5806\u5316 sift_down() \u51fd\u6570\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u5806\u7684\u957f\u5ea6\u4f1a\u968f\u7740\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u51cf\u5c0f\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u7ed9 sift_down() \u51fd\u6570\u6dfb\u52a0\u4e00\u4e2a\u957f\u5ea6\u53c2\u6570 \\(n\\) \uff0c\u7528\u4e8e\u6307\u5b9a\u5806\u7684\u5f53\u524d\u6709\u6548\u957f\u5ea6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l = 2 * i + 1\n        r = 2 * i + 2\n        ma = i\n        if l < n and nums[l] > nums[ma]:\n            ma = l\n        if r < n and nums[r] > nums[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0)\n
    heap_sort.cpp
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.java
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.cs
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
    heap_sort.go
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l := 2*i + 1\n        r := 2*i + 2\n        ma := i\n        if l < n && (*nums)[l] > (*nums)[ma] {\n            ma = l\n        }\n        if r < n && (*nums)[r] > (*nums)[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.swift
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1\n        let r = 2 * i + 2\n        var ma = i\n        if l < n, nums[l] > nums[ma] {\n            ma = l\n        }\n        if r < n, nums[r] > nums[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        nums.swapAt(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\n        siftDown(nums: &nums, n: nums.count, i: i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
    heap_sort.js
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.ts
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.dart
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = 2 * i + 1;\n    int r = 2 * i + 2;\n    int ma = i;\n    if (l < n && nums[l] > nums[ma]) ma = l;\n    if (r < n && nums[r] > nums[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
    heap_sort.rs
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let mut ma = i;\n        if l < n && nums[l] > nums[ma] {\n            ma = l;\n        }\n        if r < n && nums[r] > nums[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        nums.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..nums.len() / 2).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in (1..nums.len()).rev() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums.swap(0, i);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
    heap_sort.c
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.kt
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = 2 * i + 1\n        val r = 2 * i + 2\n        var ma = i\n        if (l < n && nums[l] > nums[ma]) \n            ma = l\n        if (r < n && nums[r] > nums[ma]) \n            ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.rb
    ### \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(nums, n, i)\n  while true\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l = 2 * i + 1\n    r = 2 * i + 2\n    ma = i\n    ma = l if l < n && nums[l] > nums[ma]\n    ma = r if r < n && nums[r] > nums[ma]\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    nums[i], nums[ma] = nums[ma], nums[i]\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n\n### \u5806\u6392\u5e8f ###\ndef heap_sort(nums)\n  # \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  (nums.length / 2 - 1).downto(0) do |i|\n    sift_down(nums, nums.length, i)\n  end\n  # \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n  (nums.length - 1).downto(1) do |i|\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    nums[0], nums[i] = nums[i], nums[0]\n    # \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n    sift_down(nums, i, 0)\n  end\nend\n
    heap_sort.zig
    [class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5efa\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff0c\u5171\u5faa\u73af \\(n - 1\\) \u8f6e\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u4f7f\u7528 \\(O(1)\\) \u7a7a\u95f4\u3002\u5143\u7d20\u4ea4\u6362\u548c\u5806\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5806\u9876\u5143\u7d20\u548c\u5806\u5e95\u5143\u7d20\u65f6\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5bf9\u4f4d\u7f6e\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002
    "},{"location":"chapter_sorting/insertion_sort/","title":"11.4 \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

    \u63d2\u5165\u6392\u5e8f\uff08insertion sort\uff09\u662f\u4e00\u79cd\u7b80\u5355\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u4e0e\u624b\u52a8\u6574\u7406\u4e00\u526f\u724c\u7684\u8fc7\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

    \u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u5728\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u4e00\u4e2a\u57fa\u51c6\u5143\u7d20\uff0c\u5c06\u8be5\u5143\u7d20\u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u8be5\u5143\u7d20\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

    \u56fe 11-6 \u5c55\u793a\u4e86\u6570\u7ec4\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8bbe\u57fa\u51c6\u5143\u7d20\u4e3a base \uff0c\u6211\u4eec\u9700\u8981\u5c06\u4ece\u76ee\u6807\u7d22\u5f15\u5230 base \u4e4b\u95f4\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

    \u56fe 11-6 \u00a0 \u5355\u6b21\u63d2\u5165\u64cd\u4f5c

    "},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-7 \u6240\u793a\u3002

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6570\u7ec4\u7684\u7b2c 1 \u4e2a\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
    2. \u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

    \u56fe 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
    def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n
    insertion_sort.cpp
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.java
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.cs
    /* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.go
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.swift
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.js
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.ts
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.dart
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  }\n}\n
    insertion_sort.rs
    /* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.c
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
    insertion_sort.kt
    /* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u5faa\u73af: \u5df2\u6392\u5e8f\u5143\u7d20\u4e3a 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.rb
    ### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  end\nend\n
    insertion_sort.zig
    // \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    var i: usize = 1;\n    while (i < nums.len) : (i += 1) {\n        var base = nums[i];\n        var j: usize = i;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u522b\u9700\u8981\u5faa\u73af \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u6570\u636e\u65f6\uff0c\u63d2\u5165\u64cd\u4f5c\u4f1a\u63d0\u524d\u7ec8\u6b62\u3002\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u63d2\u5165\u6392\u5e8f\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f1a\u5c06\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\uff0c\u4e0d\u4f1a\u6539\u53d8\u5b83\u4eec\u7684\u987a\u5e8f\u3002
    "},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u4f18\u52bf","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u800c\u6211\u4eec\u5373\u5c06\u5b66\u4e60\u7684\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

    \u8fd9\u4e2a\u7ed3\u8bba\u4e0e\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u7684\u9002\u7528\u60c5\u51b5\u7684\u7ed3\u8bba\u7c7b\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u8fd9\u7c7b \\(O(n \\log n)\\) \u7684\u7b97\u6cd5\u5c5e\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6570\u503c\u6bd4\u8f83\u63a5\u8fd1\uff0c\u590d\u6742\u5ea6\u4e0d\u5360\u4e3b\u5bfc\u5730\u4f4d\uff0c\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u64cd\u4f5c\u6570\u91cf\u8d77\u5230\u51b3\u5b9a\u6027\u4f5c\u7528\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u91c7\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u4e3a\uff1a\u5bf9\u4e8e\u957f\u6570\u7ec4\uff0c\u91c7\u7528\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

    \u867d\u7136\u5192\u6ce1\u6392\u5e8f\u3001\u9009\u62e9\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u9891\u7387\u663e\u8457\u9ad8\u4e8e\u5192\u6ce1\u6392\u5e8f\u548c\u9009\u62e9\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u5192\u6ce1\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u4ea4\u6362\u5b9e\u73b0\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u4e34\u65f6\u53d8\u91cf\uff0c\u5171\u6d89\u53ca 3 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002\u5982\u679c\u7ed9\u5b9a\u4e00\u7ec4\u90e8\u5206\u6709\u5e8f\u7684\u6570\u636e\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9009\u62e9\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u4e0d\u7a33\u5b9a\uff0c\u65e0\u6cd5\u5e94\u7528\u4e8e\u591a\u7ea7\u6392\u5e8f\u3002
    "},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

    \u5f52\u5e76\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5305\u542b\u56fe 11-10 \u6240\u793a\u7684\u201c\u5212\u5206\u201d\u548c\u201c\u5408\u5e76\u201d\u9636\u6bb5\u3002

    1. \u5212\u5206\u9636\u6bb5\uff1a\u901a\u8fc7\u9012\u5f52\u4e0d\u65ad\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u5f00\uff0c\u5c06\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u8f6c\u6362\u4e3a\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002
    2. \u5408\u5e76\u9636\u6bb5\uff1a\u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u5212\u5206\uff0c\u5f00\u59cb\u5408\u5e76\uff0c\u6301\u7eed\u5730\u5c06\u5de6\u53f3\u4e24\u4e2a\u8f83\u77ed\u7684\u6709\u5e8f\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u8f83\u957f\u7684\u6709\u5e8f\u6570\u7ec4\uff0c\u76f4\u81f3\u7ed3\u675f\u3002

    \u56fe 11-10 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5212\u5206\u4e0e\u5408\u5e76\u9636\u6bb5

    "},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5982\u56fe 11-11 \u6240\u793a\uff0c\u201c\u5212\u5206\u9636\u6bb5\u201d\u4ece\u9876\u81f3\u5e95\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5207\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002

    1. \u8ba1\u7b97\u6570\u7ec4\u4e2d\u70b9 mid \uff0c\u9012\u5f52\u5212\u5206\u5de6\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [left, mid] \uff09\u548c\u53f3\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [mid + 1, right] \uff09\u3002
    2. \u9012\u5f52\u6267\u884c\u6b65\u9aa4 1. \uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u533a\u95f4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u3002

    \u201c\u5408\u5e76\u9636\u6bb5\u201d\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ece\u957f\u5ea6\u4e3a 1 \u7684\u5b50\u6570\u7ec4\u5f00\u59cb\u5408\u5e76\uff0c\u5408\u5e76\u9636\u6bb5\u4e2d\u7684\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u662f\u6709\u5e8f\u7684\u3002

    <1><2><3><4><5><6><7><8><9><10>

    \u56fe 11-11 \u00a0 \u5f52\u5e76\u6392\u5e8f\u6b65\u9aa4

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u5f52\u5e76\u6392\u5e8f\u4e0e\u4e8c\u53c9\u6811\u540e\u5e8f\u904d\u5386\u7684\u9012\u5f52\u987a\u5e8f\u662f\u4e00\u81f4\u7684\u3002

    • \u540e\u5e8f\u904d\u5386\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6811\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6811\uff0c\u6700\u540e\u5904\u7406\u6839\u8282\u70b9\u3002
    • \u5f52\u5e76\u6392\u5e8f\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6570\u7ec4\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6570\u7ec4\uff0c\u6700\u540e\u5904\u7406\u5408\u5e76\u3002

    \u5f52\u5e76\u6392\u5e8f\u7684\u5b9e\u73b0\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\u3002\u8bf7\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u5e76\u533a\u95f4\u4e3a [left, right] \uff0c\u800c tmp \u7684\u5bf9\u5e94\u533a\u95f4\u4e3a [0, right - left] \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
    def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\"\"\"\n    # \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    # \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid and j <= right:\n        if nums[i] <= nums[j]:\n            tmp[k] = nums[i]\n            i += 1\n        else:\n            tmp[k] = nums[j]\n            j += 1\n        k += 1\n    # \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid:\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    while j <= right:\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    # \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in range(0, len(tmp)):\n        nums[left + k] = tmp[k]\n\ndef merge_sort(nums: list[int], left: int, right: int):\n    \"\"\"\u5f52\u5e76\u6392\u5e8f\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if left >= right:\n        return  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    # \u5212\u5206\u9636\u6bb5\n    mid = (left + right) // 2 # \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid)  # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right)  # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    # \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n
    merge_sort.cpp
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.java
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.cs
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;       // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    MergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    MergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    Merge(nums, left, mid, right);\n}\n
    merge_sort.go
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i++\n        } else {\n            tmp[k] = nums[j]\n            j++\n        }\n        k++\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid {\n        tmp[k] = nums[i]\n        i++\n        k++\n    }\n    for j <= right {\n        tmp[k] = nums[j]\n        j++\n        k++\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    mid := left + (right - left) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.swift
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid, j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i += 1\n        } else {\n            tmp[k] = nums[j]\n            j += 1\n        }\n        k += 1\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    }\n    while j <= right {\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right { // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    let mid = left + (right - left) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums: &nums, left: left, right: mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
    merge_sort.js
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor(left + (right - left) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.ts
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor(left + (right - left) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.dart
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n  // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid && j <= right) {\n    if (nums[i] <= nums[j])\n      tmp[k++] = nums[i++];\n    else\n      tmp[k++] = nums[j++];\n  }\n  // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  // \u5212\u5206\u9636\u6bb5\n  int mid = left + (right - left) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\n  mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n  mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n  // \u5408\u5e76\u9636\u6bb5\n  merge(nums, left, mid, right);\n}\n
    merge_sort.rs
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i];\n            i += 1;\n        } else {\n            tmp[k] = nums[j];\n            j += 1;\n        }\n        k += 1;\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i];\n        k += 1;\n        i += 1;\n    }\n    while j <= right {\n        tmp[k] = nums[j];\n        k += 1;\n        j += 1;\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    }\n\n    // \u5212\u5206\u9636\u6bb5\n    let mid = left + (right - left) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.c
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.kt
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++]\n        else\n            tmp[k++] = nums[j++]\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return  // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    val mid = left + (right - left) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.rb
    ### \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 ###\ndef merge(nums, left, mid, right)\n  # \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n  # \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp\uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n  tmp = Array.new(right - left + 1, 0)\n  # \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n  i, j, k = left, mid + 1, 0\n  # \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while i <= mid && j <= right\n    if nums[i] <= nums[j]\n      tmp[k] = nums[i]\n      i += 1\n    else\n      tmp[k] = nums[j]\n      j += 1\n    end\n    k += 1\n  end\n  # \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while i <= mid\n    tmp[k] = nums[i]\n    i += 1\n    k += 1\n  end\n  while j <= right\n    tmp[k] = nums[j]\n    j += 1\n    k += 1\n  end\n  # \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n  (0...tmp.length).each do |k|\n    nums[left + k] = tmp[k]\n  end\nend\n\n### \u5f52\u5e76\u6392\u5e8f ###\ndef merge_sort(nums, left, right)\n  # \u7ec8\u6b62\u6761\u4ef6\n  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  return if left >= right\n  # \u5212\u5206\u9636\u6bb5\n  mid = left + (right - left) / 2 # \u8ba1\u7b97\u4e2d\u70b9\n  merge_sort(nums, left, mid) # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n  merge_sort(nums, mid + 1, right) # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n  # \u5408\u5e76\u9636\u6bb5\n  merge(nums, left, mid, right)\nend\n
    merge_sort.zig
    // \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n// \u5de6\u5b50\u6570\u7ec4\u533a\u95f4 [left, mid]\n// \u53f3\u5b50\u6570\u7ec4\u533a\u95f4 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var tmp = try mem_allocator.alloc(i32, right + 1 - left);\n    std.mem.copy(i32, tmp, nums[left..right+1]);\n    // \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u53f3\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 <= \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u5de6\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u672a\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 > \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5f52\u5e76\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;              // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    var mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    try mergeSort(nums, left, mid);         // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    try mergeSort(nums, mid + 1, right);    // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    try merge(nums, left, mid, right);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5212\u5206\u4ea7\u751f\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u5c42\u5408\u5e76\u7684\u603b\u64cd\u4f5c\u6570\u91cf\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002\u5408\u5e76\u64cd\u4f5c\u9700\u8981\u501f\u52a9\u8f85\u52a9\u6570\u7ec4\u5b9e\u73b0\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\u3002
    "},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u94fe\u8868\u6392\u5e8f","text":"

    \u5bf9\u4e8e\u94fe\u8868\uff0c\u5f52\u5e76\u6392\u5e8f\u76f8\u8f83\u4e8e\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\u5177\u6709\u663e\u8457\u4f18\u52bf\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u6392\u5e8f\u4efb\u52a1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(1)\\) \u3002

    • \u5212\u5206\u9636\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u9012\u5f52\u201d\u6765\u5b9e\u73b0\u94fe\u8868\u5212\u5206\u5de5\u4f5c\uff0c\u4ece\u800c\u7701\u53bb\u9012\u5f52\u4f7f\u7528\u7684\u6808\u5e27\u7a7a\u95f4\u3002
    • \u5408\u5e76\u9636\u6bb5\uff1a\u5728\u94fe\u8868\u4e2d\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u4ec5\u9700\u6539\u53d8\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u5b9e\u73b0\uff0c\u56e0\u6b64\u5408\u5e76\u9636\u6bb5\uff08\u5c06\u4e24\u4e2a\u77ed\u6709\u5e8f\u94fe\u8868\u5408\u5e76\u4e3a\u4e00\u4e2a\u957f\u6709\u5e8f\u94fe\u8868\uff09\u65e0\u987b\u521b\u5efa\u989d\u5916\u94fe\u8868\u3002

    \u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\u6bd4\u8f83\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u76f8\u5173\u8d44\u6599\u8fdb\u884c\u5b66\u4e60\u3002

    "},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

    \u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u8fd0\u884c\u9ad8\u6548\uff0c\u5e94\u7528\u5e7f\u6cdb\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5176\u76ee\u6807\u662f\uff1a\u9009\u62e9\u6570\u7ec4\u4e2d\u7684\u67d0\u4e2a\u5143\u7d20\u4f5c\u4e3a\u201c\u57fa\u51c6\u6570\u201d\uff0c\u5c06\u6240\u6709\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u4fa7\uff0c\u800c\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u4fa7\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u54e8\u5175\u5212\u5206\u7684\u6d41\u7a0b\u5982\u56fe 11-8 \u6240\u793a\u3002

    1. \u9009\u53d6\u6570\u7ec4\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u521d\u59cb\u5316\u4e24\u4e2a\u6307\u9488 i \u548c j \u5206\u522b\u6307\u5411\u6570\u7ec4\u7684\u4e24\u7aef\u3002
    2. \u8bbe\u7f6e\u4e00\u4e2a\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u522b\u5bfb\u627e\u7b2c\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u540e\u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\u3002
    3. \u5faa\u73af\u6267\u884c\u6b65\u9aa4 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u65f6\u505c\u6b62\uff0c\u6700\u540e\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\u3002
    <1><2><3><4><5><6><7><8><9>

    \u56fe 11-8 \u00a0 \u54e8\u5175\u5212\u5206\u6b65\u9aa4

    \u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u539f\u6570\u7ec4\u88ab\u5212\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u6570\u7ec4\u3001\u57fa\u51c6\u6570\u3001\u53f3\u5b50\u6570\u7ec4\uff0c\u4e14\u6ee1\u8db3\u201c\u5de6\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u51c6\u6570 \\(\\leq\\) \u53f3\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u8fd9\u4e24\u4e2a\u5b50\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    \u54e8\u5175\u5212\u5206\u7684\u5b9e\u8d28\u662f\u5c06\u4e00\u4e2a\u8f83\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u7b80\u5316\u4e3a\u4e24\u4e2a\u8f83\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(vector<int> &nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u54e8\u5175\u5212\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u54e8\u5175\u5212\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.js
    /* \u5143\u7d20\u4ea4\u6362 */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u5143\u7d20\u4ea4\u6362 */\nswap(nums: number[], i: number, j: number): void {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid _swap(List<int> nums, int i, int j) {\n  int tmp = nums[i];\n  nums[i] = nums[j];\n  nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u54e8\u5175\u5212\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int nums[], int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n    return i;\n}\n
    quick_sort.kt
    /* \u5143\u7d20\u4ea4\u6362 */\nfun swap(nums: IntArray, i: Int, j: Int) {\n    val temp = nums[i]\n    nums[i] = nums[j]\n    nums[j] = temp\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i              // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    ### \u54e8\u5175\u5212\u5206 ###\ndef partition(nums, left, right)\n  # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    while i < j && nums[i] <= nums[left]\n      i += 1 # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    # \u5143\u7d20\u4ea4\u6362\n    nums[i], nums[j] = nums[j], nums[i]\n  end\n  # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  nums[i], nums[left] = nums[left], nums[i]\n  i # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nend\n
    quick_sort.zig
    // \u5143\u7d20\u4ea4\u6362\nfn swap(nums: []i32, i: usize, j: usize) void {\n    var tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n// \u54e8\u5175\u5212\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5feb\u901f\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-9 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5bf9\u539f\u6570\u7ec4\u6267\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u3002
    2. \u7136\u540e\uff0c\u5bf9\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5206\u522b\u9012\u5f52\u6267\u884c\u201c\u54e8\u5175\u5212\u5206\u201d\u3002
    3. \u6301\u7eed\u9012\u5f52\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\uff0c\u4ece\u800c\u5b8c\u6210\u6574\u4e2a\u6570\u7ec4\u7684\u6392\u5e8f\u3002

    \u56fe 11-9 \u00a0 \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right:\n        return\n    # \u54e8\u5175\u5212\u5206\n    pivot = self.partition(nums, left, right)\n    # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    self.quick_sort(nums, left, pivot - 1)\n    self.quick_sort(nums, pivot + 1, right)\n
    quick_sort.cpp
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.java
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = Partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    QuickSort(nums, left, pivot - 1);\n    QuickSort(nums, pivot + 1, right);\n}\n
    quick_sort.go
    /* \u5feb\u901f\u6392\u5e8f */\nfunc (q *quickSort) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    pivot := q.partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    q.quickSort(nums, left, pivot-1)\n    q.quickSort(nums, pivot+1, right)\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f */\nfunc quickSort(nums: inout [Int], left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums: &nums, left: left, right: pivot - 1)\n    quickSort(nums: &nums, left: pivot + 1, right: right)\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.dart
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  if (left >= right) return;\n  // \u54e8\u5175\u5212\u5206\n  int pivot = _partition(nums, left, right);\n  // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n  quickSort(nums, left, pivot - 1);\n  quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.rs
    /* \u5feb\u901f\u6392\u5e8f */\npub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    Self::quick_sort(left, pivot - 1, nums);\n    Self::quick_sort(pivot + 1, right, nums);\n}\n
    quick_sort.c
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.kt
    /* \u5feb\u901f\u6392\u5e8f */\nfun quickSort(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return\n    // \u54e8\u5175\u5212\u5206\n    val pivot = partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
    quick_sort.rb
    ### \u5feb\u901f\u6392\u5e8f\u7c7b ###\ndef quick_sort(nums, left, right)\n  # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e0d\u4e3a 1 \u65f6\u9012\u5f52\n  if left < right\n    # \u54e8\u5175\u5212\u5206\n    pivot = partition(nums, left, right)\n    # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    var pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u51b5\u4e0b\uff0c\u54e8\u5175\u5212\u5206\u7684\u9012\u5f52\u5c42\u6570\u4e3a \\(\\log n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u603b\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n \\log n)\\) \u65f6\u95f4\u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u5212\u5206\u4e3a\u957f\u5ea6\u4e3a \\(0\\) \u548c \\(n - 1\\) \u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u6b64\u65f6\u9012\u5f52\u5c42\u6570\u8fbe\u5230 \\(n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\uff0c\u672a\u501f\u52a9\u989d\u5916\u6570\u7ec4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5212\u5206\u7684\u6700\u540e\u4e00\u6b65\uff0c\u57fa\u51c6\u6570\u53ef\u80fd\u4f1a\u88ab\u4ea4\u6362\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\u3002
    "},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u4e3a\u4ec0\u4e48\u5feb","text":"

    \u4ece\u540d\u79f0\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u5e94\u8be5\u5177\u6709\u4e00\u5b9a\u7684\u4f18\u52bf\u3002\u5c3d\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e0e\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u548c\u201c\u5806\u6392\u5e8f\u201d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u51fa\u73b0\u6700\u5dee\u60c5\u51b5\u7684\u6982\u7387\u5f88\u4f4e\uff1a\u867d\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u6ca1\u6709\u5f52\u5e76\u6392\u5e8f\u7a33\u5b9a\uff0c\u4f46\u5728\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fd0\u884c\u3002
    • \u7f13\u5b58\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u6267\u884c\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u65f6\uff0c\u7cfb\u7edf\u53ef\u5c06\u6574\u4e2a\u5b50\u6570\u7ec4\u52a0\u8f7d\u5230\u7f13\u5b58\uff0c\u56e0\u6b64\u8bbf\u95ee\u5143\u7d20\u7684\u6548\u7387\u8f83\u9ad8\u3002\u800c\u50cf\u201c\u5806\u6392\u5e8f\u201d\u8fd9\u7c7b\u7b97\u6cd5\u9700\u8981\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u5143\u7d20\uff0c\u4ece\u800c\u7f3a\u4e4f\u8fd9\u4e00\u7279\u6027\u3002
    • \u590d\u6742\u5ea6\u7684\u5e38\u6570\u7cfb\u6570\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u79cd\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f83\u3001\u8d4b\u503c\u3001\u4ea4\u6362\u7b49\u64cd\u4f5c\u7684\u603b\u6570\u91cf\u6700\u5c11\u3002\u8fd9\u4e0e\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u7c7b\u4f3c\u3002
    "},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u51c6\u6570\u4f18\u5316","text":"

    \u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\u7684\u65f6\u95f4\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u4e3e\u4e00\u4e2a\u6781\u7aef\u4f8b\u5b50\uff0c\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u4e8e\u6211\u4eec\u9009\u62e9\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u5728\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u57fa\u51c6\u6570\u88ab\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u53f3\u7aef\uff0c\u5bfc\u81f4\u5de6\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n - 1\\)\u3001\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \u3002\u5982\u6b64\u9012\u5f52\u4e0b\u53bb\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\u90fd\u6709\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u4e3a\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

    \u4e3a\u4e86\u5c3d\u91cf\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u53d1\u751f\uff0c\u6211\u4eec\u53ef\u4ee5\u4f18\u5316\u54e8\u5175\u5212\u5206\u4e2d\u7684\u57fa\u51c6\u6570\u7684\u9009\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u968f\u673a\u9009\u53d6\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u7136\u800c\uff0c\u5982\u679c\u8fd0\u6c14\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9009\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u51c6\u6570\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u5c3d\u5982\u4eba\u610f\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u4f2a\u968f\u673a\u6570\u201d\u3002\u5982\u679c\u6211\u4eec\u9488\u5bf9\u4f2a\u968f\u673a\u6570\u5e8f\u5217\u6784\u5efa\u4e00\u4e2a\u7279\u5b9a\u7684\u6d4b\u8bd5\u6837\u4f8b\uff0c\u90a3\u4e48\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

    \u4e3a\u4e86\u8fdb\u4e00\u6b65\u6539\u8fdb\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6570\u7ec4\u4e2d\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\uff08\u901a\u5e38\u4e3a\u6570\u7ec4\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u70b9\u5143\u7d20\uff09\uff0c\u5e76\u5c06\u8fd9\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u57fa\u51c6\u6570\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6982\u7387\u5c06\u5927\u5e45\u63d0\u5347\u3002\u5f53\u7136\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u9009\u53d6\u66f4\u591a\u5019\u9009\u5143\u7d20\uff0c\u4ee5\u8fdb\u4e00\u6b65\u63d0\u9ad8\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002\u91c7\u7528\u8fd9\u79cd\u65b9\u6cd5\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6982\u7387\u5927\u5927\u964d\u4f4e\u3002

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\"\"\"\n    l, m, r = nums[left], nums[mid], nums[right]\n    if (l <= m <= r) or (r <= m <= l):\n        return mid  # m \u5728 l \u548c r \u4e4b\u95f4\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint MedianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n    l, m, r := nums[left], nums[mid], nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\n    let l = nums[left]\n    let m = nums[mid]\n    let r = nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = medianThree(nums: nums, left: left, mid: left + (right - left) / 2, right: right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
    quick_sort.js
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(nums, left, mid, right) {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(\n    nums: number[],\n    left: number,\n    mid: number,\n    right: number\n): number {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint _medianThree(List<int> nums, int left, int mid, int right) {\n  int l = nums[left], m = nums[mid], r = nums[right];\n  if ((l <= m && m <= r) || (r <= m && m <= l))\n    return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u95f4\n  return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {\n    let (l, m, r) = (nums[left], nums[mid], nums[right]);\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int nums[], int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.kt
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {\n    val l = nums[left]\n    val m = nums[mid]\n    val r = nums[right]\n    if ((m in l..r) || (m in r..l))\n        return mid  // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i                         // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    ### \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 ###\ndef median_three(nums, left, mid, right)\n  # \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n  _l, _m, _r = nums[left], nums[mid], nums[right]\n  # m \u5728 l \u548c r \u4e4b\u95f4\n  return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l)\n  # l \u5728 m \u548c r \u4e4b\u95f4\n  return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m)\n  return right\nend\n\n### \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09###\ndef partition(nums, left, right)\n  ### \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  med = median_three(nums, left, (left + right) / 2, right)\n  # \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u65ad\n  nums[left], nums[med] = nums[med], nums[left]\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    while i < j && nums[i] <= nums[left]\n      i += 1 # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    # \u5143\u7d20\u4ea4\u6362\n    nums[i], nums[j] = nums[j], nums[i]\n  end\n  # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  nums[i], nums[left] = nums[left], nums[i]\n  i # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nend\n
    quick_sort.zig
    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n    var l = nums[left];\n    var m = nums[mid];\n    var r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n// \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u9012\u5f52\u4f18\u5316","text":"

    \u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u5360\u7528\u7a7a\u95f4\u8f83\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f93\u5165\u6570\u7ec4\u4e3a\u4f8b\uff0c\u8bbe\u9012\u5f52\u4e2d\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(m\\) \uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u4ea7\u751f\u957f\u5ea6\u4e3a \\(0\\) \u7684\u5de6\u5b50\u6570\u7ec4\u548c\u957f\u5ea6\u4e3a \\(m - 1\\) \u7684\u53f3\u5b50\u6570\u7ec4\uff0c\u8fd9\u610f\u5473\u7740\u6bcf\u4e00\u5c42\u9012\u5f52\u8c03\u7528\u51cf\u5c11\u7684\u95ee\u9898\u89c4\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u51cf\u5c11\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u9012\u5f52\u6811\u7684\u9ad8\u5ea6\u4f1a\u8fbe\u5230 \\(n - 1\\) \uff0c\u6b64\u65f6\u9700\u8981\u5360\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002

    \u4e3a\u4e86\u9632\u6b62\u6808\u5e27\u7a7a\u95f4\u7684\u7d2f\u79ef\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6bcf\u8f6e\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u540e\uff0c\u6bd4\u8f83\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\uff0c\u4ec5\u5bf9\u8f83\u77ed\u7684\u5b50\u6570\u7ec4\u8fdb\u884c\u9012\u5f52\u3002\u7531\u4e8e\u8f83\u77ed\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(n / 2\\) \uff0c\u56e0\u6b64\u8fd9\u79cd\u65b9\u6cd5\u80fd\u786e\u4fdd\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff0c\u4ece\u800c\u5c06\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right:\n        # \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n
    quick_sort.cpp
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.java
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.go
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    for left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.dart
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n      left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n      right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n    }\n  }\n}\n
    quick_sort.rs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.c
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
    quick_sort.kt
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            l = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            r = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.rb
    ### \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09###\ndef quick_sort(nums, left, right)\n  # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e0d\u4e3a 1 \u65f6\u9012\u5f52\n  while left < right\n    # \u54e8\u5175\u5212\u5206\n    pivot = partition(nums, left, right)\n    # \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n    if pivot - left < right - pivot\n      quick_sort(nums, left, pivot - 1)\n      left = pivot + 1 # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n    else\n      quick_sort(nums, pivot + 1, right)\n      right = pivot - 1 # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n    end\n  end\nend\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                   // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6570\u6392\u5e8f","text":"

    \u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u8ba1\u6570\u6392\u5e8f\uff0c\u5b83\u9002\u7528\u4e8e\u6570\u636e\u91cf \\(n\\) \u8f83\u5927\u4f46\u6570\u636e\u8303\u56f4 \\(m\\) \u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u5bf9 \\(n = 10^6\\) \u4e2a\u5b66\u53f7\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u5b66\u53f7\u662f\u4e00\u4e2a \\(8\\) \u4f4d\u6570\u5b57\uff0c\u8fd9\u610f\u5473\u7740\u6570\u636e\u8303\u56f4 \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u5185\u5b58\u7a7a\u95f4\uff0c\u800c\u57fa\u6570\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u3002

    \u57fa\u6570\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u4e0e\u8ba1\u6570\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u901a\u8fc7\u7edf\u8ba1\u4e2a\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u57fa\u6570\u6392\u5e8f\u5229\u7528\u6570\u5b57\u5404\u4f4d\u4e4b\u95f4\u7684\u9012\u8fdb\u5173\u7cfb\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e00\u4f4d\u8fdb\u884c\u6392\u5e8f\uff0c\u4ece\u800c\u5f97\u5230\u6700\u7ec8\u7684\u6392\u5e8f\u7ed3\u679c\u3002

    "},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u4ee5\u5b66\u53f7\u6570\u636e\u4e3a\u4f8b\uff0c\u5047\u8bbe\u6570\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6570\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-18 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4f4d\u6570 \\(k = 1\\) \u3002
    2. \u5bf9\u5b66\u53f7\u7684\u7b2c \\(k\\) \u4f4d\u6267\u884c\u201c\u8ba1\u6570\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u540e\uff0c\u6570\u636e\u4f1a\u6839\u636e\u7b2c \\(k\\) \u4f4d\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u3002
    3. \u5c06 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u540e\u8fd4\u56de\u6b65\u9aa4 2. \u7ee7\u7eed\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u540e\u7ed3\u675f\u3002

    \u56fe 11-18 \u00a0 \u57fa\u6570\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

    \u4e0b\u9762\u5256\u6790\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u4e8e\u4e00\u4e2a \\(d\\) \u8fdb\u5236\u7684\u6570\u5b57 \\(x\\) \uff0c\u8981\u83b7\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8ba1\u7b97\u516c\u5f0f\uff1a

    \\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

    \u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5bf9 \\(d\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\u3002\u5bf9\u4e8e\u5b66\u53f7\u6570\u636e\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

    \u6b64\u5916\uff0c\u6211\u4eec\u9700\u8981\u5c0f\u5e45\u6539\u52a8\u8ba1\u6570\u6392\u5e8f\u4ee3\u7801\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u636e\u6570\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u8fdb\u884c\u6392\u5e8f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
    def digit(num: int, exp: int) -> int:\n    \"\"\"\u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter = [0] * 10\n    n = len(nums)\n    # \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1  # \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    # \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        d = digit(nums[i], exp)\n        j = counter[d] - 1  # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    # \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6570\u6392\u5e8f\"\"\"\n    # \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    m = max(nums)\n    # \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    exp = 1\n    while exp <= m:\n        # \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        # k = 1 -> exp = 1\n        # k = 2 -> exp = 10\n        # \u5373 exp = 10^(k-1)\n        counting_sort_digit(nums, exp)\n        exp *= 10\n
    radix_sort.cpp
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    vector<int> res(n, 0);\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n}\n
    radix_sort.java
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.cs
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = Digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        CountingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.go
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++             // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        d := digit(nums[i], exp)\n        j := counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n    }\n}\n
    radix_sort.swift
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var counter = Array(repeating: 0, count: 10)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1 // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let d = digit(num: nums[i], exp: exp)\n        let j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums: &nums, exp: exp)\n    }\n}\n
    radix_sort.js
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.ts
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.dart
    /* \u83b7\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n    counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n  }\n  // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n  List<int> res = List<int>.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int d = digit(nums[i], exp);\n    int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n  // dart \u4e2d int \u7684\u957f\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n    // k = 1 -> exp = 1\n    // k = 2 -> exp = 10\n    // \u5373 exp = 10^(k-1)\n    countingSortDigit(nums, exp);\n}\n
    radix_sort.rs
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let d = digit(nums[i], exp);\n        let j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums.copy_from_slice(&res);\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
    radix_sort.c
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < size; i++) {\n        // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        int d = digit(nums[i], exp);\n        // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int *res = (int *)malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int max = INT32_MIN;\n    for (size_t i = 0; i < size - 1; i++) {\n        if (nums[i] > max) {\n            max = nums[i];\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, size, exp);\n}\n
    radix_sort.kt
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val d = digit(nums[i], exp)\n        val j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    while (exp <= m) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n        exp *= 10\n    }\n}\n
    radix_sort.rb
    ### \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) ###\ndef digit(num, exp)\n  # \u8f6c\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n  (num / exp) % 10\nend\n\n### \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09###\ndef counting_sort_digit(nums, exp)\n  # \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n  counter = Array.new(10, 0)\n  n = nums.length\n  # \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  for i in 0...n\n    d = digit(nums[i], exp) # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n    counter[d] += 1 # \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n  end\n  # \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n  (1...10).each { |i| counter[i] += counter[i - 1] }\n  # \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n  res = Array.new(n, 0)\n  for i in (n - 1).downto(0)\n    d = digit(nums[i], exp)\n    j = counter[d] - 1 # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i] # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d] -= 1 # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n  end\n  # \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\n\n### \u57fa\u6570\u6392\u5e8f ###\ndef radix_sort(nums)\n  # \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n  m = nums.max\n  # \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n  exp = 1\n  while exp <= m\n    # \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n    # k = 1 -> exp = 1\n    # k = 2 -> exp = 10\n    # \u5373 exp = 10^(k-1)\n    counting_sort_digit(nums, exp)\n    exp *= 10\n  end\nend\n
    radix_sort.zig
    // \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    // defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var counter = try mem_allocator.alloc(usize, 10);\n    @memset(counter, 0);\n    var n = nums.len;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = try mem_allocator.alloc(i32, n);\n    i = n - 1;\n    while (i >= 0) : (i -= 1) {\n        var d: u32 = @bitCast(digit(nums[i], exp));\n        var j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6570\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        try countingSortDigit(nums, exp);    \n    }\n} \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4e3a\u4ec0\u4e48\u4ece\u6700\u4f4e\u4f4d\u5f00\u59cb\u6392\u5e8f\uff1f

    \u5728\u8fde\u7eed\u7684\u6392\u5e8f\u8f6e\u6b21\u4e2d\uff0c\u540e\u4e00\u8f6e\u6392\u5e8f\u4f1a\u8986\u76d6\u524d\u4e00\u8f6e\u6392\u5e8f\u7684\u7ed3\u679c\u3002\u4e3e\u4f8b\u6765\u8bf4\uff0c\u5982\u679c\u7b2c\u4e00\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a > b\\) \uff0c\u90a3\u4e48\u7b2c\u4e8c\u8f6e\u7684\u7ed3\u679c\u5c06\u53d6\u4ee3\u7b2c\u4e00\u8f6e\u7684\u7ed3\u679c\u3002\u7531\u4e8e\u6570\u5b57\u7684\u9ad8\u4f4d\u4f18\u5148\u7ea7\u9ad8\u4e8e\u4f4e\u4f4d\uff0c\u56e0\u6b64\u5e94\u8be5\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

    "},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

    \u76f8\u8f83\u4e8e\u8ba1\u6570\u6392\u5e8f\uff0c\u57fa\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u503c\u8303\u56f4\u8f83\u5927\u7684\u60c5\u51b5\uff0c\u4f46\u524d\u63d0\u662f\u6570\u636e\u5fc5\u987b\u53ef\u4ee5\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6570\u4e0d\u80fd\u8fc7\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u70b9\u6570\u4e0d\u9002\u5408\u4f7f\u7528\u57fa\u6570\u6392\u5e8f\uff0c\u56e0\u4e3a\u5176\u4f4d\u6570 \\(k\\) \u8fc7\u5927\uff0c\u53ef\u80fd\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u8bbe\u6570\u636e\u91cf\u4e3a \\(n\\)\u3001\u6570\u636e\u4e3a \\(d\\) \u8fdb\u5236\u3001\u6700\u5927\u4f4d\u6570\u4e3a \\(k\\) \uff0c\u5219\u5bf9\u67d0\u4e00\u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u65f6\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5bf9\u8f83\u5c0f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6570\u6392\u5e8f\u9700\u8981\u501f\u52a9\u957f\u5ea6\u4e3a \\(n\\) \u548c \\(d\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5f53\u8ba1\u6570\u6392\u5e8f\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u4e5f\u7a33\u5b9a\uff1b\u5f53\u8ba1\u6570\u6392\u5e8f\u4e0d\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u65e0\u6cd5\u4fdd\u8bc1\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\u3002
    "},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9009\u62e9\u6392\u5e8f","text":"

    \u9009\u62e9\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7b80\u5355\uff1a\u5f00\u542f\u4e00\u4e2a\u5faa\u73af\uff0c\u6bcf\u8f6e\u4ece\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c06\u5176\u653e\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u672b\u5c3e\u3002

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u9009\u62e9\u6392\u5e8f\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 11-2 \u6240\u793a\u3002

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u533a\u95f4\u4e3a \\([0, n-1]\\) \u3002
    2. \u9009\u53d6\u533a\u95f4 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(0\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 1 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u533a\u95f4 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(1\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\u3002\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u9009\u62e9\u4e0e\u4ea4\u6362\u540e\uff0c\u6570\u7ec4\u524d \\(n - 1\\) \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    5. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 11-2 \u00a0 \u9009\u62e9\u6392\u5e8f\u6b65\u9aa4

    \u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u7528 \\(k\\) \u6765\u8bb0\u5f55\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
    def selection_sort(nums: list[int]):\n    \"\"\"\u9009\u62e9\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in range(n - 1):\n        # \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k = i\n        for j in range(i + 1, n):\n            if nums[j] < nums[k]:\n                k = j  # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n
    selection_sort.cpp
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        swap(nums[i], nums[k]);\n    }\n}\n
    selection_sort.java
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.cs
    /* \u9009\u62e9\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
    selection_sort.go
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
    selection_sort.swift
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        var k = i\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[j] < nums[k] {\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swapAt(i, k)\n    }\n}\n
    selection_sort.js
    /* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.ts
    /* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.dart
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n    int k = i;\n    for (int j = i + 1; j < n; j++) {\n      if (nums[j] < nums[k]) k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
    selection_sort.rs
    /* \u9009\u62e9\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in 0..n - 1 {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let mut k = i;\n        for j in i + 1..n {\n            if nums[j] < nums[k] {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swap(i, k);\n    }\n}\n
    selection_sort.c
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.kt
    /* \u9009\u62e9\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
    selection_sort.rb
    ### \u9009\u62e9\u6392\u5e8f ###\ndef selection_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n  for i in 0...(n - 1)\n    # \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n    k = i\n    for j in (i + 1)...n\n      if nums[j] < nums[k]\n        k = j # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n      end\n    end\n    # \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n    nums[i], nums[k] = nums[k], nums[i]\n  end\nend\n
    selection_sort.zig
    [class]{}-[func]{selectionSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5916\u5faa\u73af\u5171 \\(n - 1\\) \u8f6e\uff0c\u7b2c\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6700\u540e\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(2\\) \uff0c\u5373\u5404\u8f6e\u5916\u5faa\u73af\u5206\u522b\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f6e\u5185\u5faa\u73af\uff0c\u6c42\u548c\u4e3a \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5982\u56fe 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u6362\u81f3\u4e0e\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u8fb9\uff0c\u5bfc\u81f4\u4e24\u8005\u7684\u76f8\u5bf9\u987a\u5e8f\u53d1\u751f\u6539\u53d8\u3002

    \u56fe 11-3 \u00a0 \u9009\u62e9\u6392\u5e8f\u975e\u7a33\u5b9a\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5","text":"

    \u6392\u5e8f\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u4e8e\u5bf9\u4e00\u7ec4\u6570\u636e\u6309\u7167\u7279\u5b9a\u987a\u5e8f\u8fdb\u884c\u6392\u5217\u3002\u6392\u5e8f\u7b97\u6cd5\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\uff0c\u56e0\u4e3a\u6709\u5e8f\u6570\u636e\u901a\u5e38\u80fd\u591f\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u627e\u3001\u5206\u6790\u548c\u5904\u7406\u3002

    \u5982\u56fe 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u662f\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u6216\u5b57\u7b26\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65ad\u89c4\u5219\u53ef\u6839\u636e\u9700\u6c42\u8bbe\u5b9a\uff0c\u5982\u6570\u5b57\u5927\u5c0f\u3001\u5b57\u7b26 ASCII \u7801\u987a\u5e8f\u6216\u81ea\u5b9a\u4e49\u89c4\u5219\u3002

    \u56fe 11-1 \u00a0 \u6570\u636e\u7c7b\u578b\u548c\u5224\u65ad\u89c4\u5219\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8bc4\u4ef7\u7ef4\u5ea6","text":"

    \u8fd0\u884c\u6548\u7387\uff1a\u6211\u4eec\u671f\u671b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c3d\u91cf\u4f4e\uff0c\u4e14\u603b\u4f53\u64cd\u4f5c\u6570\u91cf\u8f83\u5c11\uff08\u65f6\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\uff09\u3002\u5bf9\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u8fd0\u884c\u6548\u7387\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002

    \u5c31\u5730\u6027\uff1a\u987e\u540d\u601d\u4e49\uff0c\u539f\u5730\u6392\u5e8f\u901a\u8fc7\u5728\u539f\u6570\u7ec4\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\uff0c\u65e0\u987b\u501f\u52a9\u989d\u5916\u7684\u8f85\u52a9\u6570\u7ec4\uff0c\u4ece\u800c\u8282\u7701\u5185\u5b58\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u6570\u636e\u642c\u8fd0\u64cd\u4f5c\u8f83\u5c11\uff0c\u8fd0\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

    \u7a33\u5b9a\u6027\uff1a\u7a33\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u540e\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u76f8\u5bf9\u987a\u5e8f\u4e0d\u53d1\u751f\u6539\u53d8\u3002

    \u7a33\u5b9a\u6392\u5e8f\u662f\u591a\u7ea7\u6392\u5e8f\u573a\u666f\u7684\u5fc5\u8981\u6761\u4ef6\u3002\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u5b58\u50a8\u5b66\u751f\u4fe1\u606f\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u522b\u662f\u59d3\u540d\u548c\u5e74\u9f84\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u975e\u7a33\u5b9a\u6392\u5e8f\u53ef\u80fd\u5bfc\u81f4\u8f93\u5165\u6570\u636e\u7684\u6709\u5e8f\u6027\u4e27\u5931\uff1a

    # \u8f93\u5165\u6570\u636e\u662f\u6309\u7167\u59d3\u540d\u6392\u5e8f\u597d\u7684\n# (name, age)\n  ('A', 19)\n  ('B', 18)\n  ('C', 21)\n  ('D', 19)\n  ('E', 23)\n\n# \u5047\u8bbe\u4f7f\u7528\u975e\u7a33\u5b9a\u6392\u5e8f\u7b97\u6cd5\u6309\u5e74\u9f84\u6392\u5e8f\u5217\u8868\uff0c\n# \u7ed3\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5bf9\u4f4d\u7f6e\u6539\u53d8\uff0c\n# \u8f93\u5165\u6570\u636e\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8d28\u4e22\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

    \u81ea\u9002\u5e94\u6027\uff1a\u81ea\u9002\u5e94\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u53d7\u8f93\u5165\u6570\u636e\u7684\u5f71\u54cd\uff0c\u5373\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5e76\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

    \u81ea\u9002\u5e94\u6027\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u6765\u8bc4\u4f30\u3002\u5982\u679c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u5dee\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8bf4\u660e\u6392\u5e8f\u7b97\u6cd5\u5728\u67d0\u4e9b\u6570\u636e\u4e0b\u6027\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u89c6\u4e3a\u8d1f\u9762\u5c5e\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u5219\u88ab\u89c6\u4e3a\u6b63\u9762\u5c5e\u6027\u3002

    \u662f\u5426\u57fa\u4e8e\u6bd4\u8f83\uff1a\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u4f9d\u8d56\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u6765\u5224\u65ad\u5143\u7d20\u7684\u76f8\u5bf9\u987a\u5e8f\uff0c\u4ece\u800c\u6392\u5e8f\u6574\u4e2a\u6570\u7ec4\uff0c\u7406\u8bba\u6700\u4f18\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f83\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5bf9\u8f83\u5dee\u3002

    "},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u7b97\u6cd5","text":"

    \u8fd0\u884c\u5feb\u3001\u539f\u5730\u3001\u7a33\u5b9a\u3001\u6b63\u5411\u81ea\u9002\u5e94\u3001\u901a\u7528\u6027\u597d\u3002\u663e\u7136\uff0c\u8fc4\u4eca\u4e3a\u6b62\u5c1a\u672a\u53d1\u73b0\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9009\u62e9\u6392\u5e8f\u7b97\u6cd5\u65f6\uff0c\u9700\u8981\u6839\u636e\u5177\u4f53\u7684\u6570\u636e\u7279\u70b9\u548c\u95ee\u9898\u9700\u6c42\u6765\u51b3\u5b9a\u3002

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u5171\u540c\u5b66\u4e60\u5404\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5e76\u57fa\u4e8e\u4e0a\u8ff0\u8bc4\u4ef7\u7ef4\u5ea6\u5bf9\u5404\u4e2a\u6392\u5e8f\u7b97\u6cd5\u7684\u4f18\u7f3a\u70b9\u8fdb\u884c\u5206\u6790\u3002

    "},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u5192\u6ce1\u6392\u5e8f\u901a\u8fc7\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u901a\u8fc7\u6dfb\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d\u6765\u5b9e\u73b0\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(n)\\) \u3002
    • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f6e\u5c06\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u6b63\u786e\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u867d\u7136\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u7531\u4e8e\u5355\u5143\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u6570\u636e\u91cf\u7684\u6392\u5e8f\u4efb\u52a1\u4e2d\u975e\u5e38\u53d7\u6b22\u8fce\u3002
    • \u5feb\u901f\u6392\u5e8f\u57fa\u4e8e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5212\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9009\u53d6\u5230\u6700\u5dee\u7684\u57fa\u51c6\u6570\uff0c\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6570\u57fa\u51c6\u6570\u6216\u968f\u673a\u57fa\u51c6\u6570\u53ef\u4ee5\u964d\u4f4e\u8fd9\u79cd\u52a3\u5316\u7684\u6982\u7387\u3002\u5c3e\u9012\u5f52\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u51cf\u5c11\u9012\u5f52\u6df1\u5ea6\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(\\log n)\\) \u3002
    • \u5f52\u5e76\u6392\u5e8f\u5305\u62ec\u5212\u5206\u548c\u5408\u5e76\u4e24\u4e2a\u9636\u6bb5\uff0c\u5178\u578b\u5730\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5f52\u5e76\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u6570\u7ec4\u9700\u8981\u521b\u5efa\u8f85\u52a9\u6570\u7ec4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u94fe\u8868\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002
    • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u4e2a\u6b65\u9aa4\uff1a\u6570\u636e\u5206\u6876\u3001\u6876\u5185\u6392\u5e8f\u548c\u5408\u5e76\u7ed3\u679c\u3002\u5b83\u540c\u6837\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9002\u7528\u4e8e\u6570\u636e\u4f53\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u3002\u6876\u6392\u5e8f\u7684\u5173\u952e\u5728\u4e8e\u5bf9\u6570\u636e\u8fdb\u884c\u5e73\u5747\u5206\u914d\u3002
    • \u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5b83\u901a\u8fc7\u7edf\u8ba1\u6570\u636e\u51fa\u73b0\u7684\u6b21\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u6709\u9650\u7684\u60c5\u51b5\uff0c\u5e76\u4e14\u8981\u6c42\u6570\u636e\u80fd\u591f\u8f6c\u6362\u4e3a\u6b63\u6574\u6570\u3002
    • \u57fa\u6570\u6392\u5e8f\u901a\u8fc7\u9010\u4f4d\u6392\u5e8f\u6765\u5b9e\u73b0\u6570\u636e\u6392\u5e8f\uff0c\u8981\u6c42\u6570\u636e\u80fd\u591f\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u6570\u5b57\u3002
    • \u603b\u7684\u6765\u8bf4\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a33\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9002\u5e94\u6027\u7b49\u4f18\u70b9\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e00\u6837\uff0c\u6ca1\u6709\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\u80fd\u591f\u540c\u65f6\u6ee1\u8db3\u6240\u6709\u8fd9\u4e9b\u6761\u4ef6\u3002\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u6570\u636e\u7684\u7279\u6027\u6765\u9009\u62e9\u5408\u9002\u7684\u6392\u5e8f\u7b97\u6cd5\u3002
    • \u56fe 11-19 \u5bf9\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a33\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9002\u5e94\u6027\u7b49\u3002

    \u56fe 11-19 \u00a0 \u6392\u5e8f\u7b97\u6cd5\u5bf9\u6bd4

    "},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6392\u5e8f\u7b97\u6cd5\u7a33\u5b9a\u6027\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

    \u5728\u73b0\u5b9e\u4e2d\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u57fa\u4e8e\u5bf9\u8c61\u7684\u67d0\u4e2a\u5c5e\u6027\u8fdb\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b66\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u4e24\u4e2a\u5c5e\u6027\uff0c\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u4e00\u4e2a\u591a\u7ea7\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5bf9\u8eab\u9ad8\u8fdb\u884c\u6392\u5e8f\u3002\u7531\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e0d\u7a33\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

    \u53ef\u4ee5\u53d1\u73b0\uff0c\u5b66\u751f D \u548c C \u7684\u4f4d\u7f6e\u53d1\u751f\u4e86\u4ea4\u6362\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u574f\u4e86\uff0c\u800c\u8fd9\u662f\u6211\u4eec\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

    Q\uff1a\u54e8\u5175\u5212\u5206\u4e2d\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u4e0e\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u7684\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\u5417\uff1f

    \u4e0d\u884c\uff0c\u5f53\u6211\u4eec\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u4e3a\u57fa\u51c6\u6570\u65f6\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u518d\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002\u8fd9\u4e2a\u7ed3\u8bba\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u6211\u4eec\u6765\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

    \u54e8\u5175\u5212\u5206 partition() \u7684\u6700\u540e\u4e00\u6b65\u662f\u4ea4\u6362 nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u57fa\u51c6\u6570\u5de6\u8fb9\u7684\u5143\u7d20\u90fd <= \u57fa\u51c6\u6570\uff0c\u8fd9\u5c31\u8981\u6c42\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u524d nums[left] >= nums[i] \u5fc5\u987b\u6210\u7acb\u3002\u5047\u8bbe\u6211\u4eec\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\uff0c\u90a3\u4e48\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5219\u4f1a\u5728 i == j \u65f6\u8df3\u51fa\u5faa\u73af\uff0c\u6b64\u65f6\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u6b64\u65f6\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u64cd\u4f5c\u4f1a\u628a\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\uff0c\u5bfc\u81f4\u54e8\u5175\u5212\u5206\u5931\u8d25\u3002

    \u4e3e\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u6570\u7ec4 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u4ece\u5de6\u5411\u53f3\u67e5\u627e\u201d\uff0c\u54e8\u5175\u5212\u5206\u540e\u6570\u7ec4\u4e3a [1, 0, 0, 0, 0] \uff0c\u8fd9\u4e2a\u7ed3\u679c\u662f\u4e0d\u6b63\u786e\u7684\u3002

    \u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u4eec\u9009\u62e9 nums[right] \u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u6b63\u597d\u53cd\u8fc7\u6765\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002

    Q\uff1a\u5173\u4e8e\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u4e3a\u4ec0\u4e48\u9009\u77ed\u7684\u6570\u7ec4\u80fd\u4fdd\u8bc1\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff1f

    \u9012\u5f52\u6df1\u5ea6\u5c31\u662f\u5f53\u524d\u672a\u8fd4\u56de\u7684\u9012\u5f52\u65b9\u6cd5\u7684\u6570\u91cf\u3002\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u6211\u4eec\u5c06\u539f\u6570\u7ec4\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002\u5728\u5c3e\u9012\u5f52\u4f18\u5316\u540e\uff0c\u5411\u4e0b\u9012\u5f52\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u6700\u5927\u4e3a\u539f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8bbe\u6700\u5dee\u60c5\u51b5\uff0c\u4e00\u76f4\u4e3a\u4e00\u534a\u957f\u5ea6\uff0c\u90a3\u4e48\u6700\u7ec8\u7684\u9012\u5f52\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

    \u56de\u987e\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u4f1a\u8fde\u7eed\u5730\u9012\u5f52\u957f\u5ea6\u8f83\u5927\u7684\u6570\u7ec4\uff0c\u6700\u5dee\u60c5\u51b5\u4e0b\u4e3a \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002\u5c3e\u9012\u5f52\u4f18\u5316\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u51fa\u73b0\u3002

    Q\uff1a\u5f53\u6570\u7ec4\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u65f6\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n^2)\\) \u5417\uff1f\u8be5\u5982\u4f55\u5904\u7406\u8fd9\u79cd\u9000\u5316\u60c5\u51b5\uff1f

    \u662f\u7684\u3002\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5\uff0c\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u54e8\u5175\u5212\u5206\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1a\u5c0f\u4e8e\u3001\u7b49\u4e8e\u3001\u5927\u4e8e\u57fa\u51c6\u6570\u3002\u4ec5\u5411\u4e0b\u9012\u5f52\u5c0f\u4e8e\u548c\u5927\u4e8e\u7684\u4e24\u90e8\u5206\u3002\u5728\u8be5\u65b9\u6cd5\u4e0b\uff0c\u8f93\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u6570\u7ec4\uff0c\u4ec5\u4e00\u8f6e\u54e8\u5175\u5212\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

    Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u4ec0\u4e48\u662f \\(O(n^2)\\) \uff1f

    \u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u4e2a\u6876\u4e2d\u3002\u5982\u679c\u6211\u4eec\u91c7\u7528\u4e00\u4e2a \\(O(n^2)\\) \u7b97\u6cd5\u6765\u6392\u5e8f\u8fd9\u4e9b\u5143\u7d20\uff0c\u5219\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u6808\u4e0e\u961f\u5217","text":"

    Abstract

    \u6808\u5982\u540c\u53e0\u732b\u732b\uff0c\u800c\u961f\u5217\u5c31\u50cf\u732b\u732b\u6392\u961f\u3002

    \u4e24\u8005\u5206\u522b\u4ee3\u8868\u5148\u5165\u540e\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u903b\u8f91\u5173\u7cfb\u3002

    "},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 5.1 \u00a0 \u6808
    • 5.2 \u00a0 \u961f\u5217
    • 5.3 \u00a0 \u53cc\u5411\u961f\u5217
    • 5.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u53cc\u5411\u961f\u5217","text":"

    \u5728\u961f\u5217\u4e2d\uff0c\u6211\u4eec\u4ec5\u80fd\u5220\u9664\u5934\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u3002\u5982\u56fe 5-7 \u6240\u793a\uff0c\u53cc\u5411\u961f\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u7075\u6d3b\u6027\uff0c\u5141\u8bb8\u5728\u5934\u90e8\u548c\u5c3e\u90e8\u6267\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u6216\u5220\u9664\u64cd\u4f5c\u3002

    \u56fe 5-7 \u00a0 \u53cc\u5411\u961f\u5217\u7684\u64cd\u4f5c

    "},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u53cc\u5411\u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u53cc\u5411\u961f\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u79f0\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

    \u8868 5-3 \u00a0 \u53cc\u5411\u961f\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push_first() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u9996 \\(O(1)\\) push_last() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop_first() \u5220\u9664\u961f\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u5220\u9664\u961f\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 \\(O(1)\\)

    \u540c\u6837\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u5df2\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\ndeq: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\ndeq.append(2)      # \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # \u6dfb\u52a0\u81f3\u961f\u9996\ndeq.appendleft(1)\n\n# \u8bbf\u95ee\u5143\u7d20\nfront: int = deq[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deq[-1]  # \u961f\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u961f\npop_front: int = deq.popleft()  # \u961f\u9996\u5143\u7d20\u51fa\u961f\npop_rear: int = deq.pop()       # \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deq)\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deq) == 0\n
    deque.cpp
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint front = deque.front(); // \u961f\u9996\u5143\u7d20\nint back = deque.back();   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.pop_front();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.pop_back();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = deque.empty();\n
    deque.java
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.pollFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.pollLast();    // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
    deque.cs
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c06\u94fe\u8868 LinkedList \u770b\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.AddLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.AddFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.RemoveFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.RemoveLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.Count == 0;\n
    deque_test.go
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.PushBack(2)      // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.PushFront(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfront := deque.Front() // \u961f\u9996\u5143\u7d20\nrear := deque.Back()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.Remove(front)    // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.Remove(rear)     // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := deque.Len() == 0\n
    deque.swift
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.append(2) // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.insert(1, at: 0)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nlet peekFirst = deque.first! // \u961f\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u4f7f\u7528 Array \u6a21\u62df\u65f6 popFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet popFirst = deque.removeFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nlet popLast = deque.removeLast() // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = deque.isEmpty\n
    deque.js
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty = size === 0;\n
    deque.ts
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty: boolean = size === 0;\n
    deque.dart
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u4e49\u4e3a\u53cc\u5411\u961f\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.addLast(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.addFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.first; // \u961f\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.removeFirst(); // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.removeLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.isEmpty;\n
    deque.rs
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u961f\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u961f\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop_front) = deque.pop_front() { // \u961f\u9996\u5143\u7d20\u51fa\u961f\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
    deque.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u53cc\u5411\u961f\u5217\n
    deque.kt
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2)  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u961f\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nval popFirst = deque.pollFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nval popLast = deque.pollLast()   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = deque.isEmpty()\n
    deque.rb
    # \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\n# Ruby \u6ca1\u6709\u5185\u76f4\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u961f\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#unshift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8bbf\u95ee\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u961f\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0c Array#shift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize = deque.length\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = size.zero?\n
    deque.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u53cc\u5411\u961f\u5217\u5b9e\u73b0 *","text":"

    \u53cc\u5411\u961f\u5217\u7684\u5b9e\u73b0\u4e0e\u961f\u5217\u7c7b\u4f3c\uff0c\u53ef\u4ee5\u9009\u62e9\u94fe\u8868\u6216\u6570\u7ec4\u4f5c\u4e3a\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

    "},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u7684\u5b9e\u73b0","text":"

    \u56de\u987e\u4e0a\u4e00\u8282\u5185\u5bb9\uff0c\u6211\u4eec\u4f7f\u7528\u666e\u901a\u5355\u5411\u94fe\u8868\u6765\u5b9e\u73b0\u961f\u5217\uff0c\u56e0\u4e3a\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u5220\u9664\u5934\u8282\u70b9\uff08\u5bf9\u5e94\u51fa\u961f\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0\u65b0\u8282\u70b9\uff08\u5bf9\u5e94\u5165\u961f\u64cd\u4f5c\uff09\u3002

    \u5bf9\u4e8e\u53cc\u5411\u961f\u5217\u800c\u8a00\uff0c\u5934\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u6267\u884c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u53cc\u5411\u961f\u5217\u9700\u8981\u5b9e\u73b0\u53e6\u4e00\u4e2a\u5bf9\u79f0\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u201c\u53cc\u5411\u94fe\u8868\u201d\u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

    \u5982\u56fe 5-8 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u53cc\u5411\u94fe\u8868\u7684\u5934\u8282\u70b9\u548c\u5c3e\u8282\u70b9\u89c6\u4e3a\u53cc\u5411\u961f\u5217\u7684\u961f\u9996\u548c\u961f\u5c3e\uff0c\u540c\u65f6\u5b9e\u73b0\u5728\u4e24\u7aef\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u7684\u529f\u80fd\u3002

    LinkedListDequepush_last()push_first()pop_last()pop_first()

    \u56fe 5-8 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
    class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        elif is_front:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n            # \u5220\u9664\u5934\u8282\u70b9\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            # \u5220\u9664\u5c3e\u8282\u70b9\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
    linkedlist_deque.cpp
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\n    int val;              // \u8282\u70b9\u503c\n    DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_deque.java
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    int val; // \u8282\u70b9\u503c\n    ListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    ListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_deque.cs
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(int val) {\n    public int val = val;       // \u8282\u70b9\u503c\n    public ListNode? next = null; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u5934\u8282\u70b9 front, \u5c3e\u8282\u70b9 rear\n    int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9                           \n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
    linkedlist_deque.go
    /* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
    linkedlist_deque.swift
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u5934\u8282\u70b9 front\n    private var rear: ListNode? // \u5c3e\u8282\u70b9 rear\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if isFront {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        let val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_deque.js
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val; // \u8282\u70b9\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    #front; // \u5934\u8282\u70b9 front\n    #rear; // \u5c3e\u8282\u70b9 rear\n    #queSize; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
    linkedlist_deque.ts
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val: number; // \u8282\u70b9\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u5934\u8282\u70b9 front\n    private rear: ListNode; // \u5c3e\u8282\u70b9 rear\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
    linkedlist_deque.dart
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u5bf9\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u5934\u8282\u70b9 _front\n  late ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u957f\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u961f\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u961f\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n      val = _front!.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n      // \u5220\u9664\u5934\u8282\u70b9\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n      val = _rear!.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      // \u5220\u9664\u5c3e\u8282\u70b9\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
    linkedlist_deque.rs
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\npub struct ListNode<T> {\n    pub val: T,                                 // \u8282\u70b9\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a71\u8282\u70b9\u6307\u9488\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u5934\u8282\u70b9\n                }\n            }\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u5934\u8282\u70b9\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
    linkedlist_deque.c
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\ntypedef struct DoublyListNode {\n    int val;                     // \u8282\u70b9\u503c\n    struct DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\n    struct DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n} DoublyListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n} LinkedListDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e deque \u7ed3\u6784\u4f53\n    free(deque);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    deque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
    linkedlist_deque.kt
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(var _val: Int) {\n    // \u8282\u70b9\u503c\n    var next: ListNode? = null // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u5934\u8282\u70b9 front\n    private var rear: ListNode? = null // \u5c3e\u8282\u70b9 rear\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++ // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize-- // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return _val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_deque.rb
    =begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u53cc\u5411\u94fe\u8868\u8282\u70b9\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  attr_accessor :prev # \u524d\u8eaf\u8282\u70b9\u5f15\u7528\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass LinkedListDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0     # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c \u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    elsif is_front\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size += 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u961f\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u6682\u5b58\u5934\u8282\u70b9\u503c\n      # \u5220\u9664\u5934\u8282\u70b9\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else\n      val = @rear.val # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      # \u5220\u9664\u5c3e\u8282\u70b9\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size -= 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    val\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
    linkedlist_deque.zig
    // \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u8282\u70b9\u503c\n        next: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n        prev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u6307\u9488\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u961f\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n            } else {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        } \n\n        // \u961f\u9996\u5165\u961f\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u961f\u5c3e\u5165\u961f\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u961f\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            var val: T = undefined;\n            // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n                // \u5220\u9664\u5934\u8282\u70b9\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n                // \u5220\u9664\u5c3e\u8282\u70b9\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n            return val;\n        } \n\n        // \u961f\u9996\u51fa\u961f\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u961f\u5c3e\u51fa\u961f\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
    "},{"location":"chapter_stack_and_queue/deque/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

    \u5982\u56fe 5-9 \u6240\u793a\uff0c\u4e0e\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7c7b\u4f3c\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528\u73af\u5f62\u6570\u7ec4\u6765\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u3002

    ArrayDequepush_last()push_first()pop_last()pop_first()

    \u56fe 5-9 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u5728\u961f\u5217\u7684\u5b9e\u73b0\u57fa\u7840\u4e0a\uff0c\u4ec5\u9700\u589e\u52a0\u201c\u961f\u9996\u5165\u961f\u201d\u548c\u201c\u961f\u5c3e\u51fa\u961f\u201d\u7684\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
    class ArrayDeque:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15\"\"\"\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        num = self.peek_first()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
    array_deque.cpp
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
    array_deque.java
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.cs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int Index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.go
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
    array_deque.swift
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
    array_deque.js
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.ts
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i: number): number {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.dart
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n  int index(int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 _front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u961f\u9996\u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
    array_deque.rs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: usize,    // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: usize, // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
    array_deque.c
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
    array_deque.kt
    /* \u6784\u9020\u65b9\u6cd5 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
    array_deque.rb
    ### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass ArrayDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    num = peek_first\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u961f\u5c3e\u51fa\u961f ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 ###\n  def index(i)\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
    array_deque.zig
    [class]{ArrayDeque}-[func]{}\n
    "},{"location":"chapter_stack_and_queue/deque/#533","title":"5.3.3 \u00a0 \u53cc\u5411\u961f\u5217\u5e94\u7528","text":"

    \u53cc\u5411\u961f\u5217\u517c\u5177\u6808\u4e0e\u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5b9e\u73b0\u8fd9\u4e24\u8005\u7684\u6240\u6709\u5e94\u7528\u573a\u666f\uff0c\u540c\u65f6\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

    \u6211\u4eec\u77e5\u9053\uff0c\u8f6f\u4ef6\u7684\u201c\u64a4\u9500\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u6808\u6765\u5b9e\u73b0\uff1a\u7cfb\u7edf\u5c06\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u6808\u4e2d\uff0c\u7136\u540e\u901a\u8fc7 pop \u5b9e\u73b0\u64a4\u9500\u3002\u7136\u800c\uff0c\u8003\u8651\u5230\u7cfb\u7edf\u8d44\u6e90\u7684\u9650\u5236\uff0c\u8f6f\u4ef6\u901a\u5e38\u4f1a\u9650\u5236\u64a4\u9500\u7684\u6b65\u6570\uff08\u4f8b\u5982\u4ec5\u5141\u8bb8\u4fdd\u5b58 \\(50\\) \u6b65\uff09\u3002\u5f53\u6808\u7684\u957f\u5ea6\u8d85\u8fc7 \\(50\\) \u65f6\uff0c\u8f6f\u4ef6\u9700\u8981\u5728\u6808\u5e95\uff08\u961f\u9996\uff09\u6267\u884c\u5220\u9664\u64cd\u4f5c\u3002\u4f46\u6808\u65e0\u6cd5\u5b9e\u73b0\u8be5\u529f\u80fd\uff0c\u6b64\u65f6\u5c31\u9700\u8981\u4f7f\u7528\u53cc\u5411\u961f\u5217\u6765\u66ff\u4ee3\u6808\u3002\u8bf7\u6ce8\u610f\uff0c\u201c\u64a4\u9500\u201d\u7684\u6838\u5fc3\u903b\u8f91\u4ecd\u7136\u9075\u5faa\u6808\u7684\u5148\u5165\u540e\u51fa\u539f\u5219\uff0c\u53ea\u662f\u53cc\u5411\u961f\u5217\u80fd\u591f\u66f4\u52a0\u7075\u6d3b\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u903b\u8f91\u3002

    "},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u961f\u5217","text":"

    \u961f\u5217\uff08queue\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u89c4\u5219\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u987e\u540d\u601d\u4e49\uff0c\u961f\u5217\u6a21\u62df\u4e86\u6392\u961f\u73b0\u8c61\uff0c\u5373\u65b0\u6765\u7684\u4eba\u4e0d\u65ad\u52a0\u5165\u961f\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u4e8e\u961f\u5217\u5934\u90e8\u7684\u4eba\u9010\u4e2a\u79bb\u5f00\u3002

    \u5982\u56fe 5-4 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u961f\u5217\u5934\u90e8\u79f0\u4e3a\u201c\u961f\u9996\u201d\uff0c\u5c3e\u90e8\u79f0\u4e3a\u201c\u961f\u5c3e\u201d\uff0c\u5c06\u628a\u5143\u7d20\u52a0\u5165\u961f\u5c3e\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u5165\u961f\u201d\uff0c\u5220\u9664\u961f\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u51fa\u961f\u201d\u3002

    \u56fe 5-4 \u00a0 \u961f\u5217\u7684\u5148\u5165\u5148\u51fa\u89c4\u5219

    "},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u961f\u5217\u7684\u5e38\u89c1\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u65b9\u6cd5\u540d\u79f0\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002\u6211\u4eec\u5728\u6b64\u91c7\u7528\u4e0e\u6808\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

    \u8868 5-2 \u00a0 \u961f\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u961f\uff0c\u5373\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop() \u961f\u9996\u5143\u7d20\u51fa\u961f \\(O(1)\\) peek() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\)

    \u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u73b0\u6210\u7684\u961f\u5217\u7c7b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u961f\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u5c06\u53cc\u5411\u961f\u5217\u7c7b deque \u5f53\u4f5c\u961f\u5217\u4f7f\u7528\n# \u867d\u7136 queue.Queue() \u662f\u7eaf\u6b63\u7684\u961f\u5217\u7c7b\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u8350\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8bbf\u95ee\u961f\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u961f\npop: int = que.popleft()\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(que)\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(que) == 0\n
    queue.cpp
    /* \u521d\u59cb\u5316\u961f\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u961f */\nqueue.pop();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = queue.empty();\n
    queue.java
    /* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.poll();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
    queue.cs
    /* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.Dequeue();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.Count == 0;\n
    queue_test.go
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u961f\u5217\u6765\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u961f */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := queue.Len() == 0\n
    queue.swift
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u7531\u4e8e\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 removeFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet pool = queue.removeFirst()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = queue.isEmpty\n
    queue.js
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
    queue.ts
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
    queue.dart
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u961f\u5217\u7c7b Qeque \u662f\u53cc\u5411\u961f\u5217\uff0c\u4e5f\u53ef\u4f5c\u4e3a\u961f\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.removeFirst();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.isEmpty;\n
    queue.rs
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u53cc\u5411\u961f\u5217\u4f5c\u4e3a\u666e\u901a\u961f\u5217\u6765\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
    queue.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u961f\u5217\n
    queue.kt
    /* \u521d\u59cb\u5316\u961f\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u961f */\nval pop = queue.poll()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = queue.isEmpty()\n
    queue.rb
    # \u521d\u59cb\u5316\u961f\u5217\n# Ruby \u5185\u7f6e\u7684\u961f\u5217\uff08Thread::Queue) \u6ca1\u6709 peek \u548c\u904d\u5386\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u961f\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8bbf\u95ee\u961f\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u961f\n# \u6e05\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#shift \u65b9\u6cd5\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop = queue.shift\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize = queue.length\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = queue.empty?\n
    queue.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u961f\u5217\u5b9e\u73b0","text":"

    \u4e3a\u4e86\u5b9e\u73b0\u961f\u5217\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u6dfb\u52a0\u5143\u7d20\uff0c\u5e76\u5728\u53e6\u4e00\u7aef\u5220\u9664\u5143\u7d20\uff0c\u94fe\u8868\u548c\u6570\u7ec4\u90fd\u7b26\u5408\u8981\u6c42\u3002

    "},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

    \u5982\u56fe 5-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u201c\u5934\u8282\u70b9\u201d\u548c\u201c\u5c3e\u8282\u70b9\u201d\u5206\u522b\u89c6\u4e3a\u201c\u961f\u9996\u201d\u548c\u201c\u961f\u5c3e\u201d\uff0c\u89c4\u5b9a\u961f\u5c3e\u4ec5\u53ef\u6dfb\u52a0\u8282\u70b9\uff0c\u961f\u9996\u4ec5\u53ef\u5220\u9664\u8282\u70b9\u3002

    LinkedListQueuepush()pop()

    \u56fe 5-5 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u7528\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
    class LinkedListQueue:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        node = ListNode(num)\n        # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num = self.peek()\n        # \u5220\u9664\u5934\u8282\u70b9\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
    linkedlist_queue.cpp
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_queue.java
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.cs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.go
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u961f\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
    linkedlist_queue.swift
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u5934\u8282\u70b9\n    private var rear: ListNode? // \u5c3e\u8282\u70b9\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_queue.js
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    #front; // \u5934\u8282\u70b9 #front\n    #rear; // \u5c3e\u8282\u70b9 #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.ts
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u5934\u8282\u70b9 front\n    private rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.dart
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u5934\u8282\u70b9 _front\n  ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    final int _num = peek();\n    // \u5220\u9664\u5934\u8282\u70b9\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u961f\u5217\u4e3a\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
    linkedlist_queue.rs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
    linkedlist_queue.c
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e queue \u7ed3\u6784\u4f53\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
    linkedlist_queue.kt
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue(\n    // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        val node = ListNode(num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_queue.rb
    ### \u57fa\u4e8e\u94fe\u8868\u5934\u73b0\u7684\u961f\u5217 ###\nclass LinkedListQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\uff0c\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u4ee4\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u5220\u9664\u5934\u8282\u70b9\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c06\u94fe\u8868\u4e3a Array \u5e76\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
    linkedlist_queue.zig
    // \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                            // \u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u5220\u9664\u5934\u8282\u70b9\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

    \u5728\u6570\u7ec4\u4e2d\u5220\u9664\u9996\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4f1a\u5bfc\u81f4\u51fa\u961f\u64cd\u4f5c\u6548\u7387\u8f83\u4f4e\u3002\u7136\u800c\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u6765\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u3002

    \u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf front \u6307\u5411\u961f\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u5e76\u7ef4\u62a4\u4e00\u4e2a\u53d8\u91cf size \u7528\u4e8e\u8bb0\u5f55\u961f\u5217\u957f\u5ea6\u3002\u5b9a\u4e49 rear = front + size \uff0c\u8fd9\u4e2a\u516c\u5f0f\u8ba1\u7b97\u51fa\u7684 rear \u6307\u5411\u961f\u5c3e\u5143\u7d20\u4e4b\u540e\u7684\u4e0b\u4e00\u4e2a\u4f4d\u7f6e\u3002

    \u57fa\u4e8e\u6b64\u8bbe\u8ba1\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u533a\u95f4\u4e3a [front, rear - 1]\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u6cd5\u5982\u56fe 5-6 \u6240\u793a\u3002

    • \u5165\u961f\u64cd\u4f5c\uff1a\u5c06\u8f93\u5165\u5143\u7d20\u8d4b\u503c\u7ed9 rear \u7d22\u5f15\u5904\uff0c\u5e76\u5c06 size \u589e\u52a0 1 \u3002
    • \u51fa\u961f\u64cd\u4f5c\uff1a\u53ea\u9700\u5c06 front \u589e\u52a0 1 \uff0c\u5e76\u5c06 size \u51cf\u5c11 1 \u3002

    \u53ef\u4ee5\u770b\u5230\uff0c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u90fd\u53ea\u9700\u8fdb\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002

    ArrayQueuepush()pop()

    \u56fe 5-6 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u4e00\u4e2a\u95ee\u9898\uff1a\u5728\u4e0d\u65ad\u8fdb\u884c\u5165\u961f\u548c\u51fa\u961f\u7684\u8fc7\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52a8\uff0c\u5f53\u5b83\u4eec\u5230\u8fbe\u6570\u7ec4\u5c3e\u90e8\u65f6\u5c31\u65e0\u6cd5\u7ee7\u7eed\u79fb\u52a8\u4e86\u3002\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u89c6\u4e3a\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u73af\u5f62\u6570\u7ec4\u201d\u3002

    \u5bf9\u4e8e\u73af\u5f62\u6570\u7ec4\uff0c\u6211\u4eec\u9700\u8981\u8ba9 front \u6216 rear \u5728\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u76f4\u63a5\u56de\u5230\u6570\u7ec4\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002\u8fd9\u79cd\u5468\u671f\u6027\u89c4\u5f8b\u53ef\u4ee5\u901a\u8fc7\u201c\u53d6\u4f59\u64cd\u4f5c\u201d\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
    class ArrayQueue:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n        self._front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        self._size: int = 0  # \u961f\u5217\u957f\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u961f\u5217\u5df2\u6ee1\")\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num: int = self.peek()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
    array_queue.cpp
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u961f\u5217\u957f\u5ea6\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
    array_queue.java
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
    array_queue.cs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
    array_queue.go
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n    // \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
    array_queue.swift
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u961f\u5217\u957f\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
    array_queue.js
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front = 0; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
    array_queue.ts
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
    array_queue.dart
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u4e8e\u50a8\u5b58\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u961f\u5217\u957f\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    int _num = peek();\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
    array_queue.rs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: i32,        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: i32,     // \u961f\u5217\u957f\u5ea6\n    que_capacity: i32, // \u961f\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u961f */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
    array_queue.c
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u961f */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u961f */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
    array_queue.kt
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
    array_queue.rb
    ### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 ###\nclass ArrayQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    @front = 0 # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    @size = 0 # \u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    raise IndexError, '\u961f\u5217\u5df2\u6ee1' if size == capacity\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear = (@front + size) % capacity\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
    array_queue.zig
    // \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \n        cap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\n                return;\n            }\n            // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n            // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4ee5\u4e0a\u5b9e\u73b0\u7684\u961f\u5217\u4ecd\u7136\u5177\u6709\u5c40\u9650\u6027\uff1a\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u7136\u800c\uff0c\u8fd9\u4e2a\u95ee\u9898\u4e0d\u96be\u89e3\u51b3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u66ff\u6362\u4e3a\u52a8\u6001\u6570\u7ec4\uff0c\u4ece\u800c\u5f15\u5165\u6269\u5bb9\u673a\u5236\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u5c1d\u8bd5\u81ea\u884c\u5b9e\u73b0\u3002

    \u4e24\u79cd\u5b9e\u73b0\u7684\u5bf9\u6bd4\u7ed3\u8bba\u4e0e\u6808\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

    "},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u961f\u5217\u5178\u578b\u5e94\u7528","text":"
    • \u6dd8\u5b9d\u8ba2\u5355\u3002\u8d2d\u7269\u8005\u4e0b\u5355\u540e\uff0c\u8ba2\u5355\u5c06\u52a0\u5165\u961f\u5217\u4e2d\uff0c\u7cfb\u7edf\u968f\u540e\u4f1a\u6839\u636e\u987a\u5e8f\u5904\u7406\u961f\u5217\u4e2d\u7684\u8ba2\u5355\u3002\u5728\u53cc\u5341\u4e00\u671f\u95f4\uff0c\u77ed\u65f6\u95f4\u5185\u4f1a\u4ea7\u751f\u6d77\u91cf\u8ba2\u5355\uff0c\u9ad8\u5e76\u53d1\u6210\u4e3a\u5de5\u7a0b\u5e08\u4eec\u9700\u8981\u91cd\u70b9\u653b\u514b\u7684\u95ee\u9898\u3002
    • \u5404\u7c7b\u5f85\u529e\u4e8b\u9879\u3002\u4efb\u4f55\u9700\u8981\u5b9e\u73b0\u201c\u5148\u6765\u540e\u5230\u201d\u529f\u80fd\u7684\u573a\u666f\uff0c\u4f8b\u5982\u6253\u5370\u673a\u7684\u4efb\u52a1\u961f\u5217\u3001\u9910\u5385\u7684\u51fa\u9910\u961f\u5217\u7b49\uff0c\u961f\u5217\u5728\u8fd9\u4e9b\u573a\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7ef4\u62a4\u5904\u7406\u987a\u5e8f\u3002
    "},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u6808","text":"

    \u6808\uff08stack\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u903b\u8f91\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002

    \u6211\u4eec\u53ef\u4ee5\u5c06\u6808\u7c7b\u6bd4\u4e3a\u684c\u9762\u4e0a\u7684\u4e00\u645e\u76d8\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76d8\u5b50\uff0c\u5219\u9700\u8981\u5148\u5c06\u4e0a\u9762\u7684\u76d8\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u4eec\u5c06\u76d8\u5b50\u66ff\u6362\u4e3a\u5404\u79cd\u7c7b\u578b\u7684\u5143\u7d20\uff08\u5982\u6574\u6570\u3001\u5b57\u7b26\u3001\u5bf9\u8c61\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u6808\u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u3002

    \u5982\u56fe 5-1 \u6240\u793a\uff0c\u6211\u4eec\u628a\u5806\u53e0\u5143\u7d20\u7684\u9876\u90e8\u79f0\u4e3a\u201c\u6808\u9876\u201d\uff0c\u5e95\u90e8\u79f0\u4e3a\u201c\u6808\u5e95\u201d\u3002\u5c06\u628a\u5143\u7d20\u6dfb\u52a0\u5230\u6808\u9876\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u6808\u201d\uff0c\u5220\u9664\u6808\u9876\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u6808\u201d\u3002

    \u56fe 5-1 \u00a0 \u6808\u7684\u5148\u5165\u540e\u51fa\u89c4\u5219

    "},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u6808\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u6808\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u4eec\u4ee5\u5e38\u89c1\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u4e3a\u4f8b\u3002

    \u8868 5-1 \u00a0 \u6808\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5 \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u6808\uff08\u6dfb\u52a0\u81f3\u6808\u9876\uff09 \\(O(1)\\) pop() \u6808\u9876\u5143\u7d20\u51fa\u6808 \\(O(1)\\) peek() \u8bbf\u95ee\u6808\u9876\u5143\u7d20 \\(O(1)\\)

    \u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u6808\u7c7b\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8bed\u8a00\u53ef\u80fd\u6ca1\u6709\u4e13\u95e8\u63d0\u4f9b\u6808\u7c7b\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u5c06\u8be5\u8bed\u8a00\u7684\u201c\u6570\u7ec4\u201d\u6216\u201c\u94fe\u8868\u201d\u5f53\u4f5c\u6808\u6765\u4f7f\u7528\uff0c\u5e76\u5728\u7a0b\u5e8f\u903b\u8f91\u4e0a\u5ffd\u7565\u4e0e\u6808\u65e0\u5173\u7684\u64cd\u4f5c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
    # \u521d\u59cb\u5316\u6808\n# Python \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a list \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u6808\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u6808\npop: int = stack.pop()\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(stack) == 0\n
    stack.cpp
    /* \u521d\u59cb\u5316\u6808 */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u6808 */\nstack.pop(); // \u65e0\u8fd4\u56de\u503c\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool empty = stack.empty();\n
    stack.java
    /* \u521d\u59cb\u5316\u6808 */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
    stack.cs
    /* \u521d\u59cb\u5316\u6808 */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.Pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.Count == 0;\n
    stack_test.go
    /* \u521d\u59cb\u5316\u6808 */\n// \u5728 Go \u4e2d\uff0c\u63a8\u8350\u5c06 Slice \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u6808 */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u6808 */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(stack) == 0\n
    stack.swift
    /* \u521d\u59cb\u5316\u6808 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.removeLast()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = stack.isEmpty\n
    stack.js
    /* \u521d\u59cb\u5316\u6808 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.ts
    /* \u521d\u59cb\u5316\u6808 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.dart
    /* \u521d\u59cb\u5316\u6808 */\n// Dart \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a List \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.removeLast();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.isEmpty;\n
    stack.rs
    /* \u521d\u59cb\u5316\u6808 */\n// \u628a Vec \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.pop().unwrap();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = stack.is_empty();\n
    stack.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u6808\n
    stack.kt
    /* \u521d\u59cb\u5316\u6808 */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u6808 */\nval pop = stack.pop()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = stack.isEmpty()\n
    stack.rb
    # \u521d\u59cb\u5316\u6808\n# Ruby \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u6808\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u6808\npop = stack.pop\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize = stack.length\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty = stack.empty?\n
    stack.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u6808\u7684\u5b9e\u73b0","text":"

    \u4e3a\u4e86\u6df1\u5165\u4e86\u89e3\u6808\u7684\u8fd0\u884c\u673a\u5236\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u6808\u7c7b\u3002

    \u6808\u9075\u5faa\u5148\u5165\u540e\u51fa\u7684\u539f\u5219\uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u80fd\u5728\u6808\u9876\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u6dfb\u52a0\u548c\u5220\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u6808\u53ef\u4ee5\u89c6\u4e3a\u4e00\u79cd\u53d7\u9650\u5236\u7684\u6570\u7ec4\u6216\u94fe\u8868\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u201c\u5c4f\u853d\u201d\u6570\u7ec4\u6216\u94fe\u8868\u7684\u90e8\u5206\u65e0\u5173\u64cd\u4f5c\uff0c\u4f7f\u5176\u5bf9\u5916\u8868\u73b0\u7684\u903b\u8f91\u7b26\u5408\u6808\u7684\u7279\u6027\u3002

    "},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

    \u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u5934\u8282\u70b9\u89c6\u4e3a\u6808\u9876\uff0c\u5c3e\u8282\u70b9\u89c6\u4e3a\u6808\u5e95\u3002

    \u5982\u56fe 5-2 \u6240\u793a\uff0c\u5bf9\u4e8e\u5165\u6808\u64cd\u4f5c\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u5143\u7d20\u63d2\u5165\u94fe\u8868\u5934\u90e8\uff0c\u8fd9\u79cd\u8282\u70b9\u63d2\u5165\u65b9\u6cd5\u88ab\u79f0\u4e3a\u201c\u5934\u63d2\u6cd5\u201d\u3002\u800c\u5bf9\u4e8e\u51fa\u6808\u64cd\u4f5c\uff0c\u53ea\u9700\u5c06\u5934\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u5373\u53ef\u3002

    LinkedListStackpush()pop()

    \u56fe 5-2 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u793a\u4f8b\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
    class LinkedListStack:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u6808\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
    linkedlist_stack.cpp
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize;        // \u6808\u7684\u957f\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_stack.java
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private int stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.cs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.go
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u6808\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
    linkedlist_stack.swift
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var _size: Int // \u6808\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_stack.js
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    #stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    #stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.ts
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.dart
    /* \u57fa\u4e8e\u94fe\u8868\u7c7b\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n  int _stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a List \u5e76\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
    linkedlist_stack.rs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    stk_size: usize,                              // \u6808\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u6808 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
    linkedlist_stack.c
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    ListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int size;      // \u6808\u7684\u957f\u5ea6\n} LinkedListStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\n    s->top = node;       // \u66f4\u65b0\u6808\u9876\n    s->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u6808 */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n    s->size--;\n    return val;\n}\n
    linkedlist_stack.kt
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var stkSize: Int = 0 // \u6808\u7684\u957f\u5ea6\n) {\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_stack.rb
    ### \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u6808 ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
    linkedlist_stack.zig
    // \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n        stk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

    \u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u7684\u5c3e\u90e8\u4f5c\u4e3a\u6808\u9876\u3002\u5982\u56fe 5-3 \u6240\u793a\uff0c\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u5206\u522b\u5bf9\u5e94\u5728\u6570\u7ec4\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u4e0e\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(1)\\) \u3002

    ArrayStackpush()pop()

    \u56fe 5-3 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

    \u7531\u4e8e\u5165\u6808\u7684\u5143\u7d20\u53ef\u80fd\u4f1a\u6e90\u6e90\u4e0d\u65ad\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff0c\u8fd9\u6837\u5c31\u65e0\u987b\u81ea\u884c\u5904\u7406\u6570\u7ec4\u6269\u5bb9\u95ee\u9898\u3002\u4ee5\u4e0b\u4e3a\u793a\u4f8b\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
    class ArrayStack:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u6808\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        return self._stack\n
    array_stack.cpp
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
    array_stack.java
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
    array_stack.cs
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
    array_stack.go
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\n    data []int // \u6570\u636e\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
    array_stack.swift
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = []\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
    array_stack.js
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
    array_stack.ts
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
    array_stack.dart
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c06\u6808\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
    array_stack.rs
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u6808 */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u6808\u4e3a\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
    array_stack.c
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u6808\u5df2\u6ee1\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u6808 */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
    array_stack.kt
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
    array_stack.rb
    ### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 ###\nclass ArrayStack\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u83b7\u53d6\u6808\u7684\u957f\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u6808 ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
    array_stack.zig
    // \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u4e24\u79cd\u5b9e\u73b0\u5bf9\u6bd4","text":"

    \u652f\u6301\u64cd\u4f5c

    \u4e24\u79cd\u5b9e\u73b0\u90fd\u652f\u6301\u6808\u5b9a\u4e49\u4e2d\u7684\u5404\u9879\u64cd\u4f5c\u3002\u6570\u7ec4\u5b9e\u73b0\u989d\u5916\u652f\u6301\u968f\u673a\u8bbf\u95ee\uff0c\u4f46\u8fd9\u5df2\u8d85\u51fa\u4e86\u6808\u7684\u5b9a\u4e49\u8303\u7574\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u4f1a\u7528\u5230\u3002

    \u65f6\u95f4\u6548\u7387

    \u5728\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0\u4e2d\uff0c\u5165\u6808\u548c\u51fa\u6808\u64cd\u4f5c\u90fd\u5728\u9884\u5148\u5206\u914d\u597d\u7684\u8fde\u7eed\u5185\u5b58\u4e2d\u8fdb\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u7f13\u5b58\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f83\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u6808\u65f6\u8d85\u51fa\u6570\u7ec4\u5bb9\u91cf\uff0c\u4f1a\u89e6\u53d1\u6269\u5bb9\u673a\u5236\uff0c\u5bfc\u81f4\u8be5\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53d8\u4e3a \\(O(n)\\) \u3002

    \u5728\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0\u4e2d\uff0c\u94fe\u8868\u7684\u6269\u5bb9\u975e\u5e38\u7075\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u6570\u7ec4\u6269\u5bb9\u65f6\u6548\u7387\u964d\u4f4e\u7684\u95ee\u9898\u3002\u4f46\u662f\uff0c\u5165\u6808\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u8282\u70b9\u5bf9\u8c61\u5e76\u4fee\u6539\u6307\u9488\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5bf9\u8f83\u4f4e\u3002\u4e0d\u8fc7\uff0c\u5982\u679c\u5165\u6808\u5143\u7d20\u672c\u8eab\u5c31\u662f\u8282\u70b9\u5bf9\u8c61\uff0c\u90a3\u4e48\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9aa4\uff0c\u4ece\u800c\u63d0\u9ad8\u6548\u7387\u3002

    \u7efc\u4e0a\u6240\u8ff0\uff0c\u5f53\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u6570\u636e\u7c7b\u578b\u65f6\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

    • \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u5728\u89e6\u53d1\u6269\u5bb9\u65f6\u6548\u7387\u4f1a\u964d\u4f4e\uff0c\u4f46\u7531\u4e8e\u6269\u5bb9\u662f\u4f4e\u9891\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    • \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002

    \u7a7a\u95f4\u6548\u7387

    \u5728\u521d\u59cb\u5316\u5217\u8868\u65f6\uff0c\u7cfb\u7edf\u4f1a\u4e3a\u5217\u8868\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8be5\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\uff1b\u5e76\u4e14\uff0c\u6269\u5bb9\u673a\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u8fdb\u884c\u6269\u5bb9\u7684\uff0c\u6269\u5bb9\u540e\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002

    \u7136\u800c\uff0c\u7531\u4e8e\u94fe\u8868\u8282\u70b9\u9700\u8981\u989d\u5916\u5b58\u50a8\u6307\u9488\uff0c\u56e0\u6b64\u94fe\u8868\u8282\u70b9\u5360\u7528\u7684\u7a7a\u95f4\u76f8\u5bf9\u8f83\u5927\u3002

    \u7efc\u4e0a\uff0c\u6211\u4eec\u4e0d\u80fd\u7b80\u5355\u5730\u786e\u5b9a\u54ea\u79cd\u5b9e\u73b0\u66f4\u52a0\u8282\u7701\u5185\u5b58\uff0c\u9700\u8981\u9488\u5bf9\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

    "},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u6808\u7684\u5178\u578b\u5e94\u7528","text":"
    • \u6d4f\u89c8\u5668\u4e2d\u7684\u540e\u9000\u4e0e\u524d\u8fdb\u3001\u8f6f\u4ef6\u4e2d\u7684\u64a4\u9500\u4e0e\u53cd\u64a4\u9500\u3002\u6bcf\u5f53\u6211\u4eec\u6253\u5f00\u65b0\u7684\u7f51\u9875\uff0c\u6d4f\u89c8\u5668\u5c31\u4f1a\u5bf9\u4e0a\u4e00\u4e2a\u7f51\u9875\u6267\u884c\u5165\u6808\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u540e\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u4e2a\u7f51\u9875\u3002\u540e\u9000\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u5728\u6267\u884c\u51fa\u6808\u3002\u5982\u679c\u8981\u540c\u65f6\u652f\u6301\u540e\u9000\u548c\u524d\u8fdb\uff0c\u90a3\u4e48\u9700\u8981\u4e24\u4e2a\u6808\u6765\u914d\u5408\u5b9e\u73b0\u3002
    • \u7a0b\u5e8f\u5185\u5b58\u7ba1\u7406\u3002\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u5728\u6808\u9876\u6dfb\u52a0\u4e00\u4e2a\u6808\u5e27\uff0c\u7528\u4e8e\u8bb0\u5f55\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\u3002\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u5411\u4e0b\u9012\u63a8\u9636\u6bb5\u4f1a\u4e0d\u65ad\u6267\u884c\u5165\u6808\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u9636\u6bb5\u5219\u4f1a\u4e0d\u65ad\u6267\u884c\u51fa\u6808\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u6808\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002
    • \u5728\u65f6\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u5177\u6709\u8f83\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u6269\u5bb9\u8fc7\u7a0b\u4e2d\uff0c\u5355\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u6808\u7684\u94fe\u8868\u5b9e\u73b0\u5177\u6709\u66f4\u4e3a\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002
    • \u5728\u7a7a\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u53ef\u80fd\u5bfc\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u94fe\u8868\u8282\u70b9\u6240\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u6bd4\u6570\u7ec4\u5143\u7d20\u66f4\u5927\u3002
    • \u961f\u5217\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u540c\u6837\u53ef\u4ee5\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u7684\u5bf9\u6bd4\u4e0a\uff0c\u961f\u5217\u7684\u7ed3\u8bba\u4e0e\u524d\u8ff0\u6808\u7684\u7ed3\u8bba\u76f8\u4f3c\u3002
    • \u53cc\u5411\u961f\u5217\u662f\u4e00\u79cd\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u961f\u5217\uff0c\u5b83\u5141\u8bb8\u5728\u4e24\u7aef\u8fdb\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u662f\u5426\u662f\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\uff1f

    \u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u529f\u80fd\u672c\u8d28\u4e0a\u662f\u201c\u6808\u201d\u7684\u4f53\u73b0\u3002\u5f53\u7528\u6237\u8bbf\u95ee\u4e00\u4e2a\u65b0\u9875\u9762\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u88ab\u6dfb\u52a0\u5230\u6808\u9876\uff1b\u5f53\u7528\u6237\u70b9\u51fb\u540e\u9000\u6309\u94ae\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u4ece\u6808\u9876\u5f39\u51fa\u3002\u4f7f\u7528\u53cc\u5411\u961f\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u64cd\u4f5c\uff0c\u8fd9\u4e2a\u5728\u201c\u53cc\u5411\u961f\u5217\u201d\u7ae0\u8282\u6709\u63d0\u5230\u3002

    Q\uff1a\u5728\u51fa\u6808\u540e\uff0c\u662f\u5426\u9700\u8981\u91ca\u653e\u51fa\u6808\u8282\u70b9\u7684\u5185\u5b58\uff1f

    \u5982\u679c\u540e\u7eed\u4ecd\u9700\u8981\u4f7f\u7528\u5f39\u51fa\u8282\u70b9\uff0c\u5219\u4e0d\u9700\u8981\u91ca\u653e\u5185\u5b58\u3002\u82e5\u4e4b\u540e\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8bed\u8a00\u62e5\u6709\u81ea\u52a8\u5783\u573e\u56de\u6536\u673a\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\u3002

    Q\uff1a\u53cc\u5411\u961f\u5217\u50cf\u662f\u4e24\u4e2a\u6808\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u4e48\uff1f

    \u53cc\u5411\u961f\u5217\u5c31\u50cf\u662f\u6808\u548c\u961f\u5217\u7684\u7ec4\u5408\u6216\u4e24\u4e2a\u6808\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73b0\u7684\u662f\u6808 + \u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u53ef\u4ee5\u5b9e\u73b0\u6808\u4e0e\u961f\u5217\u7684\u6240\u6709\u5e94\u7528\uff0c\u5e76\u4e14\u66f4\u52a0\u7075\u6d3b\u3002

    Q\uff1a\u64a4\u9500\uff08undo\uff09\u548c\u53cd\u64a4\u9500\uff08redo\uff09\u5177\u4f53\u662f\u5982\u4f55\u5b9e\u73b0\u7684\uff1f

    \u4f7f\u7528\u4e24\u4e2a\u6808\uff0c\u6808 A \u7528\u4e8e\u64a4\u9500\uff0c\u6808 B \u7528\u4e8e\u53cd\u64a4\u9500\u3002

    1. \u6bcf\u5f53\u7528\u6237\u6267\u884c\u4e00\u4e2a\u64cd\u4f5c\uff0c\u5c06\u8fd9\u4e2a\u64cd\u4f5c\u538b\u5165\u6808 A \uff0c\u5e76\u6e05\u7a7a\u6808 B \u3002
    2. \u5f53\u7528\u6237\u6267\u884c\u201c\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 A \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 B \u3002
    3. \u5f53\u7528\u6237\u6267\u884c\u201c\u53cd\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 B \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 A \u3002
    "},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6811","text":"

    Abstract

    \u53c2\u5929\u5927\u6811\u5145\u6ee1\u751f\u547d\u529b\uff0c\u6839\u6df1\u53f6\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

    \u5b83\u4e3a\u6211\u4eec\u5c55\u73b0\u4e86\u6570\u636e\u5206\u6cbb\u7684\u751f\u52a8\u5f62\u6001\u3002

    "},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 7.1 \u00a0 \u4e8c\u53c9\u6811
    • 7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386
    • 7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a
    • 7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811
    • 7.5 \u00a0 AVL \u6811 *
    • 7.6 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a","text":"

    \u5728\u94fe\u8868\u8868\u793a\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u5b58\u50a8\u5355\u5143\u4e3a\u8282\u70b9 TreeNode \uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u76f8\u8fde\u63a5\u3002\u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u94fe\u8868\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7684\u5404\u9879\u57fa\u672c\u64cd\u4f5c\u3002

    \u90a3\u4e48\uff0c\u6211\u4eec\u80fd\u5426\u7528\u6570\u7ec4\u6765\u8868\u793a\u4e8c\u53c9\u6811\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

    "},{"location":"chapter_tree/array_representation_of_tree/#731","title":"7.3.1 \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

    \u5148\u5206\u6790\u4e00\u4e2a\u7b80\u5355\u6848\u4f8b\u3002\u7ed9\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u6211\u4eec\u5c06\u6240\u6709\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u5b58\u50a8\u5728\u4e00\u4e2a\u6570\u7ec4\u4e2d\uff0c\u5219\u6bcf\u4e2a\u8282\u70b9\u90fd\u5bf9\u5e94\u552f\u4e00\u7684\u6570\u7ec4\u7d22\u5f15\u3002

    \u6839\u636e\u5c42\u5e8f\u904d\u5386\u7684\u7279\u6027\uff0c\u6211\u4eec\u53ef\u4ee5\u63a8\u5bfc\u51fa\u7236\u8282\u70b9\u7d22\u5f15\u4e0e\u5b50\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u201c\u6620\u5c04\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(i\\) \uff0c\u5219\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 2\\) \u3002\u56fe 7-12 \u5c55\u793a\u4e86\u5404\u4e2a\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u6620\u5c04\u5173\u7cfb\u3002

    \u56fe 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

    \u6620\u5c04\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u5f53\u4e8e\u94fe\u8868\u4e2d\u7684\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u7ed9\u5b9a\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u8282\u70b9\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u901a\u8fc7\u6620\u5c04\u516c\u5f0f\u6765\u8bbf\u95ee\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3002

    "},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u53c9\u6811","text":"

    \u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u4e00\u4e2a\u7279\u4f8b\uff0c\u5728\u4e8c\u53c9\u6811\u7684\u4e2d\u95f4\u5c42\u901a\u5e38\u5b58\u5728\u8bb8\u591a None \u3002\u7531\u4e8e\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5e76\u4e0d\u5305\u542b\u8fd9\u4e9b None \uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u6cd5\u4ec5\u51ed\u8be5\u5e8f\u5217\u6765\u63a8\u6d4b None \u7684\u6570\u91cf\u548c\u5206\u5e03\u4f4d\u7f6e\u3002\u8fd9\u610f\u5473\u7740\u5b58\u5728\u591a\u79cd\u4e8c\u53c9\u6811\u7ed3\u6784\u90fd\u7b26\u5408\u8be5\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002

    \u5982\u56fe 7-13 \u6240\u793a\uff0c\u7ed9\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u4e0a\u8ff0\u6570\u7ec4\u8868\u793a\u65b9\u6cd5\u5df2\u7ecf\u5931\u6548\u3002

    \u56fe 7-13 \u00a0 \u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5bf9\u5e94\u591a\u79cd\u4e8c\u53c9\u6811\u53ef\u80fd\u6027

    \u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u4e2d\u663e\u5f0f\u5730\u5199\u51fa\u6240\u6709 None \u3002\u5982\u56fe 7-14 \u6240\u793a\uff0c\u8fd9\u6837\u5904\u7406\u540e\uff0c\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u53c9\u6811\u4e86\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\n# \u4f7f\u7528 None \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6807\u8bb0\u7a7a\u4f4d\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88c5\u7c7b Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 any \u7c7b\u578b\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 None \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6807\u8bb0\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u8282\u70b9\u503c\u4e0d\u80fd\u4e3a INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
    ### \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a ###\n# \u4f7f\u7528 nil \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    \n

    \u56fe 7-14 \u00a0 \u4efb\u610f\u7c7b\u578b\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u4f7f\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u56de\u987e\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u5b9a\u4e49\uff0cNone \u53ea\u51fa\u73b0\u5728\u6700\u5e95\u5c42\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73b0\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u672b\u5c3e\u3002

    \u8fd9\u610f\u5473\u7740\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u5b8c\u5168\u4e8c\u53c9\u6811\u65f6\uff0c\u53ef\u4ee5\u7701\u7565\u5b58\u50a8\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u56fe 7-15 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u4f8b\u5b50\u3002

    \u56fe 7-15 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

    \u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u68f5\u57fa\u4e8e\u6570\u7ec4\u8868\u793a\u7684\u4e8c\u53c9\u6811\uff0c\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u64cd\u4f5c\u3002

    • \u7ed9\u5b9a\u67d0\u8282\u70b9\uff0c\u83b7\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3001\u7236\u8282\u70b9\u3002
    • \u83b7\u53d6\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u3001\u540e\u5e8f\u904d\u5386\u3001\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
    class ArrayBinaryTree:\n    \"\"\"\u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u5217\u8868\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u904d\u5386\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u540e\u5e8f\u904d\u5386\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
    array_binary_tree.cpp
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
    array_binary_tree.java
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.cs
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.go
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u904d\u5386\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u540e\u5e8f\u904d\u5386\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
    array_binary_tree.swift
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
    array_binary_tree.js
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i, order, res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.ts
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.dart
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u5217\u8868\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c42\u5e8f\u904d\u5386 */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u540e\u5e8f\u904d\u5386\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u904d\u5386 */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u904d\u5386 */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u540e\u5e8f\u904d\u5386 */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
    array_binary_tree.rs
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
    array_binary_tree.c
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u904d\u5386\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u540e\u5e8f\u904d\u5386\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
    array_binary_tree.kt
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u5217\u8868\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
    array_binary_tree.rb
    ### \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b ###\nclass ArrayBinaryTree\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u5217\u8868\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c42\u5e8f\u904d\u5386 ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u904d\u5386\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u904d\u5386\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u540e\u5e8f\u904d\u5386\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u904d\u5386 ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u904d\u5386 ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u540e\u5e8f\u904d\u5386 ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
    array_binary_tree.zig
    [class]{ArrayBinaryTree}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

    • \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u5bf9\u7f13\u5b58\u53cb\u597d\uff0c\u8bbf\u95ee\u4e0e\u904d\u5386\u901f\u5ea6\u8f83\u5feb\u3002
    • \u4e0d\u9700\u8981\u5b58\u50a8\u6307\u9488\uff0c\u6bd4\u8f83\u8282\u7701\u7a7a\u95f4\u3002
    • \u5141\u8bb8\u968f\u673a\u8bbf\u95ee\u8282\u70b9\u3002

    \u7136\u800c\uff0c\u6570\u7ec4\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002

    • \u6570\u7ec4\u5b58\u50a8\u9700\u8981\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5b58\u50a8\u6570\u636e\u91cf\u8fc7\u5927\u7684\u6811\u3002
    • \u589e\u5220\u8282\u70b9\u9700\u8981\u901a\u8fc7\u6570\u7ec4\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u5b9e\u73b0\uff0c\u6548\u7387\u8f83\u4f4e\u3002
    • \u5f53\u4e8c\u53c9\u6811\u4e2d\u5b58\u5728\u5927\u91cf None \u65f6\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u7684\u8282\u70b9\u6570\u636e\u6bd4\u91cd\u8f83\u4f4e\uff0c\u7a7a\u95f4\u5229\u7528\u7387\u8f83\u4f4e\u3002
    "},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6811 *","text":"

    \u5728\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7ae0\u8282\u4e2d\u6211\u4eec\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u9000\u5316\u4e3a\u94fe\u8868\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c06\u4ece \\(O(\\log n)\\) \u52a3\u5316\u4e3a \\(O(n)\\) \u3002

    \u5982\u56fe 7-24 \u6240\u793a\uff0c\u7ecf\u8fc7\u4e24\u6b21\u5220\u9664\u8282\u70b9\u64cd\u4f5c\uff0c\u8fd9\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\u4fbf\u4f1a\u9000\u5316\u4e3a\u94fe\u8868\u3002

    \u56fe 7-24 \u00a0 AVL \u6811\u5728\u5220\u9664\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

    \u518d\u4f8b\u5982\uff0c\u5728\u56fe 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e24\u4e2a\u8282\u70b9\u540e\uff0c\u6811\u5c06\u4e25\u91cd\u5411\u5de6\u503e\u659c\uff0c\u67e5\u627e\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u968f\u4e4b\u52a3\u5316\u3002

    \u56fe 7-25 \u00a0 AVL \u6811\u5728\u63d2\u5165\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

    1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8bba\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6811\u3002\u8bba\u6587\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u786e\u4fdd\u5728\u6301\u7eed\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4e0d\u4f1a\u9000\u5316\uff0c\u4ece\u800c\u4f7f\u5f97\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7ea7\u522b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5728\u9700\u8981\u9891\u7e41\u8fdb\u884c\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u573a\u666f\u4e2d\uff0cAVL \u6811\u80fd\u59cb\u7ec8\u4fdd\u6301\u9ad8\u6548\u7684\u6570\u636e\u64cd\u4f5c\u6027\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u5e94\u7528\u4ef7\u503c\u3002

    "},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6811\u5e38\u89c1\u672f\u8bed","text":"

    AVL \u6811\u65e2\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u53c9\u6811\uff0c\u540c\u65f6\u6ee1\u8db3\u8fd9\u4e24\u7c7b\u4e8c\u53c9\u6811\u7684\u6240\u6709\u6027\u8d28\uff0c\u56e0\u6b64\u662f\u4e00\u79cd\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff08balanced binary search tree\uff09\u3002

    "},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u8282\u70b9\u9ad8\u5ea6","text":"

    \u7531\u4e8e AVL \u6811\u7684\u76f8\u5173\u64cd\u4f5c\u9700\u8981\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e3a\u8282\u70b9\u7c7b\u6dfb\u52a0 height \u53d8\u91cf\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"AVL \u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u8282\u70b9\u503c\n        self.height: int = 0                # \u8282\u70b9\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nstruct TreeNode {\n    int val{};          // \u8282\u70b9\u503c\n    int height = 0;     // \u8282\u70b9\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u8282\u70b9\n    TreeNode *right{};  // \u53f3\u5b50\u8282\u70b9\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    public int val;        // \u8282\u70b9\u503c\n    public int height;     // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u8282\u70b9\n    public TreeNode right; // \u53f3\u5b50\u8282\u70b9\n    public TreeNode(int x) { val = x; }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public int height;      // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    /* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val    int       // \u8282\u70b9\u503c\n    Height int       // \u8282\u70b9\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var height: Int // \u8282\u70b9\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    height; //\u8282\u70b9\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;            // \u8282\u70b9\u503c\n    height: number;         // \u8282\u70b9\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right: TreeNode | null; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  int height;      // \u8282\u70b9\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    height: i32,                            // \u8282\u70b9\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val height: Int = 0          // \u8282\u70b9\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\n}\n
    ### AVL \u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :height # \u8282\u70b9\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\n
    \n

    \u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u662f\u6307\u4ece\u8be5\u8282\u70b9\u5230\u5b83\u7684\u6700\u8fdc\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u5373\u6240\u7ecf\u8fc7\u7684\u201c\u8fb9\u201d\u7684\u6570\u91cf\u3002\u9700\u8981\u7279\u522b\u6ce8\u610f\u7684\u662f\uff0c\u53f6\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(0\\) \uff0c\u800c\u7a7a\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(-1\\) \u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e24\u4e2a\u5de5\u5177\u51fd\u6570\uff0c\u5206\u522b\u7528\u4e8e\u83b7\u53d6\u548c\u66f4\u65b0\u8282\u70b9\u7684\u9ad8\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
    avl_tree.cpp
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
    avl_tree.java
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.cs
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
    avl_tree.go
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
    avl_tree.swift
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
    avl_tree.js
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.ts
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.dart
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.rs
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
    avl_tree.c
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
    avl_tree.kt
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
    avl_tree.rb
    ### \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
    avl_tree.zig
    // \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2","title":"2. \u00a0 \u8282\u70b9\u5e73\u8861\u56e0\u5b50","text":"

    \u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u4e49\u4e3a\u8282\u70b9\u5de6\u5b50\u6811\u7684\u9ad8\u5ea6\u51cf\u53bb\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\uff0c\u540c\u65f6\u89c4\u5b9a\u7a7a\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4e3a \\(0\\) \u3002\u6211\u4eec\u540c\u6837\u5c06\u83b7\u53d6\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node is None:\n        return 0\n    # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
    avl_tree.cpp
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == nullptr)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.java
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
    avl_tree.cs
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
    avl_tree.go
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node == nil {\n        return 0\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
    avl_tree.swift
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    guard let node = node else { return 0 }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
    avl_tree.js
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.ts
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.dart
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  if (node == null) return 0;\n  // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
    avl_tree.rs
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n        None => 0,\n        // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
    avl_tree.c
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.kt
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
    avl_tree.rb
    ### \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  return 0 if node.nil?\n\n  # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
    avl_tree.zig
    // \u83b7\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

    Tip

    \u8bbe\u5e73\u8861\u56e0\u5b50\u4e3a \\(f\\) \uff0c\u5219\u4e00\u68f5 AVL \u6811\u7684\u4efb\u610f\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6ee1\u8db3 \\(-1 \\le f \\le 1\\) \u3002

    "},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6811\u65cb\u8f6c","text":"

    AVL \u6811\u7684\u7279\u70b9\u5728\u4e8e\u201c\u65cb\u8f6c\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u591f\u5728\u4e0d\u5f71\u54cd\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u65cb\u8f6c\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7684\u6027\u8d28\uff0c\u4e5f\u80fd\u4f7f\u6811\u91cd\u65b0\u53d8\u4e3a\u201c\u5e73\u8861\u4e8c\u53c9\u6811\u201d\u3002

    \u6211\u4eec\u5c06\u5e73\u8861\u56e0\u5b50\u7edd\u5bf9\u503c \\(> 1\\) \u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5931\u8861\u8282\u70b9\u201d\u3002\u6839\u636e\u8282\u70b9\u5931\u8861\u60c5\u51b5\u7684\u4e0d\u540c\uff0c\u65cb\u8f6c\u64cd\u4f5c\u5206\u4e3a\u56db\u79cd\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3002\u4e0b\u9762\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u65cb\u8f6c\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

    \u5982\u56fe 7-26 \u6240\u793a\uff0c\u8282\u70b9\u4e0b\u65b9\u4e3a\u5e73\u8861\u56e0\u5b50\u3002\u4ece\u5e95\u81f3\u9876\u770b\uff0c\u4e8c\u53c9\u6811\u4e2d\u9996\u4e2a\u5931\u8861\u8282\u70b9\u662f\u201c\u8282\u70b9 3\u201d\u3002\u6211\u4eec\u5173\u6ce8\u4ee5\u8be5\u5931\u8861\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\uff0c\u5c06\u8be5\u8282\u70b9\u8bb0\u4e3a node \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u8bb0\u4e3a child \uff0c\u6267\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u540e\uff0c\u5b50\u6811\u6062\u590d\u5e73\u8861\uff0c\u5e76\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u3002

    <1><2><3><4>

    \u56fe 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9aa4

    \u5982\u56fe 7-27 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u53f3\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u5de6\u5b50\u8282\u70b9\u3002

    \u56fe 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

    \u201c\u5411\u53f3\u65cb\u8f6c\u201d\u662f\u4e00\u79cd\u5f62\u8c61\u5316\u7684\u8bf4\u6cd5\uff0c\u5b9e\u9645\u4e0a\u9700\u8981\u901a\u8fc7\u4fee\u6539\u8282\u70b9\u6307\u9488\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
    avl_tree.cpp
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.java
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.cs
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.go
    /* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.swift
    /* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.js
    /* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.ts
    /* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.dart
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
    avl_tree.rs
    /* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.kt
    /* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.rb
    ### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
    avl_tree.zig
    // \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

    \u76f8\u5e94\u5730\uff0c\u5982\u679c\u8003\u8651\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u201c\u955c\u50cf\u201d\uff0c\u5219\u9700\u8981\u6267\u884c\u56fe 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

    \u56fe 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

    \u540c\u7406\uff0c\u5982\u56fe 7-29 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u5de6\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u53f3\u5b50\u8282\u70b9\u3002

    \u56fe 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

    \u53ef\u4ee5\u89c2\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u903b\u8f91\u4e0a\u662f\u955c\u50cf\u5bf9\u79f0\u7684\uff0c\u5b83\u4eec\u5206\u522b\u89e3\u51b3\u7684\u4e24\u79cd\u5931\u8861\u60c5\u51b5\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u57fa\u4e8e\u5bf9\u79f0\u6027\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u53f3\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u6362\u4e3a right \uff0c\u5c06\u6240\u6709\u7684 right \u66ff\u6362\u4e3a left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
    avl_tree.cpp
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.java
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.cs
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.go
    /* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.swift
    /* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.js
    /* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.ts
    /* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.dart
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
    avl_tree.rs
    /* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.kt
    /* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.rb
    ### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
    avl_tree.zig
    // \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb","text":"

    \u5bf9\u4e8e\u56fe 7-30 \u4e2d\u7684\u5931\u8861\u8282\u70b9 3 \uff0c\u4ec5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u65e0\u6cd5\u4f7f\u5b50\u6811\u6062\u590d\u5e73\u8861\u3002\u6b64\u65f6\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u53f3\u65cb\u201d\u3002

    \u56fe 7-30 \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb

    "},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb","text":"

    \u5982\u56fe 7-31 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u955c\u50cf\u60c5\u51b5\uff0c\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u5de6\u65cb\u201d\u3002

    \u56fe 7-31 \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb

    "},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f6c\u7684\u9009\u62e9","text":"

    \u56fe 7-32 \u5c55\u793a\u7684\u56db\u79cd\u5931\u8861\u60c5\u51b5\u4e0e\u4e0a\u8ff0\u6848\u4f8b\u9010\u4e2a\u5bf9\u5e94\uff0c\u5206\u522b\u9700\u8981\u91c7\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

    \u56fe 7-32 \u00a0 AVL \u6811\u7684\u56db\u79cd\u65cb\u8f6c\u60c5\u51b5

    \u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u4eec\u901a\u8fc7\u5224\u65ad\u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f83\u9ad8\u4e00\u4fa7\u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8d1f\u53f7\uff0c\u6765\u786e\u5b9a\u5931\u8861\u8282\u70b9\u5c5e\u4e8e\u56fe 7-32 \u4e2d\u7684\u54ea\u79cd\u60c5\u51b5\u3002

    \u8868 7-3 \u00a0 \u56db\u79cd\u65cb\u8f6c\u60c5\u51b5\u7684\u9009\u62e9\u6761\u4ef6

    \u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5e94\u91c7\u7528\u7684\u65cb\u8f6c\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(<0\\) \u5148\u5de6\u65cb\u540e\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(>0\\) \u5148\u53f3\u65cb\u540e\u5de6\u65cb

    \u4e3a\u4e86\u4fbf\u4e8e\u4f7f\u7528\uff0c\u6211\u4eec\u5c06\u65cb\u8f6c\u64cd\u4f5c\u5c01\u88c5\u6210\u4e00\u4e2a\u51fd\u6570\u3002\u6709\u4e86\u8fd9\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u5c31\u80fd\u5bf9\u5404\u79cd\u5931\u8861\u60c5\u51b5\u8fdb\u884c\u65cb\u8f6c\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\"\"\"\n    # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6811\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6811\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
    avl_tree.cpp
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.java
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.cs
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.go
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u8350\u77ed\u53d8\u91cf\uff0c\u8fd9\u91cc bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.swift
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6811\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.js
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n#rotate(node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.ts
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.dart
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6811\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6811\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
    avl_tree.rs
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6811\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6811\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
    avl_tree.c
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.kt
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.rb
    ### \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 ###\ndef rotate(node)\n  # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6811\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6811\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
    avl_tree.zig
    // \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6811\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

    AVL \u6811\u7684\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u5728\u4e3b\u4f53\u4e0a\u7c7b\u4f3c\u3002\u552f\u4e00\u7684\u533a\u522b\u5728\u4e8e\uff0c\u5728 AVL \u6811\u4e2d\u63d2\u5165\u8282\u70b9\u540e\uff0c\u4ece\u8be5\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u53ef\u80fd\u4f1a\u51fa\u73b0\u4e00\u7cfb\u5217\u5931\u8861\u8282\u70b9\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4ece\u8fd9\u4e2a\u8282\u70b9\u5f00\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def insert(self, val):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.java
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.cs
    /* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.go
    /* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.swift
    /* \u63d2\u5165\u8282\u70b9 */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.js
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.ts
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.dart
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
    avl_tree.rs
    /* \u63d2\u5165\u8282\u70b9 */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
    avl_tree.c
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.kt
    /* \u63d2\u5165\u8282\u70b9 */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.rb
    ### \u63d2\u5165\u8282\u70b9 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
    avl_tree.zig
    // \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u5220\u9664\u8282\u70b9","text":"

    \u7c7b\u4f3c\u5730\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5220\u9664\u8282\u70b9\u65b9\u6cd5\u7684\u57fa\u7840\u4e0a\uff0c\u9700\u8981\u4ece\u5e95\u81f3\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def remove(self, val: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.java
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.cs
    /* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.go
    /* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.swift
    /* \u5220\u9664\u8282\u70b9 */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.js
    /* \u5220\u9664\u8282\u70b9 */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.ts
    /* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.dart
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
    avl_tree.rs
    /* \u5220\u9664\u8282\u70b9 */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.kt
    /* \u5220\u9664\u8282\u70b9 */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.rb
    ### \u5220\u9664\u8282\u70b9 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      node = child\n    else\n      # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
    avl_tree.zig
    // \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

    AVL \u6811\u7684\u8282\u70b9\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

    "},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6811\u5178\u578b\u5e94\u7528","text":"
    • \u7ec4\u7ec7\u548c\u5b58\u50a8\u5927\u578b\u6570\u636e\uff0c\u9002\u7528\u4e8e\u9ad8\u9891\u67e5\u627e\u3001\u4f4e\u9891\u589e\u5220\u7684\u573a\u666f\u3002
    • \u7528\u4e8e\u6784\u5efa\u6570\u636e\u5e93\u4e2d\u7684\u7d22\u5f15\u7cfb\u7edf\u3002
    • \u7ea2\u9ed1\u6811\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\u3002\u76f8\u8f83\u4e8e AVL \u6811\uff0c\u7ea2\u9ed1\u6811\u7684\u5e73\u8861\u6761\u4ef6\u66f4\u5bbd\u677e\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u6240\u9700\u7684\u65cb\u8f6c\u64cd\u4f5c\u66f4\u5c11\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    "},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811","text":"

    \u5982\u56fe 7-16 \u6240\u793a\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\uff08binary search tree\uff09\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u3002

    1. \u5bf9\u4e8e\u6839\u8282\u70b9\uff0c\u5de6\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c \\(<\\) \u6839\u8282\u70b9\u7684\u503c \\(<\\) \u53f3\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c\u3002
    2. \u4efb\u610f\u8282\u70b9\u7684\u5de6\u3001\u53f3\u5b50\u6811\u4e5f\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5373\u540c\u6837\u6ee1\u8db3\u6761\u4ef6 1. \u3002

    \u56fe 7-16 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811

    "},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u64cd\u4f5c","text":"

    \u6211\u4eec\u5c06\u4e8c\u53c9\u641c\u7d22\u6811\u5c01\u88c5\u4e3a\u4e00\u4e2a\u7c7b BinarySearchTree \uff0c\u5e76\u58f0\u660e\u4e00\u4e2a\u6210\u5458\u53d8\u91cf root \uff0c\u6307\u5411\u6811\u7684\u6839\u8282\u70b9\u3002

    "},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

    \u7ed9\u5b9a\u76ee\u6807\u8282\u70b9\u503c num \uff0c\u53ef\u4ee5\u6839\u636e\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u6765\u67e5\u627e\u3002\u5982\u56fe 7-17 \u6240\u793a\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u8282\u70b9 cur \uff0c\u4ece\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9 root \u51fa\u53d1\uff0c\u5faa\u73af\u6bd4\u8f83\u8282\u70b9\u503c cur.val \u548c num \u4e4b\u95f4\u7684\u5927\u5c0f\u5173\u7cfb\u3002

    • \u82e5 cur.val < num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.right \u3002
    • \u82e5 cur.val > num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.left \u3002
    • \u82e5 cur.val = num \uff0c\u8bf4\u660e\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\u5e76\u8fd4\u56de\u8be5\u8282\u70b9\u3002
    <1><2><3><4>

    \u56fe 7-17 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u8282\u70b9\u793a\u4f8b

    \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f6e\u6392\u9664\u4e00\u534a\u60c5\u51b5\u3002\u5faa\u73af\u6b21\u6570\u6700\u591a\u4e3a\u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff0c\u5f53\u4e8c\u53c9\u6811\u5e73\u8861\u65f6\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\n    cur = self._root\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else:\n            break\n    return cur\n
    binary_search_tree.cpp
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.java
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.cs
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.go
    /* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return node\n}\n
    binary_search_tree.swift
    /* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
    binary_search_tree.js
    /* \u67e5\u627e\u8282\u70b9 */\nsearch(num) {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.ts
    /* \u67e5\u627e\u8282\u70b9 */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.dart
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n  return cur;\n}\n
    binary_search_tree.rs
    /* \u67e5\u627e\u8282\u70b9 */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    cur\n}\n
    binary_search_tree.c
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.kt
    /* \u67e5\u627e\u8282\u70b9 */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
    binary_search_tree.rb
    ### \u67e5\u627e\u8282\u70b9 ###\ndef search(num)\n  cur = @root\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break\n    end\n  end\n\n  cur\nend\n
    binary_search_tree.zig
    // \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u4e3a\u4e86\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-18 \u6240\u793a\u3002

    1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff1a\u4e0e\u67e5\u627e\u64cd\u4f5c\u76f8\u4f3c\uff0c\u4ece\u6839\u8282\u70b9\u51fa\u53d1\uff0c\u6839\u636e\u5f53\u524d\u8282\u70b9\u503c\u548c num \u7684\u5927\u5c0f\u5173\u7cfb\u5faa\u73af\u5411\u4e0b\u641c\u7d22\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\uff08\u904d\u5386\u81f3 None \uff09\u65f6\u8df3\u51fa\u5faa\u73af\u3002
    2. \u5728\u8be5\u4f4d\u7f6e\u63d2\u5165\u8282\u70b9\uff1a\u521d\u59cb\u5316\u8282\u70b9 num \uff0c\u5c06\u8be5\u8282\u70b9\u7f6e\u4e8e None \u7684\u4f4d\u7f6e\u3002

    \u56fe 7-18 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u63d2\u5165\u8282\u70b9

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

    • \u4e8c\u53c9\u641c\u7d22\u6811\u4e0d\u5141\u8bb8\u5b58\u5728\u91cd\u590d\u8282\u70b9\uff0c\u5426\u5219\u5c06\u8fdd\u53cd\u5176\u5b9a\u4e49\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u8282\u70b9\u5728\u6811\u4e2d\u5df2\u5b58\u5728\uff0c\u5219\u4e0d\u6267\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
    • \u4e3a\u4e86\u5b9e\u73b0\u63d2\u5165\u8282\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u8282\u70b9 pre \u4fdd\u5b58\u4e0a\u4e00\u8f6e\u5faa\u73af\u7684\u8282\u70b9\u3002\u8fd9\u6837\u5728\u904d\u5386\u81f3 None \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u83b7\u53d6\u5230\u5176\u7236\u8282\u70b9\uff0c\u4ece\u800c\u5b8c\u6210\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u8282\u70b9\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
    binary_search_tree.cpp
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
    binary_search_tree.java
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
    binary_search_tree.cs
    /* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
    binary_search_tree.go
    /* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
    binary_search_tree.swift
    /* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
    binary_search_tree.js
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
    binary_search_tree.ts
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
    binary_search_tree.dart
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u8282\u70b9\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
    binary_search_tree.rs
    /* \u63d2\u5165\u8282\u70b9 */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
    binary_search_tree.c
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
    binary_search_tree.kt
    /* \u63d2\u5165\u8282\u70b9 */\nfun insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u8282\u70b9\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
    binary_search_tree.rb
    ### \u63d2\u5165\u8282\u70b9 ###\ndef insert(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u8282\u70b9\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
    binary_search_tree.zig
    // \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4e0e\u67e5\u627e\u8282\u70b9\u76f8\u540c\uff0c\u63d2\u5165\u8282\u70b9\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002

    "},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

    \u5148\u5728\u4e8c\u53c9\u6811\u4e2d\u67e5\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u518d\u5c06\u5176\u5220\u9664\u3002\u4e0e\u63d2\u5165\u8282\u70b9\u7c7b\u4f3c\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\u4ecd\u7136\u6ee1\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u6839\u636e\u76ee\u6807\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u79cd\u60c5\u51b5\uff0c\u6267\u884c\u5bf9\u5e94\u7684\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u3002

    \u5982\u56fe 7-19 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \u65f6\uff0c\u8868\u793a\u8be5\u8282\u70b9\u662f\u53f6\u8282\u70b9\uff0c\u53ef\u4ee5\u76f4\u63a5\u5220\u9664\u3002

    \u56fe 7-19 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 0 \uff09

    \u5982\u56fe 7-20 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(1\\) \u65f6\uff0c\u5c06\u5f85\u5220\u9664\u8282\u70b9\u66ff\u6362\u4e3a\u5176\u5b50\u8282\u70b9\u5373\u53ef\u3002

    \u56fe 7-20 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 1 \uff09

    \u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(2\\) \u65f6\uff0c\u6211\u4eec\u65e0\u6cd5\u76f4\u63a5\u5220\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u4e2a\u8282\u70b9\u66ff\u6362\u8be5\u8282\u70b9\u3002\u7531\u4e8e\u8981\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u56e0\u6b64\u8fd9\u4e2a\u8282\u70b9\u53ef\u4ee5\u662f\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\u6216\u5de6\u5b50\u6811\u7684\u6700\u5927\u8282\u70b9\u3002

    \u5047\u8bbe\u6211\u4eec\u9009\u62e9\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\uff08\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\uff0c\u5219\u5220\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-21 \u6240\u793a\u3002

    1. \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\u5728\u201c\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff0c\u8bb0\u4e3a tmp \u3002
    2. \u7528 tmp \u7684\u503c\u8986\u76d6\u5f85\u5220\u9664\u8282\u70b9\u7684\u503c\uff0c\u5e76\u5728\u6811\u4e2d\u9012\u5f52\u5220\u9664\u8282\u70b9 tmp \u3002
    <1><2><3><4>

    \u56fe 7-21 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 2 \uff09

    \u5220\u9664\u8282\u70b9\u64cd\u4f5c\u540c\u6837\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d\u67e5\u627e\u5f85\u5220\u9664\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u540e\u7ee7\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def remove(self, num: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        child = cur.left or cur.right\n        # \u5220\u9664\u8282\u70b9 cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            self._root = child\n    # \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else:\n        # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val\n
    binary_search_tree.cpp
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete cur;\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.java
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.cs
    /* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode? child = cur.left ?? cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.go
    /* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            bst.root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u4e3a 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.Val = tmp.Val\n    }\n}\n
    binary_search_tree.swift
    /* \u5220\u9664\u8282\u70b9 */\nfunc remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        let child = cur?.left ?? cur?.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur?.val = tmp!.val\n    }\n}\n
    binary_search_tree.js
    /* \u5220\u9664\u8282\u70b9 */\nremove(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.ts
    /* \u5220\u9664\u8282\u70b9 */\nremove(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp!.val;\n    }\n}\n
    binary_search_tree.dart
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    TreeNode? child = cur.left ?? cur.right;\n    // \u5220\u9664\u8282\u70b9 cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      _root = child;\n    }\n  } else {\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val;\n  }\n}\n
    binary_search_tree.rs
    /* \u5220\u9664\u8282\u70b9 */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u5220\u9664\u8282\u70b9 cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n                self.root = child;\n            }\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u76d6 cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
    binary_search_tree.c
    /* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1 */\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(cur);\n    } else {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 2 */\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.kt
    /* \u5220\u9664\u8282\u70b9 */\nfun remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur._val = tmp._val\n    }\n}\n
    binary_search_tree.rb
    ### \u5220\u9664\u8282\u70b9 ###\ndef remove(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    child = cur.left || cur.right\n    # \u5220\u9664\u8282\u70b9 cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      @root = child\n    end\n  # \u5b50\u8282\u70b9\u6570\u91cf = 2\n  else\n    # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val\n  end\nend\n
    binary_search_tree.zig
    // \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.?.val = tmp_val;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u904d\u5386\u6709\u5e8f","text":"

    \u5982\u56fe 7-22 \u6240\u793a\uff0c\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u904d\u5386\u987a\u5e8f\uff0c\u800c\u4e8c\u53c9\u641c\u7d22\u6811\u6ee1\u8db3\u201c\u5de6\u5b50\u8282\u70b9 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u8282\u70b9\u201d\u7684\u5927\u5c0f\u5173\u7cfb\u3002

    \u8fd9\u610f\u5473\u7740\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u8fdb\u884c\u4e2d\u5e8f\u904d\u5386\u65f6\uff0c\u603b\u662f\u4f1a\u4f18\u5148\u904d\u5386\u4e0b\u4e00\u4e2a\u6700\u5c0f\u8282\u70b9\uff0c\u4ece\u800c\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u6027\u8d28\uff1a\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

    \u5229\u7528\u4e2d\u5e8f\u904d\u5386\u5347\u5e8f\u7684\u6027\u8d28\uff0c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u83b7\u53d6\u6709\u5e8f\u6570\u636e\u4ec5\u9700 \\(O(n)\\) \u65f6\u95f4\uff0c\u65e0\u987b\u8fdb\u884c\u989d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

    \u56fe 7-22 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217

    "},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387","text":"

    \u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528\u6570\u7ec4\u6216\u4e8c\u53c9\u641c\u7d22\u6811\u5b58\u50a8\u3002\u89c2\u5bdf\u8868 7-2 \uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5404\u9879\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f\u5bf9\u6570\u9636\uff0c\u5177\u6709\u7a33\u5b9a\u4e14\u9ad8\u6548\u7684\u6027\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u9891\u6dfb\u52a0\u3001\u4f4e\u9891\u67e5\u627e\u5220\u9664\u6570\u636e\u7684\u573a\u666f\u4e0b\uff0c\u6570\u7ec4\u6bd4\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387\u66f4\u9ad8\u3002

    \u8868 7-2 \u00a0 \u6570\u7ec4\u4e0e\u641c\u7d22\u6811\u7684\u6548\u7387\u5bf9\u6bd4

    \u65e0\u5e8f\u6570\u7ec4 \u4e8c\u53c9\u641c\u7d22\u6811 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

    \u5728\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f6e\u5faa\u73af\u5185\u67e5\u627e\u4efb\u610f\u8282\u70b9\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u4e0d\u65ad\u5730\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\uff0c\u53ef\u80fd\u5bfc\u81f4\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u56fe 7-23 \u6240\u793a\u7684\u94fe\u8868\uff0c\u8fd9\u65f6\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4f1a\u9000\u5316\u4e3a \\(O(n)\\) \u3002

    \u56fe 7-23 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316

    "},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u5e38\u89c1\u5e94\u7528","text":"
    • \u7528\u4f5c\u7cfb\u7edf\u4e2d\u7684\u591a\u7ea7\u7d22\u5f15\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u67e5\u627e\u3001\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u3002
    • \u4f5c\u4e3a\u67d0\u4e9b\u641c\u7d22\u7b97\u6cd5\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002
    • \u7528\u4e8e\u5b58\u50a8\u6570\u636e\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72b6\u6001\u3002
    "},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u53c9\u6811","text":"

    \u4e8c\u53c9\u6811\uff08binary tree\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u4e8c\u53c9\u6811\u7684\u57fa\u672c\u5355\u5143\u662f\u8282\u70b9\uff0c\u6bcf\u4e2a\u8282\u70b9\u5305\u542b\u503c\u3001\u5de6\u5b50\u8282\u70b9\u5f15\u7528\u548c\u53f3\u5b50\u8282\u70b9\u5f15\u7528\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"\u4e8c\u53c9\u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    int val;          // \u8282\u70b9\u503c\n    TreeNode *left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode *right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    int val;         // \u8282\u70b9\u503c\n    TreeNode left;   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n        Right: nil, // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n        Val:   v,   // \u8282\u70b9\u503c\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct TreeNode {\n    int val;                // \u8282\u70b9\u503c\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    struct TreeNode *right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    ### \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\n
    \n

    \u6bcf\u4e2a\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u5206\u522b\u6307\u5411\u5de6\u5b50\u8282\u70b9\uff08left-child node\uff09\u548c\u53f3\u5b50\u8282\u70b9\uff08right-child node\uff09\uff0c\u8be5\u8282\u70b9\u88ab\u79f0\u4e3a\u8fd9\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u7236\u8282\u70b9\uff08parent node\uff09\u3002\u5f53\u7ed9\u5b9a\u4e00\u4e2a\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u65f6\uff0c\u6211\u4eec\u5c06\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u6811\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6811\uff08right subtree\uff09\u3002

    \u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u9664\u53f6\u8282\u70b9\u5916\uff0c\u5176\u4ed6\u6240\u6709\u8282\u70b9\u90fd\u5305\u542b\u5b50\u8282\u70b9\u548c\u975e\u7a7a\u5b50\u6811\u3002\u5982\u56fe 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c06\u201c\u8282\u70b9 2\u201d\u89c6\u4e3a\u7236\u8282\u70b9\uff0c\u5219\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u5206\u522b\u662f\u201c\u8282\u70b9 4\u201d\u548c\u201c\u8282\u70b9 5\u201d\uff0c\u5de6\u5b50\u6811\u662f\u201c\u8282\u70b9 4 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\uff0c\u53f3\u5b50\u6811\u662f\u201c\u8282\u70b9 5 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\u3002

    \u56fe 7-1 \u00a0 \u7236\u8282\u70b9\u3001\u5b50\u8282\u70b9\u3001\u5b50\u6811

    "},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u53c9\u6811\u5e38\u89c1\u672f\u8bed","text":"

    \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed\u5982\u56fe 7-2 \u6240\u793a\u3002

    • \u6839\u8282\u70b9\uff08root node\uff09\uff1a\u4f4d\u4e8e\u4e8c\u53c9\u6811\u9876\u5c42\u7684\u8282\u70b9\uff0c\u6ca1\u6709\u7236\u8282\u70b9\u3002
    • \u53f6\u8282\u70b9\uff08leaf node\uff09\uff1a\u6ca1\u6709\u5b50\u8282\u70b9\u7684\u8282\u70b9\uff0c\u5176\u4e24\u4e2a\u6307\u9488\u5747\u6307\u5411 None \u3002
    • \u8fb9\uff08edge\uff09\uff1a\u8fde\u63a5\u4e24\u4e2a\u8282\u70b9\u7684\u7ebf\u6bb5\uff0c\u5373\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002
    • \u8282\u70b9\u6240\u5728\u7684\u5c42\uff08level\uff09\uff1a\u4ece\u9876\u81f3\u5e95\u9012\u589e\uff0c\u6839\u8282\u70b9\u6240\u5728\u5c42\u4e3a 1 \u3002
    • \u8282\u70b9\u7684\u5ea6\uff08degree\uff09\uff1a\u8282\u70b9\u7684\u5b50\u8282\u70b9\u7684\u6570\u91cf\u3002\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u8303\u56f4\u662f 0\u30011\u30012 \u3002
    • \u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u6700\u8fdc\u53f6\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
    • \u8282\u70b9\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
    • \u8282\u70b9\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u8ddd\u79bb\u8be5\u8282\u70b9\u6700\u8fdc\u7684\u53f6\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002

    \u56fe 7-2 \u00a0 \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u9898\u76ee\u6216\u6559\u6750\u53ef\u80fd\u4f1a\u5c06\u5176\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8282\u70b9\u7684\u6570\u91cf\u201d\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u9ad8\u5ea6\u548c\u6df1\u5ea6\u90fd\u9700\u8981\u52a0 1 \u3002

    "},{"location":"chapter_tree/binary_tree/#712","title":"7.1.2 \u00a0 \u4e8c\u53c9\u6811\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u53c9\u6811","text":"

    \u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u8282\u70b9\uff0c\u7136\u540e\u6784\u5efa\u5f15\u7528\uff08\u6307\u9488\uff09\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.cpp
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.java
    // \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.cs
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.go
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
    binary_tree.swift
    // \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.js
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.ts
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.dart
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.rs
    // \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
    binary_tree.c
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.kt
    // \u521d\u59cb\u5316\u8282\u70b9\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.rb
    # \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.new(5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9","text":"

    \u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539\u6307\u9488\u6765\u5b9e\u73b0\u3002\u56fe 7-3 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u793a\u4f8b\u3002

    \u56fe 7-3 \u00a0 \u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = p\np.left = n2\n# \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
    binary_tree.cpp
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
    binary_tree.java
    TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.cs
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.go
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.Left = n2\n
    binary_tree.swift
    let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
    binary_tree.js
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.ts
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.dart
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.rs
    let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u5220\u9664\u8282\u70b9 p\nn1.borrow_mut().left = Some(n2);\n
    binary_tree.c
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
    binary_tree.kt
    val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
    binary_tree.rb
    # \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 _p\nn1.left = _p\n_p.left = n2\n# \u5220\u9664\u8282\u70b9\nn1.left = n2\n
    binary_tree.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Tip

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u8282\u70b9\u53ef\u80fd\u4f1a\u6539\u53d8\u4e8c\u53c9\u6811\u7684\u539f\u6709\u903b\u8f91\u7ed3\u6784\uff0c\u800c\u5220\u9664\u8282\u70b9\u901a\u5e38\u610f\u5473\u7740\u5220\u9664\u8be5\u8282\u70b9\u53ca\u5176\u6240\u6709\u5b50\u6811\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5b9e\u73b0\u6709\u5b9e\u9645\u610f\u4e49\u7684\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u89c1\u4e8c\u53c9\u6811\u7c7b\u578b","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff08perfect binary tree\uff09\u6240\u6709\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u5b8c\u5168\u586b\u6ee1\u3002\u5728\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\uff0c\u53f6\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u7684\u5ea6\u90fd\u4e3a \\(2\\) \uff1b\u82e5\u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \uff0c\u5219\u8282\u70b9\u603b\u6570\u4e3a \\(2^{h+1} - 1\\) \uff0c\u5448\u73b0\u6807\u51c6\u7684\u6307\u6570\u7ea7\u5173\u7cfb\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u89c1\u7684\u7ec6\u80de\u5206\u88c2\u73b0\u8c61\u3002

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u533a\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u5e38\u88ab\u79f0\u4e3a\u6ee1\u4e8c\u53c9\u6811\u3002

    \u56fe 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c42\u7684\u8282\u70b9\u672a\u88ab\u586b\u6ee1\uff0c\u4e14\u6700\u5e95\u5c42\u8282\u70b9\u5c3d\u91cf\u9760\u5de6\u586b\u5145\u3002

    \u56fe 7-5 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-6 \u6240\u793a\uff0c\u5b8c\u6ee1\u4e8c\u53c9\u6811\uff08full binary tree\uff09\u9664\u4e86\u53f6\u8282\u70b9\u4e4b\u5916\uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5b50\u8282\u70b9\u3002

    \u56fe 7-6 \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u53c9\u6811\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u8282\u70b9\u7684\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7edd\u5bf9\u503c\u4e0d\u8d85\u8fc7 1 \u3002

    \u56fe 7-7 \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u53c9\u6811\u7684\u9000\u5316","text":"

    \u56fe 7-8 \u5c55\u793a\u4e86\u4e8c\u53c9\u6811\u7684\u7406\u60f3\u7ed3\u6784\u4e0e\u9000\u5316\u7ed3\u6784\u3002\u5f53\u4e8c\u53c9\u6811\u7684\u6bcf\u5c42\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u65f6\uff0c\u8fbe\u5230\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff1b\u800c\u5f53\u6240\u6709\u8282\u70b9\u90fd\u504f\u5411\u4e00\u4fa7\u65f6\uff0c\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u201c\u94fe\u8868\u201d\u3002

    • \u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u7406\u60f3\u60c5\u51b5\uff0c\u53ef\u4ee5\u5145\u5206\u53d1\u6325\u4e8c\u53c9\u6811\u201c\u5206\u6cbb\u201d\u7684\u4f18\u52bf\u3002
    • \u94fe\u8868\u5219\u662f\u53e6\u4e00\u4e2a\u6781\u7aef\uff0c\u5404\u9879\u64cd\u4f5c\u90fd\u53d8\u4e3a\u7ebf\u6027\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u56fe 7-8 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

    \u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7ed3\u6784\u548c\u6700\u5dee\u7ed3\u6784\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf\u3001\u8282\u70b9\u603b\u6570\u3001\u9ad8\u5ea6\u7b49\u8fbe\u5230\u6781\u5927\u503c\u6216\u6781\u5c0f\u503c\u3002

    \u8868 7-1 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

    \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u94fe\u8868 \u7b2c \\(i\\) \u5c42\u7684\u8282\u70b9\u6570\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u8282\u70b9\u603b\u6570 \\(2^{h+1} - 1\\) \\(h + 1\\) \u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \u7684\u6811\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386","text":"

    \u4ece\u7269\u7406\u7ed3\u6784\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u6811\u662f\u4e00\u79cd\u57fa\u4e8e\u94fe\u8868\u7684\u6570\u636e\u7ed3\u6784\uff0c\u56e0\u6b64\u5176\u904d\u5386\u65b9\u5f0f\u662f\u901a\u8fc7\u6307\u9488\u9010\u4e2a\u8bbf\u95ee\u8282\u70b9\u3002\u7136\u800c\uff0c\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u8fd9\u4f7f\u5f97\u904d\u5386\u6811\u6bd4\u904d\u5386\u94fe\u8868\u66f4\u52a0\u590d\u6742\uff0c\u9700\u8981\u501f\u52a9\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u3002

    \u4e8c\u53c9\u6811\u5e38\u89c1\u7684\u904d\u5386\u65b9\u5f0f\u5305\u62ec\u5c42\u5e8f\u904d\u5386\u3001\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u7b49\u3002

    "},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

    \u5982\u56fe 7-9 \u6240\u793a\uff0c\u5c42\u5e8f\u904d\u5386\uff08level-order traversal\uff09\u4ece\u9876\u90e8\u5230\u5e95\u90e8\u9010\u5c42\u904d\u5386\u4e8c\u53c9\u6811\uff0c\u5e76\u5728\u6bcf\u4e00\u5c42\u6309\u7167\u4ece\u5de6\u5230\u53f3\u7684\u987a\u5e8f\u8bbf\u95ee\u8282\u70b9\u3002

    \u5c42\u5e8f\u904d\u5386\u672c\u8d28\u4e0a\u5c5e\u4e8e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\uff08breadth-first traversal\uff09\uff0c\u4e5f\u79f0\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\u3002

    \u56fe 7-9 \u00a0 \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386

    "},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u901a\u5e38\u501f\u52a9\u201c\u961f\u5217\u201d\u6765\u5b9e\u73b0\u3002\u961f\u5217\u9075\u5faa\u201c\u5148\u8fdb\u5148\u51fa\u201d\u7684\u89c4\u5219\uff0c\u800c\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5219\u9075\u5faa\u201c\u9010\u5c42\u63a8\u8fdb\u201d\u7684\u89c4\u5219\uff0c\u4e24\u8005\u80cc\u540e\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
    def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n    # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\n        res.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    return res\n
    binary_tree_bfs.cpp
    /* \u5c42\u5e8f\u904d\u5386 */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u961f\u5217\u51fa\u961f\n        vec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return vec;\n}\n
    binary_tree_bfs.java
    /* \u5c42\u5e8f\u904d\u5386 */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\n        list.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
    binary_tree_bfs.cs
    /* \u5c42\u5e8f\u904d\u5386 */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\n        list.Add(node.val!.Value);       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
    binary_tree_bfs.go
    /* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u961f\u5217\u51fa\u961f\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
    binary_tree_bfs.swift
    /* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\n        list.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list\n}\n
    binary_tree_bfs.js
    /* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
    binary_tree_bfs.ts
    /* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list;\n}\n
    binary_tree_bfs.dart
    /* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u961f\u5217\u51fa\u961f\n    res.add(node!.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  }\n  return res;\n}\n
    binary_tree_bfs.rs
    /* \u5c42\u5e8f\u904d\u5386 */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u961f\u5217\u51fa\u961f\n        vec.push(node.borrow().val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        };\n    }\n    vec\n}\n
    binary_tree_bfs.c
    /* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f85\u52a9\u961f\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f85\u52a9\u961f\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u961f\u5217\u6307\u9488\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u8282\u70b9\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    /* \u8f85\u52a9\u6570\u7ec4 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u6570\u7ec4\u6307\u9488\n    index = 0;\n    while (front < rear) {\n        // \u961f\u5217\u51fa\u961f\n        node = queue[front++];\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\n    free(queue);\n    return arr;\n}\n
    binary_tree_bfs.kt
    /* \u5c42\u5e8f\u904d\u5386 */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u961f\u5217\u51fa\u961f\n        list.add(node?._val!!)       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list\n}\n
    binary_tree_bfs.rb
    ### \u5c42\u5e8f\u904d\u5386 ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u961f\u5217\u51fa\u961f\n    res << node.val # \u4fdd\u5b58\u8282\u70b9\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  end\n  res\nend\n
    binary_tree_bfs.zig
    // \u5c42\u5e8f\u904d\u5386\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\n        var node = queue_node.data;\n        try list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }        \n    }\n    return list;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d \\(n\\) \u4e3a\u8282\u70b9\u6570\u91cf\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6ee1\u4e8c\u53c9\u6811\u65f6\uff0c\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u6700\u591a\u540c\u65f6\u5b58\u5728 \\((n + 1) / 2\\) \u4e2a\u8282\u70b9\uff0c\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002
    "},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386","text":"

    \u76f8\u5e94\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\uff08depth-first traversal\uff09\uff0c\u4e5f\u79f0\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff08depth-first search, DFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\u3002

    \u56fe 7-10 \u5c55\u793a\u4e86\u5bf9\u4e8c\u53c9\u6811\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5c31\u50cf\u662f\u7ed5\u7740\u6574\u68f5\u4e8c\u53c9\u6811\u7684\u5916\u56f4\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u4e2a\u8282\u70b9\u90fd\u4f1a\u9047\u5230\u4e09\u4e2a\u4f4d\u7f6e\uff0c\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u3002

    \u56fe 7-10 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386

    "},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
    def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
    binary_tree_dfs.cpp
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
    binary_tree_dfs.java
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
    binary_tree_dfs.cs
    /* \u524d\u5e8f\u904d\u5386 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
    binary_tree_dfs.go
    /* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
    binary_tree_dfs.swift
    /* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
    binary_tree_dfs.js
    /* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.ts
    /* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.dart
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
    binary_tree_dfs.rs
    /* \u524d\u5e8f\u904d\u5386 */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
    binary_tree_dfs.c
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
    binary_tree_dfs.kt
    /* \u524d\u5e8f\u904d\u5386 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
    binary_tree_dfs.rb
    ### \u524d\u5e8f\u904d\u5386 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u904d\u5386 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u540e\u5e8f\u904d\u5386 ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
    binary_tree_dfs.zig
    // \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Tip

    \u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4e5f\u53ef\u4ee5\u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

    \u56fe 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u904d\u5386\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5176\u53ef\u5206\u4e3a\u201c\u9012\u201d\u548c\u201c\u5f52\u201d\u4e24\u4e2a\u9006\u5411\u7684\u90e8\u5206\u3002

    1. \u201c\u9012\u201d\u8868\u793a\u5f00\u542f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5e8f\u5728\u6b64\u8fc7\u7a0b\u4e2d\u8bbf\u95ee\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002
    2. \u201c\u5f52\u201d\u8868\u793a\u51fd\u6570\u8fd4\u56de\uff0c\u4ee3\u8868\u5f53\u524d\u8282\u70b9\u5df2\u7ecf\u8bbf\u95ee\u5b8c\u6bd5\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 7-11 \u00a0 \u524d\u5e8f\u904d\u5386\u7684\u9012\u5f52\u8fc7\u7a0b

    "},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u7cfb\u7edf\u5360\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002
    "},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u4e8c\u53c9\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4f53\u73b0\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u6bcf\u4e2a\u4e8c\u53c9\u6811\u8282\u70b9\u5305\u542b\u4e00\u4e2a\u503c\u4ee5\u53ca\u4e24\u4e2a\u6307\u9488\uff0c\u5206\u522b\u6307\u5411\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u3002
    • \u5bf9\u4e8e\u4e8c\u53c9\u6811\u4e2d\u7684\u67d0\u4e2a\u8282\u70b9\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6811\u88ab\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6811\u3002
    • \u4e8c\u53c9\u6811\u7684\u76f8\u5173\u672f\u8bed\u5305\u62ec\u6839\u8282\u70b9\u3001\u53f6\u8282\u70b9\u3001\u5c42\u3001\u5ea6\u3001\u8fb9\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
    • \u4e8c\u53c9\u6811\u7684\u521d\u59cb\u5316\u3001\u8282\u70b9\u63d2\u5165\u548c\u8282\u70b9\u5220\u9664\u64cd\u4f5c\u4e0e\u94fe\u8868\u64cd\u4f5c\u65b9\u6cd5\u7c7b\u4f3c\u3002
    • \u5e38\u89c1\u7684\u4e8c\u53c9\u6811\u7c7b\u578b\u6709\u5b8c\u7f8e\u4e8c\u53c9\u6811\u3001\u5b8c\u5168\u4e8c\u53c9\u6811\u3001\u5b8c\u6ee1\u4e8c\u53c9\u6811\u548c\u5e73\u8861\u4e8c\u53c9\u6811\u3002\u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u6700\u7406\u60f3\u7684\u72b6\u6001\uff0c\u800c\u94fe\u8868\u662f\u9000\u5316\u540e\u7684\u6700\u5dee\u72b6\u6001\u3002
    • \u4e8c\u53c9\u6811\u53ef\u4ee5\u7528\u6570\u7ec4\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c06\u8282\u70b9\u503c\u548c\u7a7a\u4f4d\u6309\u5c42\u5e8f\u904d\u5386\u987a\u5e8f\u6392\u5217\uff0c\u5e76\u6839\u636e\u7236\u8282\u70b9\u4e0e\u5b50\u8282\u70b9\u4e4b\u95f4\u7684\u7d22\u5f15\u6620\u5c04\u5173\u7cfb\u6765\u5b9e\u73b0\u6307\u9488\u3002
    • \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386\u662f\u4e00\u79cd\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u65b9\u6cd5\uff0c\u5b83\u4f53\u73b0\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u901a\u8fc7\u961f\u5217\u6765\u5b9e\u73b0\u3002
    • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u7686\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u5b83\u4eec\u4f53\u73b0\u4e86\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u6765\u5b9e\u73b0\u3002
    • \u4e8c\u53c9\u641c\u7d22\u6811\u662f\u4e00\u79cd\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u627e\u6570\u636e\u7ed3\u6784\uff0c\u5176\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \u3002\u5f53\u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u5404\u9879\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • AVL \u6811\uff0c\u4e5f\u79f0\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5b83\u901a\u8fc7\u65cb\u8f6c\u64cd\u4f5c\u786e\u4fdd\u5728\u4e0d\u65ad\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\u540e\u6811\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
    • AVL \u6811\u7684\u65cb\u8f6c\u64cd\u4f5c\u5305\u62ec\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u518d\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u518d\u53f3\u65cb\u3002\u5728\u63d2\u5165\u6216\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4f1a\u4ece\u5e95\u5411\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002
    "},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u5bf9\u4e8e\u53ea\u6709\u4e00\u4e2a\u8282\u70b9\u7684\u4e8c\u53c9\u6811\uff0c\u6811\u7684\u9ad8\u5ea6\u548c\u6839\u8282\u70b9\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u5417\uff1f

    \u662f\u7684\uff0c\u56e0\u4e3a\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\u3002

    Q\uff1a\u4e8c\u53c9\u6811\u4e2d\u7684\u63d2\u5165\u4e0e\u5220\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u8fd9\u91cc\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u4e48\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u4e3a\u8d44\u6e90\u7684\u5b50\u8282\u70b9\u7684\u8d44\u6e90\u91ca\u653e\u5417\uff1f

    \u62ff\u4e8c\u53c9\u641c\u7d22\u6811\u6765\u4e3e\u4f8b\uff0c\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u8981\u5206\u4e09\u79cd\u60c5\u51b5\u5904\u7406\uff0c\u5176\u4e2d\u6bcf\u79cd\u60c5\u51b5\u90fd\u9700\u8981\u8fdb\u884c\u591a\u4e2a\u6b65\u9aa4\u7684\u8282\u70b9\u64cd\u4f5c\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48 DFS \u904d\u5386\u4e8c\u53c9\u6811\u6709\u524d\u3001\u4e2d\u3001\u540e\u4e09\u79cd\u987a\u5e8f\uff0c\u5206\u522b\u6709\u4ec0\u4e48\u7528\u5462\uff1f

    \u4e0e\u987a\u5e8f\u548c\u9006\u5e8f\u904d\u5386\u6570\u7ec4\u7c7b\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u662f\u4e09\u79cd\u4e8c\u53c9\u6811\u904d\u5386\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b83\u4eec\u5f97\u5230\u4e00\u4e2a\u7279\u5b9a\u987a\u5e8f\u7684\u904d\u5386\u7ed3\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\uff0c\u7531\u4e8e\u8282\u70b9\u5927\u5c0f\u6ee1\u8db3 \u5de6\u5b50\u8282\u70b9\u503c < \u6839\u8282\u70b9\u503c < \u53f3\u5b50\u8282\u70b9\u503c \uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u4f18\u5148\u7ea7\u904d\u5386\u6811\uff0c\u5c31\u53ef\u4ee5\u83b7\u5f97\u6709\u5e8f\u7684\u8282\u70b9\u5e8f\u5217\u3002

    Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u5904\u7406\u5931\u8861\u8282\u70b9 node\u3001child\u3001grand_child \u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u90a3 node \u7684\u7236\u8282\u70b9\u548c node \u539f\u6765\u7684\u8fde\u63a5\u4e0d\u9700\u8981\u7ef4\u62a4\u5417\uff1f\u53f3\u65cb\u64cd\u4f5c\u540e\u5c82\u4e0d\u662f\u65ad\u6389\u4e86\uff1f

    \u6211\u4eec\u9700\u8981\u4ece\u9012\u5f52\u7684\u89c6\u89d2\u6765\u770b\u8fd9\u4e2a\u95ee\u9898\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u4f20\u5165\u7684\u662f\u5b50\u6811\u7684\u6839\u8282\u70b9\uff0c\u6700\u7ec8 return child \u8fd4\u56de\u65cb\u8f6c\u4e4b\u540e\u7684\u5b50\u6811\u7684\u6839\u8282\u70b9\u3002\u5b50\u6811\u7684\u6839\u8282\u70b9\u548c\u5176\u7236\u8282\u70b9\u7684\u8fde\u63a5\u662f\u5728\u8be5\u51fd\u6570\u8fd4\u56de\u540e\u5b8c\u6210\u7684\uff0c\u4e0d\u5c5e\u4e8e\u53f3\u65cb\u64cd\u4f5c\u7684\u7ef4\u62a4\u8303\u56f4\u3002

    Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u6570\u88ab\u5212\u5206\u5230 private \u548c public \u4e2d\uff0c\u8fd9\u65b9\u9762\u6709\u4ec0\u4e48\u8003\u91cf\u5417\uff1f\u4e3a\u4ec0\u4e48\u8981\u5c06 height() \u51fd\u6570\u548c updateHeight() \u51fd\u6570\u5206\u522b\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

    \u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u8303\u56f4\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u7c7b\u5185\u90e8\u4f7f\u7528\uff0c\u90a3\u4e48\u5c31\u8bbe\u8ba1\u4e3a private \u3002\u4f8b\u5982\uff0c\u7528\u6237\u5355\u72ec\u8c03\u7528 updateHeight() \u662f\u6ca1\u6709\u610f\u4e49\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8bbf\u95ee\u8282\u70b9\u9ad8\u5ea6\uff0c\u7c7b\u4f3c\u4e8e vector.size() \uff0c\u56e0\u6b64\u8bbe\u7f6e\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

    Q\uff1a\u5982\u4f55\u4ece\u4e00\u7ec4\u8f93\u5165\u6570\u636e\u6784\u5efa\u4e00\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\uff1f\u6839\u8282\u70b9\u7684\u9009\u62e9\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

    \u662f\u7684\uff0c\u6784\u5efa\u6811\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4ee3\u7801\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7ed9\u51fa\u3002\u81f3\u4e8e\u6839\u8282\u70b9\u7684\u9009\u62e9\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u8f93\u5165\u6570\u636e\u6392\u5e8f\uff0c\u7136\u540e\u5c06\u4e2d\u70b9\u5143\u7d20\u4f5c\u4e3a\u6839\u8282\u70b9\uff0c\u518d\u9012\u5f52\u5730\u6784\u5efa\u5de6\u53f3\u5b50\u6811\u3002\u8fd9\u6837\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8bc1\u6811\u7684\u5e73\u8861\u6027\u3002

    Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u7b26\u4e32\u5bf9\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

    \u5728 Java \u4e2d\uff0c\u5bf9\u4e8e\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c== \u7528\u4e8e\u5bf9\u6bd4\u4e24\u4e2a\u53d8\u91cf\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5bf9\u4e8e\u5f15\u7528\u7c7b\u578b\uff0c\u4e24\u79cd\u7b26\u53f7\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

    • == \uff1a\u7528\u6765\u6bd4\u8f83\u4e24\u4e2a\u53d8\u91cf\u662f\u5426\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5373\u5b83\u4eec\u5728\u5185\u5b58\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
    • equals()\uff1a\u7528\u6765\u5bf9\u6bd4\u4e24\u4e2a\u5bf9\u8c61\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

    \u56e0\u6b64\uff0c\u5982\u679c\u8981\u5bf9\u6bd4\u503c\uff0c\u6211\u4eec\u5e94\u8be5\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u901a\u8fc7 String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u7b26\u4e32\u90fd\u5b58\u50a8\u5728\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u4e2d\uff0c\u5b83\u4eec\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u6765\u6bd4\u8f83\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5185\u5bb9\u3002

    Q\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u7684\u8282\u70b9\u6570\u91cf\u662f \\(2^h\\) \u5417\uff1f

    \u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6ee1\u4e8c\u53c9\u6811\uff0c\u5176\u8282\u70b9\u603b\u6570 \\(n = 7\\) \uff0c\u5219\u5e95\u5c42\u8282\u70b9\u6570\u91cf \\(4 = 2^h = (n + 1) / 2\\) \u3002

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"chapter_appendix/","title":"\u7b2c 16 \u7ae0 \u00a0 \u9644\u5f55","text":""},{"location":"chapter_appendix/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5
    • 16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c
    • 16.3 \u00a0 \u672f\u8bed\u8868
    "},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c","text":"

    \u7531\u4e8e\u7b14\u8005\u80fd\u529b\u6709\u9650\uff0c\u4e66\u4e2d\u96be\u514d\u5b58\u5728\u4e00\u4e9b\u9057\u6f0f\u548c\u9519\u8bef\uff0c\u8bf7\u60a8\u8c05\u89e3\u3002\u5982\u679c\u60a8\u53d1\u73b0\u4e86\u7b14\u8bef\u3001\u94fe\u63a5\u5931\u6548\u3001\u5185\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u4e49\u3001\u89e3\u91ca\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7ed3\u6784\u4e0d\u5408\u7406\u7b49\u95ee\u9898\uff0c\u8bf7\u534f\u52a9\u6211\u4eec\u8fdb\u884c\u4fee\u6b63\uff0c\u4ee5\u7ed9\u8bfb\u8005\u63d0\u4f9b\u66f4\u4f18\u8d28\u7684\u5b66\u4e60\u8d44\u6e90\u3002

    \u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c06\u5728\u672c\u4e66\u4ed3\u5e93\u3001\u7f51\u9875\u7248\u548c PDF \u7248\u7684\u4e3b\u9875\u4e0a\u8fdb\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8c22\u4ed6\u4eec\u5bf9\u5f00\u6e90\u793e\u533a\u7684\u65e0\u79c1\u5949\u732e\u3002

    \u5f00\u6e90\u7684\u9b45\u529b

    \u7eb8\u8d28\u56fe\u4e66\u7684\u4e24\u6b21\u5370\u5237\u7684\u95f4\u9694\u65f6\u95f4\u5f80\u5f80\u8f83\u4e45\uff0c\u5185\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

    \u800c\u5728\u672c\u5f00\u6e90\u4e66\u4e2d\uff0c\u5185\u5bb9\u66f4\u8fed\u7684\u65f6\u95f4\u88ab\u7f29\u77ed\u81f3\u6570\u65e5\u751a\u81f3\u51e0\u4e2a\u5c0f\u65f6\u3002

    "},{"location":"chapter_appendix/contribution/#1","title":"1. \u00a0 \u5185\u5bb9\u5fae\u8c03","text":"

    \u5982\u56fe 16-3 \u6240\u793a\uff0c\u6bcf\u4e2a\u9875\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7f16\u8f91\u56fe\u6807\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9aa4\u4fee\u6539\u6587\u672c\u6216\u4ee3\u7801\u3002

    1. \u70b9\u51fb\u201c\u7f16\u8f91\u56fe\u6807\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u4ed3\u5e93\u201d\u7684\u63d0\u793a\uff0c\u8bf7\u540c\u610f\u8be5\u64cd\u4f5c\u3002
    2. \u4fee\u6539 Markdown \u6e90\u6587\u4ef6\u5185\u5bb9\uff0c\u68c0\u67e5\u5185\u5bb9\u7684\u6b63\u786e\u6027\uff0c\u5e76\u5c3d\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7edf\u4e00\u3002
    3. \u5728\u9875\u9762\u5e95\u90e8\u586b\u5199\u4fee\u6539\u8bf4\u660e\uff0c\u7136\u540e\u70b9\u51fb\u201cPropose file change\u201d\u6309\u94ae\u3002\u9875\u9762\u8df3\u8f6c\u540e\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002

    \u56fe 16-3 \u00a0 \u9875\u9762\u7f16\u8f91\u6309\u952e

    \u56fe\u7247\u65e0\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u901a\u8fc7\u65b0\u5efa Issue \u6216\u8bc4\u8bba\u7559\u8a00\u6765\u63cf\u8ff0\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5c3d\u5feb\u91cd\u65b0\u7ed8\u5236\u5e76\u66ff\u6362\u56fe\u7247\u3002

    "},{"location":"chapter_appendix/contribution/#2","title":"2. \u00a0 \u5185\u5bb9\u521b\u4f5c","text":"

    \u5982\u679c\u60a8\u6709\u5174\u8da3\u53c2\u4e0e\u6b64\u5f00\u6e90\u9879\u76ee\uff0c\u5305\u62ec\u5c06\u4ee3\u7801\u7ffb\u8bd1\u6210\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u3001\u6269\u5c55\u6587\u7ae0\u5185\u5bb9\u7b49\uff0c\u90a3\u4e48\u9700\u8981\u5b9e\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

    1. \u767b\u5f55 GitHub \uff0c\u5c06\u672c\u4e66\u7684\u4ee3\u7801\u4ed3\u5e93 Fork \u5230\u4e2a\u4eba\u8d26\u53f7\u4e0b\u3002
    2. \u8fdb\u5165\u60a8\u7684 Fork \u4ed3\u5e93\u7f51\u9875\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c06\u4ed3\u5e93\u514b\u9686\u81f3\u672c\u5730\u3002
    3. \u5728\u672c\u5730\u8fdb\u884c\u5185\u5bb9\u521b\u4f5c\uff0c\u5e76\u8fdb\u884c\u5b8c\u6574\u6d4b\u8bd5\uff0c\u9a8c\u8bc1\u4ee3\u7801\u7684\u6b63\u786e\u6027\u3002
    4. \u5c06\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u540e Push \u81f3\u8fdc\u7a0b\u4ed3\u5e93\u3002
    5. \u5237\u65b0\u4ed3\u5e93\u7f51\u9875\uff0c\u70b9\u51fb\u201cCreate pull request\u201d\u6309\u94ae\u5373\u53ef\u53d1\u8d77\u62c9\u53d6\u8bf7\u6c42\u3002
    "},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

    \u5728 hello-algo \u6839\u76ee\u5f55\u4e0b\uff0c\u6267\u884c\u4ee5\u4e0b Docker \u811a\u672c\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8bbf\u95ee\u672c\u9879\u76ee\uff1a

    docker-compose up -d\n

    \u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u5220\u9664\u90e8\u7f72\uff1a

    docker-compose down\n
    "},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7f16\u7a0b\u73af\u5883\u5b89\u88c5","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88c5 IDE","text":"

    \u63a8\u8350\u4f7f\u7528\u5f00\u6e90\u3001\u8f7b\u91cf\u7684 VS Code \u4f5c\u4e3a\u672c\u5730\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09\u3002\u8bbf\u95ee VS Code \u5b98\u7f51\uff0c\u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u9009\u62e9\u76f8\u5e94\u7248\u672c\u7684 VS Code \u8fdb\u884c\u4e0b\u8f7d\u548c\u5b89\u88c5\u3002

    \u56fe 16-1 \u00a0 \u4ece\u5b98\u7f51\u4e0b\u8f7d VS Code

    VS Code \u62e5\u6709\u5f3a\u5927\u7684\u6269\u5c55\u5305\u751f\u6001\u7cfb\u7edf\uff0c\u652f\u6301\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u7684\u8fd0\u884c\u548c\u8c03\u8bd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5b89\u88c5\u201cPython Extension Pack\u201d\u6269\u5c55\u5305\u4e4b\u540e\uff0c\u5373\u53ef\u8fdb\u884c Python \u4ee3\u7801\u8c03\u8bd5\u3002\u5b89\u88c5\u6b65\u9aa4\u5982\u56fe 16-2 \u6240\u793a\u3002

    \u56fe 16-2 \u00a0 \u5b89\u88c5 VS Code \u6269\u5c55\u5305

    "},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88c5\u8bed\u8a00\u73af\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88c5 Python Extension Pack \u3002
    3. \uff08\u53ef\u9009\uff09\u5728\u547d\u4ee4\u884c\u8f93\u5165 pip install black \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u73af\u5883","text":"
    1. Windows \u7cfb\u7edf\u9700\u8981\u5b89\u88c5 MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e26 Clang \uff0c\u65e0\u987b\u5b89\u88c5\u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88c5 C/C++ Extension Pack \u3002
    3. \uff08\u53ef\u9009\uff09\u6253\u5f00 Settings \u9875\u9762\uff0c\u641c\u7d22 Clang_format_fallback Style \u4ee3\u7801\u683c\u5f0f\u5316\u9009\u9879\uff0c\u8bbe\u7f6e\u4e3a { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
    "},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 OpenJDK\uff08\u7248\u672c\u9700\u6ee1\u8db3 > JDK 9\uff09\u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88c5 Extension Pack for Java \u3002
    "},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 .Net 8.0 \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88c5 C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
    3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88c5\u6559\u7a0b\uff09\u3002
    "},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 go \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88c5 Go \u3002
    3. \u6309\u5feb\u6377\u952e Ctrl + Shift + P \u547c\u51fa\u547d\u4ee4\u680f\uff0c\u8f93\u5165 go \uff0c\u9009\u62e9 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9009\u5e76\u5b89\u88c5\u5373\u53ef\u3002
    "},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Swift \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88c5 Swift for Visual Studio Code \u3002
    "},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Node.js \u3002
    2. \uff08\u53ef\u9009\uff09\u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88c5\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 TypeScript \u73af\u5883","text":"
    1. \u540c JavaScript \u73af\u5883\u5b89\u88c5\u6b65\u9aa4\u3002
    2. \u5b89\u88c5 TypeScript Execute (tsx) \u3002
    3. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 typescript \uff0c\u5b89\u88c5 Pretty TypeScript Errors \u3002
    "},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 Dart \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Dart \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88c5 Dart \u3002
    "},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 Rust \u73af\u5883","text":"
    1. \u4e0b\u8f7d\u5e76\u5b89\u88c5 Rust \u3002
    2. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88c5 rust-analyzer \u3002
    "},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u672f\u8bed\u8868","text":"

    \u8868 16-1 \u5217\u51fa\u4e86\u4e66\u4e2d\u51fa\u73b0\u7684\u91cd\u8981\u672f\u8bed\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\u3002

    • \u5efa\u8bae\u8bb0\u4f4f\u540d\u8bcd\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u9605\u8bfb\u82f1\u6587\u6587\u732e\u3002
    • \u90e8\u5206\u540d\u8bcd\u5728\u7b80\u4f53\u4e2d\u6587\u548c\u7e41\u4f53\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

    \u8868 16-1 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8bcd

    English \u7b80\u4f53\u4e2d\u6587 \u7e41\u4f53\u4e2d\u6587 algorithm \u7b97\u6cd5 \u6f14\u7b97\u6cd5 data structure \u6570\u636e\u7ed3\u6784 \u8cc7\u6599\u7d50\u69cb code \u4ee3\u7801 \u7a0b\u5f0f\u78bc file \u6587\u4ef6 \u6a94\u6848 function \u51fd\u6570 \u51fd\u5f0f method \u65b9\u6cd5 \u65b9\u6cd5 variable \u53d8\u91cf \u8b8a\u6578 asymptotic complexity analysis \u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790 \u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790 time complexity \u65f6\u95f4\u590d\u6742\u5ea6 \u6642\u9593\u8907\u96dc\u5ea6 space complexity \u7a7a\u95f4\u590d\u6742\u5ea6 \u7a7a\u9593\u8907\u96dc\u5ea6 loop \u5faa\u73af \u8ff4\u5708 iteration \u8fed\u4ee3 \u8fed\u4ee3 recursion \u9012\u5f52 \u905e\u8ff4 tail recursion \u5c3e\u9012\u5f52 \u5c3e\u905e\u8ff4 recursion tree \u9012\u5f52\u6811 \u905e\u8ff4\u6a39 big-\\(O\\) notation \u5927 \\(O\\) \u8bb0\u53f7 \u5927 \\(O\\) \u8a18\u865f asymptotic upper bound \u6e10\u8fd1\u4e0a\u754c \u6f38\u8fd1\u4e0a\u754c sign-magnitude \u539f\u7801 \u539f\u78bc 1\u2019s complement \u53cd\u7801 \u4e00\u88dc\u6578 2\u2019s complement \u8865\u7801 \u4e8c\u88dc\u6578 array \u6570\u7ec4 \u9663\u5217 index \u7d22\u5f15 \u7d22\u5f15 linked list \u94fe\u8868 \u93c8\u7d50\u4e32\u5217 linked list node, list node \u94fe\u8868\u8282\u70b9 \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede head node \u5934\u8282\u70b9 \u982d\u7bc0\u9ede tail node \u5c3e\u8282\u70b9 \u5c3e\u7bc0\u9ede list \u5217\u8868 \u4e32\u5217 dynamic array \u52a8\u6001\u6570\u7ec4 \u52d5\u614b\u9663\u5217 hard disk \u786c\u76d8 \u786c\u789f random-access memory (RAM) \u5185\u5b58 \u8a18\u61b6\u9ad4 cache memory \u7f13\u5b58 \u5feb\u53d6 cache miss \u7f13\u5b58\u672a\u547d\u4e2d \u5feb\u53d6\u672a\u547d\u4e2d cache hit rate \u7f13\u5b58\u547d\u4e2d\u7387 \u5feb\u53d6\u547d\u4e2d\u7387 stack \u6808 \u5806\u758a top of the stack \u6808\u9876 \u5806\u758a\u9802 bottom of the stack \u6808\u5e95 \u5806\u758a\u5e95 queue \u961f\u5217 \u4f47\u5217 double-ended queue \u53cc\u5411\u961f\u5217 \u96d9\u5411\u4f47\u5217 front of the queue \u961f\u9996 \u4f47\u5217\u9996 rear of the queue \u961f\u5c3e \u4f47\u5217\u5c3e hash table \u54c8\u5e0c\u8868 \u96dc\u6e4a\u8868 hash set \u54c8\u5e0c\u96c6\u5408 \u96dc\u6e4a\u96c6\u5408 bucket \u6876 \u6876 hash function \u54c8\u5e0c\u51fd\u6570 \u96dc\u6e4a\u51fd\u5f0f hash collision \u54c8\u5e0c\u51b2\u7a81 \u96dc\u6e4a\u885d\u7a81 load factor \u8d1f\u8f7d\u56e0\u5b50 \u8ca0\u8f09\u56e0\u5b50 separate chaining \u94fe\u5f0f\u5730\u5740 \u93c8\u7d50\u4f4d\u5740 open addressing \u5f00\u653e\u5bfb\u5740 \u958b\u653e\u5b9a\u5740 linear probing \u7ebf\u6027\u63a2\u6d4b \u7dda\u6027\u63a2\u67e5 lazy deletion \u61d2\u5220\u9664 \u61f6\u522a\u9664 binary tree \u4e8c\u53c9\u6811 \u4e8c\u5143\u6a39 tree node \u6811\u8282\u70b9 \u6a39\u7bc0\u9ede left-child node \u5de6\u5b50\u8282\u70b9 \u5de6\u5b50\u7bc0\u9ede right-child node \u53f3\u5b50\u8282\u70b9 \u53f3\u5b50\u7bc0\u9ede parent node \u7236\u8282\u70b9 \u7236\u7bc0\u9ede left subtree \u5de6\u5b50\u6811 \u5de6\u5b50\u6a39 right subtree \u53f3\u5b50\u6811 \u53f3\u5b50\u6a39 root node \u6839\u8282\u70b9 \u6839\u7bc0\u9ede leaf node \u53f6\u8282\u70b9 \u8449\u7bc0\u9ede edge \u8fb9 \u908a level \u5c42 \u5c64 degree \u5ea6 \u5ea6 height \u9ad8\u5ea6 \u9ad8\u5ea6 depth \u6df1\u5ea6 \u6df1\u5ea6 perfect binary tree \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u5b8c\u7f8e\u4e8c\u5143\u6a39 complete binary tree \u5b8c\u5168\u4e8c\u53c9\u6811 \u5b8c\u5168\u4e8c\u5143\u6a39 full binary tree \u5b8c\u6ee1\u4e8c\u53c9\u6811 \u5b8c\u6eff\u4e8c\u5143\u6a39 balanced binary tree \u5e73\u8861\u4e8c\u53c9\u6811 \u5e73\u8861\u4e8c\u5143\u6a39 binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 AVL tree AVL \u6811 AVL \u6a39 red-black tree \u7ea2\u9ed1\u6811 \u7d05\u9ed1\u6a39 level-order traversal \u5c42\u5e8f\u904d\u5386 \u5c64\u5e8f\u8d70\u8a2a breadth-first traversal \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a depth-first traversal \u6df1\u5ea6\u4f18\u5148\u904d\u5386 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a binary search tree \u4e8c\u53c9\u641c\u7d22\u6811 \u4e8c\u5143\u641c\u5c0b\u6a39 balanced binary search tree \u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811 \u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39 balance factor \u5e73\u8861\u56e0\u5b50 \u5e73\u8861\u56e0\u5b50 heap \u5806 \u5806\u7a4d max heap \u5927\u9876\u5806 \u5927\u9802\u5806\u7a4d min heap \u5c0f\u9876\u5806 \u5c0f\u9802\u5806\u7a4d priority queue \u4f18\u5148\u961f\u5217 \u512a\u5148\u4f47\u5217 heapify \u5806\u5316 \u5806\u7a4d\u5316 top-\\(k\\) problem Top-\\(k\\) \u95ee\u9898 Top-\\(k\\) \u554f\u984c graph \u56fe \u5716 vertex \u9876\u70b9 \u9802\u9ede undirected graph \u65e0\u5411\u56fe \u7121\u5411\u5716 directed graph \u6709\u5411\u56fe \u6709\u5411\u5716 connected graph \u8fde\u901a\u56fe \u9023\u901a\u5716 disconnected graph \u975e\u8fde\u901a\u56fe \u975e\u9023\u901a\u5716 weighted graph \u6709\u6743\u56fe \u6709\u6b0a\u5716 adjacency \u90bb\u63a5 \u9130\u63a5 path \u8def\u5f84 \u8def\u5f91 in-degree \u5165\u5ea6 \u5165\u5ea6 out-degree \u51fa\u5ea6 \u51fa\u5ea6 adjacency matrix \u90bb\u63a5\u77e9\u9635 \u9130\u63a5\u77e9\u9663 adjacency list \u90bb\u63a5\u8868 \u9130\u63a5\u8868 breadth-first search \u5e7f\u5ea6\u4f18\u5148\u641c\u7d22 \u5ee3\u5ea6\u512a\u5148\u641c\u5c0b depth-first search \u6df1\u5ea6\u4f18\u5148\u641c\u7d22 \u6df1\u5ea6\u512a\u5148\u641c\u5c0b binary search \u4e8c\u5206\u67e5\u627e \u4e8c\u5206\u641c\u5c0b searching algorithm \u641c\u7d22\u7b97\u6cd5 \u641c\u5c0b\u6f14\u7b97\u6cd5 sorting algorithm \u6392\u5e8f\u7b97\u6cd5 \u6392\u5e8f\u6f14\u7b97\u6cd5 selection sort \u9009\u62e9\u6392\u5e8f \u9078\u64c7\u6392\u5e8f bubble sort \u5192\u6ce1\u6392\u5e8f \u6ce1\u6cab\u6392\u5e8f insertion sort \u63d2\u5165\u6392\u5e8f \u63d2\u5165\u6392\u5e8f quick sort \u5feb\u901f\u6392\u5e8f \u5feb\u901f\u6392\u5e8f merge sort \u5f52\u5e76\u6392\u5e8f \u5408\u4f75\u6392\u5e8f heap sort \u5806\u6392\u5e8f \u5806\u7a4d\u6392\u5e8f bucket sort \u6876\u6392\u5e8f \u6876\u6392\u5e8f counting sort \u8ba1\u6570\u6392\u5e8f \u8a08\u6578\u6392\u5e8f radix sort \u57fa\u6570\u6392\u5e8f \u57fa\u6578\u6392\u5e8f divide and conquer \u5206\u6cbb \u5206\u6cbb hanota problem \u6c49\u8bfa\u5854\u95ee\u9898 \u6cb3\u5167\u5854\u554f\u984c backtracking algorithm \u56de\u6eaf\u7b97\u6cd5 \u56de\u6eaf\u6f14\u7b97\u6cd5 constraint \u7ea6\u675f \u7d04\u675f solution \u89e3 \u89e3 state \u72b6\u6001 \u72c0\u614b pruning \u526a\u679d \u526a\u679d permutations problem \u5168\u6392\u5217\u95ee\u9898 \u5168\u6392\u5217\u554f\u984c subset-sum problem \u5b50\u96c6\u548c\u95ee\u9898 \u5b50\u96c6\u5408\u554f\u984c \\(n\\)-queens problem \\(n\\) \u7687\u540e\u95ee\u9898 \\(n\\) \u7687\u540e\u554f\u984c dynamic programming \u52a8\u6001\u89c4\u5212 \u52d5\u614b\u898f\u5283 initial state \u521d\u59cb\u72b6\u6001 \u521d\u59cb\u72c0\u614b state-transition equation \u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \u72c0\u614b\u8f49\u79fb\u65b9\u7a0b knapsack problem \u80cc\u5305\u95ee\u9898 \u80cc\u5305\u554f\u984c edit distance problem \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c greedy algorithm \u8d2a\u5fc3\u7b97\u6cd5 \u8caa\u5a6a\u6f14\u7b97\u6cd5"},{"location":"chapter_array_and_linkedlist/","title":"\u7b2c 4 \u7ae0 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868","text":"

    Abstract

    \u6570\u636e\u7ed3\u6784\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5b9e\u7684\u7816\u5899\u3002

    \u6570\u7ec4\u7684\u7816\u5757\u6574\u9f50\u6392\u5217\uff0c\u9010\u4e2a\u7d27\u8d34\u3002\u94fe\u8868\u7684\u7816\u5757\u5206\u6563\u5404\u5904\uff0c\u8fde\u63a5\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u4e8e\u7816\u7f1d\u4e4b\u95f4\u3002

    "},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 4.1 \u00a0 \u6570\u7ec4
    • 4.2 \u00a0 \u94fe\u8868
    • 4.3 \u00a0 \u5217\u8868
    • 4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *
    • 4.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u6570\u7ec4","text":"

    \u6570\u7ec4\uff08array\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5c06\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002\u6211\u4eec\u5c06\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u4f4d\u7f6e\u79f0\u4e3a\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u56fe 4-1 \u5c55\u793a\u4e86\u6570\u7ec4\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5b58\u50a8\u65b9\u5f0f\u3002

    \u56fe 4-1 \u00a0 \u6570\u7ec4\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

    "},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1 \u00a0 \u6570\u7ec4\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/array/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u6570\u7ec4","text":"

    \u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u9009\u7528\u6570\u7ec4\u7684\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u65e0\u521d\u59cb\u503c\u3001\u7ed9\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u51b5\u4e0b\uff0c\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4f1a\u5c06\u6570\u7ec4\u5143\u7d20\u521d\u59cb\u5316\u4e3a \\(0\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    # \u521d\u59cb\u5316\u6570\u7ec4\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
    array.cpp
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\n// \u5b58\u50a8\u5728\u6808\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5b58\u50a8\u5728\u5806\u4e0a\uff08\u9700\u8981\u624b\u52a8\u91ca\u653e\u7a7a\u95f4\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
    array.java
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
    array.cs
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
    array.go
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[5]int\uff09\u4e3a\u6570\u7ec4\uff0c\u4e0d\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[]int\uff09\u4e3a\u5207\u7247\n// \u7531\u4e8e Go \u7684\u6570\u7ec4\u88ab\u8bbe\u8ba1\u4e3a\u5728\u7f16\u8bd1\u671f\u786e\u5b9a\u957f\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u91cf\u6765\u6307\u5b9a\u957f\u5ea6\n// \u4e3a\u4e86\u65b9\u4fbf\u5b9e\u73b0\u6269\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c06\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u6570\u7ec4\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
    array.swift
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
    array.js
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
    array.ts
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
    array.dart
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
    array.rs
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nlet arr: [i32; 5] = [0; 5]; // [0, 0, 0, 0, 0]\nlet slice: &[i32] = &[0; 5];\n// \u5728 Rust \u4e2d\uff0c\u6307\u5b9a\u957f\u5ea6\u65f6\uff08[i32; 5]\uff09\u4e3a\u6570\u7ec4\uff0c\u4e0d\u6307\u5b9a\u957f\u5ea6\u65f6\uff08&[i32]\uff09\u4e3a\u5207\u7247\n// \u7531\u4e8e Rust \u7684\u6570\u7ec4\u88ab\u8bbe\u8ba1\u4e3a\u5728\u7f16\u8bd1\u671f\u786e\u5b9a\u957f\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u91cf\u6765\u6307\u5b9a\u957f\u5ea6\n// Vector \u662f Rust \u4e00\u822c\u60c5\u51b5\u4e0b\u7528\u4f5c\u52a8\u6001\u6570\u7ec4\u7684\u7c7b\u578b\n// \u4e3a\u4e86\u65b9\u4fbf\u5b9e\u73b0\u6269\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c06 vector \u770b\u4f5c\u6570\u7ec4\uff08array\uff09\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    array.c
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
    array.kt
    /* \u521d\u59cb\u5316\u6570\u7ec4 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
    array.rb
    # \u521d\u59cb\u5316\u6570\u7ec4\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
    array.zig
    // \u521d\u59cb\u5316\u6570\u7ec4\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

    \u6570\u7ec4\u5143\u7d20\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u8fd9\u610f\u5473\u7740\u8ba1\u7b97\u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7ed9\u5b9a\u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09\u548c\u67d0\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u56fe 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8ba1\u7b97\u5f97\u5230\u8be5\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u76f4\u63a5\u8bbf\u95ee\u8be5\u5143\u7d20\u3002

    \u56fe 4-2 \u00a0 \u6570\u7ec4\u5143\u7d20\u7684\u5185\u5b58\u5730\u5740\u8ba1\u7b97

    \u89c2\u5bdf\u56fe 4-2 \uff0c\u6211\u4eec\u53d1\u73b0\u6570\u7ec4\u9996\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u4e3a \\(0\\) \uff0c\u8fd9\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\u4f1a\u66f4\u81ea\u7136\u3002\u4f46\u4ece\u5730\u5740\u8ba1\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8d28\u4e0a\u662f\u5185\u5b58\u5730\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u4e2a\u5143\u7d20\u7684\u5730\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u4e3a \\(0\\) \u662f\u5408\u7406\u7684\u3002

    \u5728\u6570\u7ec4\u4e2d\u8bbf\u95ee\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u968f\u673a\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u5143\u7d20\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def random_access(nums: list[int]) -> int:\n    \"\"\"\u968f\u673a\u8bbf\u95ee\u5143\u7d20\"\"\"\n    # \u5728\u533a\u95f4 [0, len(nums)-1] \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    random_index = random.randint(0, len(nums) - 1)\n    # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    random_num = nums[random_index]\n    return random_num\n
    array.cpp
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.java
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int[] nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.cs
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u5728\u533a\u95f4 [0, nums.Length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = random.Next(nums.Length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.go
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    randomIndex := rand.Intn(len(nums))\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    randomNum = nums[randomIndex]\n    return\n}\n
    array.swift
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u5728\u533a\u95f4 [0, nums.count) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let randomIndex = nums.indices.randomElement()!\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
    array.js
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums) {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
    array.ts
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfunction randomAccess(nums: number[]): number {\n    // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    const random_num = nums[random_index];\n    return random_num;\n}\n
    array.dart
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(List<int> nums) {\n  // \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  int randomIndex = Random().nextInt(nums.length);\n  // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
    array.rs
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u5728\u533a\u95f4 [0, nums.len()) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    let random_num = nums[random_index];\n    random_num\n}\n
    array.c
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nint randomAccess(int *nums, int size) {\n    // \u5728\u533a\u95f4 [0, size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    int randomIndex = rand() % size;\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.kt
    /* \u968f\u673a\u8bbf\u95ee\u5143\u7d20 */\nfun randomAccess(nums: IntArray): Int {\n    // \u5728\u533a\u95f4 [0, nums.size) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
    array.rb
    ### \u968f\u673a\u8bbf\u95ee\u5143\u7d20 ###\ndef random_access(nums)\n  # \u5728\u533a\u95f4 [0, nums.length) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6570\u5b57\n  random_index = Random.rand(0...nums.length)\n\n  # \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n  nums[random_index]\nend\n
    array.zig
    // \u968f\u673a\u8bbf\u95ee\u5143\u7d20\nfn randomAccess(nums: []i32) i32 {\n    // \u5728\u533a\u95f4 [0, nums.len) \u4e2d\u968f\u673a\u62bd\u53d6\u4e00\u4e2a\u6574\u6570\n    var randomIndex = std.crypto.random.intRangeLessThan(usize, 0, nums.len);\n    // \u83b7\u53d6\u5e76\u8fd4\u56de\u968f\u673a\u5143\u7d20\n    var randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#3","title":"3. \u00a0 \u63d2\u5165\u5143\u7d20","text":"

    \u6570\u7ec4\u5143\u7d20\u5728\u5185\u5b58\u4e2d\u662f\u201c\u7d27\u6328\u7740\u7684\u201d\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u7a7a\u95f4\u518d\u5b58\u653e\u4efb\u4f55\u6570\u636e\u3002\u5982\u56fe 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u6570\u7ec4\u4e2d\u95f4\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\uff0c\u5219\u9700\u8981\u5c06\u8be5\u5143\u7d20\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u4e4b\u540e\u518d\u628a\u5143\u7d20\u8d4b\u503c\u7ed9\u8be5\u7d22\u5f15\u3002

    \u56fe 4-3 \u00a0 \u6570\u7ec4\u63d2\u5165\u5143\u7d20\u793a\u4f8b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u4f1a\u5bfc\u81f4\u6570\u7ec4\u5c3e\u90e8\u5143\u7d20\u201c\u4e22\u5931\u201d\u3002\u6211\u4eec\u5c06\u8fd9\u4e2a\u95ee\u9898\u7684\u89e3\u51b3\u65b9\u6848\u7559\u5728\u201c\u5217\u8868\u201d\u7ae0\u8282\u4e2d\u8ba8\u8bba\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\"\"\"\n    # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n
    array.cpp
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.java
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.cs
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid Insert(int[] nums, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.go
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums []int, num int, index int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
    array.swift
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
    array.js
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums, num, index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.ts
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.dart
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 _num */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u5c06 _num \u8d4b\u7ed9 index \u5904\u5143\u7d20\n  nums[index] = _num;\n}\n
    array.rs
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfn insert(nums: &mut [i32], num: i32, index: usize) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.c
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    array.kt
    /* \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num\n}\n
    array.rb
    ### \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num ###\ndef insert(nums, num, index)\n  # \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n  nums[index] = num\nend\n
    array.zig
    // \u5728\u6570\u7ec4\u7684\u7d22\u5f15 index \u5904\u63d2\u5165\u5143\u7d20 num\nfn insert(nums: []i32, num: i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    var i = nums.len - 1;\n    while (i > index) : (i -= 1) {\n        nums[i] = nums[i - 1];\n    }\n    // \u5c06 num \u8d4b\u7ed9 index \u5904\u7684\u5143\u7d20\n    nums[index] = num;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#4","title":"4. \u00a0 \u5220\u9664\u5143\u7d20","text":"

    \u540c\u7406\uff0c\u5982\u56fe 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u5220\u9664\u7d22\u5f15 \\(i\\) \u5904\u7684\u5143\u7d20\uff0c\u5219\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\u3002

    \u56fe 4-4 \u00a0 \u6570\u7ec4\u5220\u9664\u5143\u7d20\u793a\u4f8b

    \u8bf7\u6ce8\u610f\uff0c\u5220\u9664\u5143\u7d20\u5b8c\u6210\u540e\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u53d8\u5f97\u201c\u65e0\u610f\u4e49\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u987b\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def remove(nums: list[int], index: int):\n    \"\"\"\u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\"\"\"\n    # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
    array.cpp
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.java
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.cs
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid Remove(int[] nums, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.go
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums []int, index int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
    array.swift
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
    array.js
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums, index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.ts
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfunction remove(nums: number[], index: number): void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.dart
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nvoid remove(List<int> nums, int index) {\n  // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
    array.rs
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfn remove(nums: &mut [i32], index: usize) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.c
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(int *nums, int size, int index) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.kt
    /* \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 */\nfun remove(nums: IntArray, index: Int) {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
    array.rb
    ### \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20 ###\ndef remove(nums, index)\n  # \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
    array.zig
    // \u5220\u9664\u7d22\u5f15 index \u5904\u7684\u5143\u7d20\nfn remove(nums: []i32, index: usize) void {\n    // \u628a\u7d22\u5f15 index \u4e4b\u540e\u7684\u6240\u6709\u5143\u7d20\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    var i = index;\n    while (i < nums.len - 1) : (i += 1) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u603b\u7684\u6765\u770b\uff0c\u6570\u7ec4\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u70b9\u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6\u9ad8\uff1a\u6570\u7ec4\u7684\u63d2\u5165\u548c\u5220\u9664\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u957f\u5ea6\u3002
    • \u4e22\u5931\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u540e\uff0c\u8d85\u51fa\u6570\u7ec4\u957f\u5ea6\u8303\u56f4\u7684\u5143\u7d20\u4f1a\u4e22\u5931\u3002
    • \u5185\u5b58\u6d6a\u8d39\uff1a\u6211\u4eec\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e2a\u6bd4\u8f83\u957f\u7684\u6570\u7ec4\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u8fd9\u6837\u5728\u63d2\u5165\u6570\u636e\u65f6\uff0c\u4e22\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u65e0\u610f\u4e49\u201d\u7684\uff0c\u4f46\u8fd9\u6837\u505a\u4f1a\u9020\u6210\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u904d\u5386\u6570\u7ec4","text":"

    \u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e2\u53ef\u4ee5\u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u83b7\u53d6\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def traverse(nums: list[int]):\n    \"\"\"\u904d\u5386\u6570\u7ec4\"\"\"\n    count = 0\n    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums:\n        count += num\n    # \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
    array.cpp
    /* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
    array.java
    /* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (int num : nums) {\n        count += num;\n    }\n}\n
    array.cs
    /* \u904d\u5386\u6570\u7ec4 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
    array.go
    /* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for _, num := range nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
    array.swift
    /* \u904d\u5386\u6570\u7ec4 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        count += num\n    }\n    // \u540c\u65f6\u904d\u5386\u6570\u636e\u7d22\u5f15\u548c\u5143\u7d20\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
    array.js
    /* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
    array.ts
    /* \u904d\u5386\u6570\u7ec4 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (const num of nums) {\n        count += num;\n    }\n}\n
    array.dart
    /* \u904d\u5386\u6570\u7ec4\u5143\u7d20 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u901a\u8fc7 forEach \u65b9\u6cd5\u904d\u5386\u6570\u7ec4\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
    array.rs
    /* \u904d\u5386\u6570\u7ec4 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for num in nums {\n        _count += num;\n    }\n}\n
    array.c
    /* \u904d\u5386\u6570\u7ec4 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
    array.kt
    /* \u904d\u5386\u6570\u7ec4 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (j in nums) {\n        count += j\n    }\n}\n
    array.rb
    ### \u904d\u5386\u6570\u7ec4 ###\ndef traverse(nums)\n  count = 0\n\n  # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n  for num in nums\n    count += num\n  end\nend\n
    array.zig
    // \u904d\u5386\u6570\u7ec4\nfn traverse(nums: []i32) void {\n    var count: i32 = 0;\n    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u6570\u7ec4\n    var i: i32 = 0;\n    while (i < nums.len) : (i += 1) {\n        count += nums[i];\n    }\n    count = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\u5143\u7d20\n    for (nums) |num| {\n        count += num;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#6","title":"6. \u00a0 \u67e5\u627e\u5143\u7d20","text":"

    \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\u9700\u8981\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u5224\u65ad\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5219\u8f93\u51fa\u5bf9\u5e94\u7d22\u5f15\u3002

    \u56e0\u4e3a\u6570\u7ec4\u662f\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u627e\u64cd\u4f5c\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u67e5\u627e\u201d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
    array.cpp
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.java
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.cs
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.go
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
    array.swift
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
    array.js
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
    array.ts
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    array.dart
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
    array.rs
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
    array.c
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.kt
    /* \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
    array.rb
    ### \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
    array.zig
    // \u5728\u6570\u7ec4\u4e2d\u67e5\u627e\u6307\u5b9a\u5143\u7d20\nfn find(nums: []i32, target: i32) i32 {\n    for (nums, 0..) |num, i| {\n        if (num == target) return @intCast(i);\n    }\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u6269\u5bb9\u6570\u7ec4","text":"

    \u5728\u590d\u6742\u7684\u7cfb\u7edf\u73af\u5883\u4e2d\uff0c\u7a0b\u5e8f\u96be\u4ee5\u4fdd\u8bc1\u6570\u7ec4\u4e4b\u540e\u7684\u5185\u5b58\u7a7a\u95f4\u662f\u53ef\u7528\u7684\uff0c\u4ece\u800c\u65e0\u6cd5\u5b89\u5168\u5730\u6269\u5c55\u6570\u7ec4\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6570\u7ec4\u7684\u957f\u5ea6\u662f\u4e0d\u53ef\u53d8\u7684\u3002

    \u5982\u679c\u6211\u4eec\u5e0c\u671b\u6269\u5bb9\u6570\u7ec4\uff0c\u5219\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u7136\u540e\u628a\u539f\u6570\u7ec4\u5143\u7d20\u4f9d\u6b21\u590d\u5236\u5230\u65b0\u6570\u7ec4\u3002\u8fd9\u662f\u4e00\u4e2a \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u6570\u7ec4\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u8017\u65f6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u6269\u5c55\u6570\u7ec4\u957f\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res = [0] * (len(nums) + enlarge)\n    # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n
    array.cpp
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = new int[size + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    delete[] nums;\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.java
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.cs
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.go
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    res := make([]int, len(nums)+enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
    array.swift
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
    array.js
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.ts
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\n// \u8bf7\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n// \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.dart
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  return res;\n}\n
    array.rs
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfn extend(nums: &[i32], enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    res\n}\n
    array.c
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u6269\u5c55\u540e\u7684\u7a7a\u95f4\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    array.kt
    /* \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    val res = IntArray(nums.size + enlarge)\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res\n}\n
    array.rb
    ### \u6269\u5c55\u6570\u7ec4\u957f\u5ea6 ###\n# \u8bf7\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52a8\u6001\u6570\u7ec4\uff0c\u53ef\u4ee5\u76f4\u63a5\u6269\u5c55\n# \u4e3a\u4e86\u65b9\u4fbf\u5b66\u4e60\uff0c\u672c\u51fd\u6570\u5c06 Array \u770b\u4f5c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6570\u7ec4\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n  res\nend\n
    array.zig
    // \u6269\u5c55\u6570\u7ec4\u957f\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u6269\u5c55\u957f\u5ea6\u540e\u7684\u6570\u7ec4\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u6269\u5c55\u540e\u7684\u65b0\u6570\u7ec4\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u6570\u7ec4\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u4e14\u5143\u7d20\u7c7b\u578b\u76f8\u540c\u3002\u8fd9\u79cd\u505a\u6cd5\u5305\u542b\u4e30\u5bcc\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u7cfb\u7edf\u53ef\u4ee5\u5229\u7528\u8fd9\u4e9b\u4fe1\u606f\u6765\u4f18\u5316\u6570\u636e\u7ed3\u6784\u7684\u64cd\u4f5c\u6548\u7387\u3002

    • \u7a7a\u95f4\u6548\u7387\u9ad8\uff1a\u6570\u7ec4\u4e3a\u6570\u636e\u5206\u914d\u4e86\u8fde\u7eed\u7684\u5185\u5b58\u5757\uff0c\u65e0\u987b\u989d\u5916\u7684\u7ed3\u6784\u5f00\u9500\u3002
    • \u652f\u6301\u968f\u673a\u8bbf\u95ee\uff1a\u6570\u7ec4\u5141\u8bb8\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u4efb\u4f55\u5143\u7d20\u3002
    • \u7f13\u5b58\u5c40\u90e8\u6027\uff1a\u5f53\u8bbf\u95ee\u6570\u7ec4\u5143\u7d20\u65f6\uff0c\u8ba1\u7b97\u673a\u4e0d\u4ec5\u4f1a\u52a0\u8f7d\u5b83\uff0c\u8fd8\u4f1a\u7f13\u5b58\u5176\u5468\u56f4\u7684\u5176\u4ed6\u6570\u636e\uff0c\u4ece\u800c\u501f\u52a9\u9ad8\u901f\u7f13\u5b58\u6765\u63d0\u5347\u540e\u7eed\u64cd\u4f5c\u7684\u6267\u884c\u901f\u5ea6\u3002

    \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u662f\u4e00\u628a\u53cc\u5203\u5251\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

    • \u63d2\u5165\u4e0e\u5220\u9664\u6548\u7387\u4f4e\uff1a\u5f53\u6570\u7ec4\u4e2d\u5143\u7d20\u8f83\u591a\u65f6\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52a8\u5927\u91cf\u7684\u5143\u7d20\u3002
    • \u957f\u5ea6\u4e0d\u53ef\u53d8\uff1a\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u6269\u5bb9\u6570\u7ec4\u9700\u8981\u5c06\u6240\u6709\u6570\u636e\u590d\u5236\u5230\u65b0\u6570\u7ec4\uff0c\u5f00\u9500\u5f88\u5927\u3002
    • \u7a7a\u95f4\u6d6a\u8d39\uff1a\u5982\u679c\u6570\u7ec4\u5206\u914d\u7684\u5927\u5c0f\u8d85\u8fc7\u5b9e\u9645\u6240\u9700\uff0c\u90a3\u4e48\u591a\u4f59\u7684\u7a7a\u95f4\u5c31\u88ab\u6d6a\u8d39\u4e86\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u6570\u7ec4\u5178\u578b\u5e94\u7528","text":"

    \u6570\u7ec4\u662f\u4e00\u79cd\u57fa\u7840\u4e14\u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\uff0c\u65e2\u9891\u7e41\u5e94\u7528\u5728\u5404\u7c7b\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u4e8e\u5b9e\u73b0\u5404\u79cd\u590d\u6742\u6570\u636e\u7ed3\u6784\u3002

    • \u968f\u673a\u8bbf\u95ee\uff1a\u5982\u679c\u6211\u4eec\u60f3\u968f\u673a\u62bd\u53d6\u4e00\u4e9b\u6837\u672c\uff0c\u90a3\u4e48\u53ef\u4ee5\u7528\u6570\u7ec4\u5b58\u50a8\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u968f\u673a\u5e8f\u5217\uff0c\u6839\u636e\u7d22\u5f15\u5b9e\u73b0\u968f\u673a\u62bd\u6837\u3002
    • \u6392\u5e8f\u548c\u641c\u7d22\uff1a\u6570\u7ec4\u662f\u6392\u5e8f\u548c\u641c\u7d22\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u4e8c\u5206\u67e5\u627e\u7b49\u90fd\u4e3b\u8981\u5728\u6570\u7ec4\u4e0a\u8fdb\u884c\u3002
    • \u67e5\u627e\u8868\uff1a\u5f53\u9700\u8981\u5feb\u901f\u67e5\u627e\u4e00\u4e2a\u5143\u7d20\u6216\u5176\u5bf9\u5e94\u5173\u7cfb\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u4f5c\u4e3a\u67e5\u627e\u8868\u3002\u5047\u5982\u6211\u4eec\u60f3\u5b9e\u73b0\u5b57\u7b26\u5230 ASCII \u7801\u7684\u6620\u5c04\uff0c\u5219\u53ef\u4ee5\u5c06\u5b57\u7b26\u7684 ASCII \u7801\u503c\u4f5c\u4e3a\u7d22\u5f15\uff0c\u5bf9\u5e94\u7684\u5143\u7d20\u5b58\u653e\u5728\u6570\u7ec4\u4e2d\u7684\u5bf9\u5e94\u4f4d\u7f6e\u3002
    • \u673a\u5668\u5b66\u4e60\uff1a\u795e\u7ecf\u7f51\u7edc\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9635\u3001\u5f20\u91cf\u4e4b\u95f4\u7684\u7ebf\u6027\u4ee3\u6570\u8fd0\u7b97\uff0c\u8fd9\u4e9b\u6570\u636e\u90fd\u662f\u4ee5\u6570\u7ec4\u7684\u5f62\u5f0f\u6784\u5efa\u7684\u3002\u6570\u7ec4\u662f\u795e\u7ecf\u7f51\u7edc\u7f16\u7a0b\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u6570\u636e\u7ed3\u6784\u3002
    • \u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff1a\u6570\u7ec4\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002\u4f8b\u5982\uff0c\u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u4e8c\u7ef4\u6570\u7ec4\u3002
    "},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u94fe\u8868","text":"

    \u5185\u5b58\u7a7a\u95f4\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u516c\u5171\u8d44\u6e90\uff0c\u5728\u4e00\u4e2a\u590d\u6742\u7684\u7cfb\u7edf\u8fd0\u884c\u73af\u5883\u4e0b\uff0c\u7a7a\u95f2\u7684\u5185\u5b58\u7a7a\u95f4\u53ef\u80fd\u6563\u843d\u5728\u5185\u5b58\u5404\u5904\u3002\u6211\u4eec\u77e5\u9053\uff0c\u5b58\u50a8\u6570\u7ec4\u7684\u5185\u5b58\u7a7a\u95f4\u5fc5\u987b\u662f\u8fde\u7eed\u7684\uff0c\u800c\u5f53\u6570\u7ec4\u975e\u5e38\u5927\u65f6\uff0c\u5185\u5b58\u53ef\u80fd\u65e0\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u8fde\u7eed\u7a7a\u95f4\u3002\u6b64\u65f6\u94fe\u8868\u7684\u7075\u6d3b\u6027\u4f18\u52bf\u5c31\u4f53\u73b0\u51fa\u6765\u4e86\u3002

    \u94fe\u8868\uff08linked list\uff09\u662f\u4e00\u79cd\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u5404\u4e2a\u8282\u70b9\u901a\u8fc7\u201c\u5f15\u7528\u201d\u76f8\u8fde\u63a5\u3002\u5f15\u7528\u8bb0\u5f55\u4e86\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5185\u5b58\u5730\u5740\uff0c\u901a\u8fc7\u5b83\u53ef\u4ee5\u4ece\u5f53\u524d\u8282\u70b9\u8bbf\u95ee\u5230\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002

    \u94fe\u8868\u7684\u8bbe\u8ba1\u4f7f\u5f97\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\uff0c\u5b83\u4eec\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

    \u56fe 4-5 \u00a0 \u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f

    \u89c2\u5bdf\u56fe 4-5 \uff0c\u94fe\u8868\u7684\u7ec4\u6210\u5355\u4f4d\u662f\u8282\u70b9\uff08node\uff09\u5bf9\u8c61\u3002\u6bcf\u4e2a\u8282\u70b9\u90fd\u5305\u542b\u4e24\u9879\u6570\u636e\uff1a\u8282\u70b9\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u201c\u5f15\u7528\u201d\u3002

    • \u94fe\u8868\u7684\u9996\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5934\u8282\u70b9\u201d\uff0c\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u88ab\u79f0\u4e3a\u201c\u5c3e\u8282\u70b9\u201d\u3002
    • \u5c3e\u8282\u70b9\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u522b\u88ab\u8bb0\u4e3a null\u3001nullptr \u548c None \u3002
    • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u9488\u7684\u8bed\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u5e94\u88ab\u66ff\u6362\u4e3a\u201c\u6307\u9488\u201d\u3002

    \u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u94fe\u8868\u8282\u70b9 ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u8fd8\u9700\u989d\u5916\u4fdd\u5b58\u4e00\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u6570\u636e\u91cf\u4e0b\uff0c\u94fe\u8868\u6bd4\u6570\u7ec4\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u8282\u70b9\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n
    /* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  //\u6784\u9020\u51fd\u6570\n    int val = x;         // \u8282\u70b9\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype ListNode struct {\n    Val  int       // \u8282\u70b9\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewListNode \u6784\u9020\u51fd\u6570\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u94fe\u8868\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u8282\u70b9\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u6784\u9020\u51fd\u6570\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u94fe\u8868\u8282\u70b9\u7c7b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
    /* \u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u8282\u70b9\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\n}\n
    # \u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val  # \u8282\u70b9\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
    // \u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n        }\n    };\n}\n
    "},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1 \u00a0 \u94fe\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u94fe\u8868","text":"

    \u5efa\u7acb\u94fe\u8868\u5206\u4e3a\u4e24\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\u5bf9\u8c61\uff0c\u7b2c\u4e8c\u6b65\u662f\u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\u5173\u7cfb\u3002\u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u4ece\u94fe\u8868\u7684\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u901a\u8fc7\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8bbf\u95ee\u6240\u6709\u8282\u70b9\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    # \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.cpp
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.java
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.cs
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.go
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
    linked_list.swift
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.js
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.ts
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.dart
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rs
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
    linked_list.c
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.kt
    /* \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rb
    # \u521d\u59cb\u5316\u94fe\u8868 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.zig
    // \u521d\u59cb\u5316\u94fe\u8868\n// \u521d\u59cb\u5316\u5404\u4e2a\u8282\u70b9\nvar n0 = inc.ListNode(i32){.val = 1};\nvar n1 = inc.ListNode(i32){.val = 3};\nvar n2 = inc.ListNode(i32){.val = 2};\nvar n3 = inc.ListNode(i32){.val = 5};\nvar n4 = inc.ListNode(i32){.val = 4};\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6570\u7ec4\u6574\u4f53\u662f\u4e00\u4e2a\u53d8\u91cf\uff0c\u6bd4\u5982\u6570\u7ec4 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u94fe\u8868\u662f\u7531\u591a\u4e2a\u72ec\u7acb\u7684\u8282\u70b9\u5bf9\u8c61\u7ec4\u6210\u7684\u3002\u6211\u4eec\u901a\u5e38\u5c06\u5934\u8282\u70b9\u5f53\u4f5c\u94fe\u8868\u7684\u4ee3\u79f0\uff0c\u6bd4\u5982\u4ee5\u4e0a\u4ee3\u7801\u4e2d\u7684\u94fe\u8868\u53ef\u8bb0\u4f5c\u94fe\u8868 n0 \u3002

    "},{"location":"chapter_array_and_linkedlist/linked_list/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

    \u5728\u94fe\u8868\u4e2d\u63d2\u5165\u8282\u70b9\u975e\u5e38\u5bb9\u6613\u3002\u5982\u56fe 4-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u60f3\u5728\u76f8\u90bb\u7684\u4e24\u4e2a\u8282\u70b9 n0 \u548c n1 \u4e4b\u95f4\u63d2\u5165\u4e00\u4e2a\u65b0\u8282\u70b9 P \uff0c\u5219\u53ea\u9700\u6539\u53d8\u4e24\u4e2a\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    \u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u6570\u7ec4\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u6548\u7387\u8f83\u4f4e\u3002

    \u56fe 4-6 \u00a0 \u94fe\u8868\u63d2\u5165\u8282\u70b9\u793a\u4f8b

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
    linked_list.cpp
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
    linked_list.java
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.cs
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.go
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
    linked_list.swift
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
    linked_list.js
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.ts
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.dart
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
    linked_list.rs
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
    linked_list.c
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
    linked_list.kt
    /* \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
    linked_list.rb
    ### \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u4e2a\u5185\u7f6e\u51fd\u6570\uff0c `P` \u662f\u4e00\u4e2a\u5e38\u91cf\uff0c\u6240\u4ee5\u53ef\u4ee5\u4f7f\u7528 `_p` \u4ee3\u66ff\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
    linked_list.zig
    // \u5728\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u63d2\u5165\u8282\u70b9 P\nfn insert(n0: ?*inc.ListNode(i32), P: ?*inc.ListNode(i32)) void {\n    var n1 = n0.?.next;\n    P.?.next = n1;\n    n0.?.next = P;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

    \u5982\u56fe 4-7 \u6240\u793a\uff0c\u5728\u94fe\u8868\u4e2d\u5220\u9664\u8282\u70b9\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u53d8\u4e00\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u3002

    \u8bf7\u6ce8\u610f\uff0c\u5c3d\u7ba1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\u8282\u70b9 P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5b9e\u9645\u4e0a\u904d\u5386\u6b64\u94fe\u8868\u5df2\u7ecf\u65e0\u6cd5\u8bbf\u95ee\u5230 P \uff0c\u8fd9\u610f\u5473\u7740 P \u5df2\u7ecf\u4e0d\u518d\u5c5e\u4e8e\u8be5\u94fe\u8868\u4e86\u3002

    \u56fe 4-7 \u00a0 \u94fe\u8868\u5220\u9664\u8282\u70b9

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def remove(n0: ListNode):\n    \"\"\"\u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
    linked_list.cpp
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    delete P;\n}\n
    linked_list.java
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.cs
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.go
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
    linked_list.swift
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
    linked_list.js
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.ts
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.dart
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
    linked_list.rs
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    if n0.borrow().next.is_none() {\n        return;\n    };\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
    linked_list.c
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u91ca\u653e\u5185\u5b58\n    free(P);\n}\n
    linked_list.kt
    /* \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
    linked_list.rb
    ### \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
    linked_list.zig
    // \u5220\u9664\u94fe\u8868\u7684\u8282\u70b9 n0 \u4e4b\u540e\u7684\u9996\u4e2a\u8282\u70b9\nfn remove(n0: ?*inc.ListNode(i32)) void {\n    if (n0.?.next == null) return;\n    // n0 -> P -> n1\n    var P = n0.?.next;\n    var n1 = P.?.next;\n    n0.?.next = n1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8bbf\u95ee\u8282\u70b9","text":"

    \u5728\u94fe\u8868\u4e2d\u8bbf\u95ee\u8282\u70b9\u7684\u6548\u7387\u8f83\u4f4e\u3002\u5982\u4e0a\u4e00\u8282\u6240\u8ff0\uff0c\u6211\u4eec\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u4e0b\u8bbf\u95ee\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u94fe\u8868\u5219\u4e0d\u7136\uff0c\u7a0b\u5e8f\u9700\u8981\u4ece\u5934\u8282\u70b9\u51fa\u53d1\uff0c\u9010\u4e2a\u5411\u540e\u904d\u5386\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u8282\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8bbf\u95ee\u94fe\u8868\u7684\u7b2c \\(i\\) \u4e2a\u8282\u70b9\u9700\u8981\u5faa\u73af \\(i - 1\\) \u8f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
    linked_list.cpp
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
    linked_list.java
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.cs
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.go
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
    linked_list.swift
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
    linked_list.js
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.ts
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.dart
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
    linked_list.rs
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Rc<RefCell<ListNode<T>>> {\n    if index <= 0 {\n        return head;\n    };\n    if let Some(node) = &head.borrow().next {\n        return access(node.clone(), index - 1);\n    }\n\n    return head;\n}\n
    linked_list.c
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
    linked_list.kt
    /* \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
    linked_list.rb
    ### \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9 ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
    linked_list.zig
    // \u8bbf\u95ee\u94fe\u8868\u4e2d\u7d22\u5f15\u4e3a index \u7684\u8282\u70b9\nfn access(node: ?*inc.ListNode(i32), index: i32) ?*inc.ListNode(i32) {\n    var head = node;\n    var i: i32 = 0;\n    while (i < index) : (i += 1) {\n        head = head.?.next;\n        if (head == null) return null;\n    }\n    return head;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

    \u904d\u5386\u94fe\u8868\uff0c\u67e5\u627e\u5176\u4e2d\u503c\u4e3a target \u7684\u8282\u70b9\uff0c\u8f93\u51fa\u8be5\u8282\u70b9\u5728\u94fe\u8868\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u8fc7\u7a0b\u4e5f\u5c5e\u4e8e\u7ebf\u6027\u67e5\u627e\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
    linked_list.cpp
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.java
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.cs
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.go
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
    linked_list.swift
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
    linked_list.js
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
    linked_list.ts
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
    linked_list.dart
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
    linked_list.rs
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T, index: i32) -> i32 {\n    if head.borrow().val == target {\n        return index;\n    };\n    if let Some(node) = &head.borrow_mut().next {\n        return find(node.clone(), target, index + 1);\n    }\n    return -1;\n}\n
    linked_list.c
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.kt
    /* \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
    linked_list.rb
    ### \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9 ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
    linked_list.zig
    // \u5728\u94fe\u8868\u4e2d\u67e5\u627e\u503c\u4e3a target \u7684\u9996\u4e2a\u8282\u70b9\nfn find(node: ?*inc.ListNode(i32), target: i32) i32 {\n    var head = node;\n    var index: i32 = 0;\n    while (head != null) {\n        if (head.?.val == target) return index;\n        head = head.?.next;\n        index += 1;\n    }\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u6570\u7ec4 vs. \u94fe\u8868","text":"

    \u8868 4-1 \u603b\u7ed3\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u7684\u5404\u9879\u7279\u70b9\u5e76\u5bf9\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u4e8e\u5b83\u4eec\u91c7\u7528\u4e24\u79cd\u76f8\u53cd\u7684\u5b58\u50a8\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u79cd\u6027\u8d28\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73b0\u5bf9\u7acb\u7684\u7279\u70b9\u3002

    \u8868 4-1 \u00a0 \u6570\u7ec4\u4e0e\u94fe\u8868\u7684\u6548\u7387\u5bf9\u6bd4

    \u6570\u7ec4 \u94fe\u8868 \u5b58\u50a8\u65b9\u5f0f \u8fde\u7eed\u5185\u5b58\u7a7a\u95f4 \u5206\u6563\u5185\u5b58\u7a7a\u95f4 \u5bb9\u91cf\u6269\u5c55 \u957f\u5ea6\u4e0d\u53ef\u53d8 \u53ef\u7075\u6d3b\u6269\u5c55 \u5185\u5b58\u6548\u7387 \u5143\u7d20\u5360\u7528\u5185\u5b58\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8d39\u7a7a\u95f4 \u5143\u7d20\u5360\u7528\u5185\u5b58\u591a \u8bbf\u95ee\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u89c1\u94fe\u8868\u7c7b\u578b","text":"

    \u5982\u56fe 4-8 \u6240\u793a\uff0c\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u4e09\u79cd\u3002

    • \u5355\u5411\u94fe\u8868\uff1a\u5373\u524d\u9762\u4ecb\u7ecd\u7684\u666e\u901a\u94fe\u8868\u3002\u5355\u5411\u94fe\u8868\u7684\u8282\u70b9\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\u4e24\u9879\u6570\u636e\u3002\u6211\u4eec\u5c06\u9996\u4e2a\u8282\u70b9\u79f0\u4e3a\u5934\u8282\u70b9\uff0c\u5c06\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u79f0\u4e3a\u5c3e\u8282\u70b9\uff0c\u5c3e\u8282\u70b9\u6307\u5411\u7a7a None \u3002
    • \u73af\u5f62\u94fe\u8868\uff1a\u5982\u679c\u6211\u4eec\u4ee4\u5355\u5411\u94fe\u8868\u7684\u5c3e\u8282\u70b9\u6307\u5411\u5934\u8282\u70b9\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5219\u5f97\u5230\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\u3002\u5728\u73af\u5f62\u94fe\u8868\u4e2d\uff0c\u4efb\u610f\u8282\u70b9\u90fd\u53ef\u4ee5\u89c6\u4f5c\u5934\u8282\u70b9\u3002
    • \u53cc\u5411\u94fe\u8868\uff1a\u4e0e\u5355\u5411\u94fe\u8868\u76f8\u6bd4\uff0c\u53cc\u5411\u94fe\u8868\u8bb0\u5f55\u4e86\u4e24\u4e2a\u65b9\u5411\u7684\u5f15\u7528\u3002\u53cc\u5411\u94fe\u8868\u7684\u8282\u70b9\u5b9a\u4e49\u540c\u65f6\u5305\u542b\u6307\u5411\u540e\u7ee7\u8282\u70b9\uff08\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\u548c\u524d\u9a71\u8282\u70b9\uff08\u4e0a\u4e00\u4e2a\u8282\u70b9\uff09\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u76f8\u8f83\u4e8e\u5355\u5411\u94fe\u8868\uff0c\u53cc\u5411\u94fe\u8868\u66f4\u5177\u7075\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u4e24\u4e2a\u65b9\u5411\u904d\u5386\u94fe\u8868\uff0c\u4f46\u76f8\u5e94\u5730\u4e5f\u9700\u8981\u5360\u7528\u66f4\u591a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct ListNode {\n    int val;         // \u8282\u70b9\u503c\n    ListNode *next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    ListNode *prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u6784\u9020\u51fd\u6570\n};\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u6784\u9020\u51fd\u6570\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode(int x) {  // \u6784\u9020\u51fd\u6570\n    int val = x;    // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype DoublyListNode struct {\n    Val  int             // \u8282\u70b9\u503c\n    Next *DoublyListNode // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n// NewDoublyListNode \u521d\u59cb\u5316\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n    init(x: Int) { // \u6784\u9020\u51fd\u6570\n        val = x\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // \u8282\u70b9\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\nclass ListNode {\n    int val;        // \u8282\u70b9\u503c\n    ListNode next;  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u6784\u9020\u51fd\u6570\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\u578b */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u8282\u70b9\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct ListNode {\n    int val;               // \u8282\u70b9\u503c\n    struct ListNode *next; // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n} ListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b */\n// \u6784\u9020\u65b9\u6cd5\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u8282\u70b9\u503c\n    val next: ListNode? = null  // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n}\n
    # \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\nclass ListNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :next   # \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil, prev_node=nil)\n    @val = val\n    @next = next_node\n    @prev = prev_node\n  end\nend\n
    // \u53cc\u5411\u94fe\u8868\u8282\u70b9\u7c7b\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u8282\u70b9\u503c\n        next: ?*Self = null, // \u6307\u5411\u540e\u7ee7\u8282\u70b9\u7684\u6307\u9488\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a71\u8282\u70b9\u7684\u6307\u9488\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n

    \u56fe 4-8 \u00a0 \u5e38\u89c1\u94fe\u8868\u79cd\u7c7b

    "},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u94fe\u8868\u5178\u578b\u5e94\u7528","text":"

    \u5355\u5411\u94fe\u8868\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u548c\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u3002

    • \u6808\u4e0e\u961f\u5217\uff1a\u5f53\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u90fd\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\u65f6\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u540e\u51fa\uff0c\u5bf9\u5e94\u6808\uff1b\u5f53\u63d2\u5165\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u4e00\u7aef\u8fdb\u884c\uff0c\u5220\u9664\u64cd\u4f5c\u5728\u94fe\u8868\u7684\u53e6\u4e00\u7aef\u8fdb\u884c\uff0c\u5b83\u8868\u73b0\u7684\u7279\u6027\u4e3a\u5148\u8fdb\u5148\u51fa\uff0c\u5bf9\u5e94\u961f\u5217\u3002
    • \u54c8\u5e0c\u8868\uff1a\u94fe\u5f0f\u5730\u5740\u662f\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8be5\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u51b2\u7a81\u7684\u5143\u7d20\u90fd\u4f1a\u88ab\u653e\u5230\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002
    • \u56fe\uff1a\u90bb\u63a5\u8868\u662f\u8868\u793a\u56fe\u7684\u4e00\u79cd\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u90fd\u4e0e\u4e00\u4e2a\u94fe\u8868\u76f8\u5173\u8054\uff0c\u94fe\u8868\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u4ee3\u8868\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u5176\u4ed6\u9876\u70b9\u3002

    \u53cc\u5411\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5feb\u901f\u67e5\u627e\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u5143\u7d20\u7684\u573a\u666f\u3002

    • \u9ad8\u7ea7\u6570\u636e\u7ed3\u6784\uff1a\u6bd4\u5982\u5728\u7ea2\u9ed1\u6811\u3001B \u6811\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u8bbf\u95ee\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5728\u8282\u70b9\u4e2d\u4fdd\u5b58\u4e00\u4e2a\u6307\u5411\u7236\u8282\u70b9\u7684\u5f15\u7528\u6765\u5b9e\u73b0\uff0c\u7c7b\u4f3c\u4e8e\u53cc\u5411\u94fe\u8868\u3002
    • \u6d4f\u89c8\u5668\u5386\u53f2\uff1a\u5728\u7f51\u9875\u6d4f\u89c8\u5668\u4e2d\uff0c\u5f53\u7528\u6237\u70b9\u51fb\u524d\u8fdb\u6216\u540e\u9000\u6309\u94ae\u65f6\uff0c\u6d4f\u89c8\u5668\u9700\u8981\u77e5\u9053\u7528\u6237\u8bbf\u95ee\u8fc7\u7684\u524d\u4e00\u4e2a\u548c\u540e\u4e00\u4e2a\u7f51\u9875\u3002\u53cc\u5411\u94fe\u8868\u7684\u7279\u6027\u4f7f\u5f97\u8fd9\u79cd\u64cd\u4f5c\u53d8\u5f97\u7b80\u5355\u3002
    • LRU \u7b97\u6cd5\uff1a\u5728\u7f13\u5b58\u6dd8\u6c70\uff08LRU\uff09\u7b97\u6cd5\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u3002\u8fd9\u65f6\u5019\u4f7f\u7528\u53cc\u5411\u94fe\u8868\u5c31\u975e\u5e38\u5408\u9002\u3002

    \u73af\u5f62\u94fe\u8868\u5e38\u7528\u4e8e\u9700\u8981\u5468\u671f\u6027\u64cd\u4f5c\u7684\u573a\u666f\uff0c\u6bd4\u5982\u64cd\u4f5c\u7cfb\u7edf\u7684\u8d44\u6e90\u8c03\u5ea6\u3002

    • \u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\uff1a\u5728\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\u65f6\u95f4\u7247\u8f6e\u8f6c\u8c03\u5ea6\u7b97\u6cd5\u662f\u4e00\u79cd\u5e38\u89c1\u7684 CPU \u8c03\u5ea6\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5bf9\u4e00\u7ec4\u8fdb\u7a0b\u8fdb\u884c\u5faa\u73af\u3002\u6bcf\u4e2a\u8fdb\u7a0b\u88ab\u8d4b\u4e88\u4e00\u4e2a\u65f6\u95f4\u7247\uff0c\u5f53\u65f6\u95f4\u7247\u7528\u5b8c\u65f6\uff0cCPU \u5c06\u5207\u6362\u5230\u4e0b\u4e00\u4e2a\u8fdb\u7a0b\u3002\u8fd9\u79cd\u5faa\u73af\u64cd\u4f5c\u53ef\u4ee5\u901a\u8fc7\u73af\u5f62\u94fe\u8868\u6765\u5b9e\u73b0\u3002
    • \u6570\u636e\u7f13\u51b2\u533a\uff1a\u5728\u67d0\u4e9b\u6570\u636e\u7f13\u51b2\u533a\u7684\u5b9e\u73b0\u4e2d\uff0c\u4e5f\u53ef\u80fd\u4f1a\u4f7f\u7528\u73af\u5f62\u94fe\u8868\u3002\u6bd4\u5982\u5728\u97f3\u9891\u3001\u89c6\u9891\u64ad\u653e\u5668\u4e2d\uff0c\u6570\u636e\u6d41\u53ef\u80fd\u4f1a\u88ab\u5206\u6210\u591a\u4e2a\u7f13\u51b2\u5757\u5e76\u653e\u5165\u4e00\u4e2a\u73af\u5f62\u94fe\u8868\uff0c\u4ee5\u4fbf\u5b9e\u73b0\u65e0\u7f1d\u64ad\u653e\u3002
    "},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u5217\u8868","text":"

    \u5217\u8868\uff08list\uff09\u662f\u4e00\u4e2a\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8bbf\u95ee\u3001\u4fee\u6539\u3001\u6dfb\u52a0\u3001\u5220\u9664\u548c\u904d\u5386\u7b49\u64cd\u4f5c\uff0c\u65e0\u987b\u4f7f\u7528\u8005\u8003\u8651\u5bb9\u91cf\u9650\u5236\u7684\u95ee\u9898\u3002\u5217\u8868\u53ef\u4ee5\u57fa\u4e8e\u94fe\u8868\u6216\u6570\u7ec4\u5b9e\u73b0\u3002

    • \u94fe\u8868\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u5217\u8868\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\u64cd\u4f5c\uff0c\u5e76\u4e14\u53ef\u4ee5\u7075\u6d3b\u52a8\u6001\u6269\u5bb9\u3002
    • \u6570\u7ec4\u4e5f\u652f\u6301\u5143\u7d20\u589e\u5220\u67e5\u6539\uff0c\u4f46\u7531\u4e8e\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u4e2a\u5177\u6709\u957f\u5ea6\u9650\u5236\u7684\u5217\u8868\u3002

    \u5f53\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u5217\u8868\u65f6\uff0c\u957f\u5ea6\u4e0d\u53ef\u53d8\u7684\u6027\u8d28\u4f1a\u5bfc\u81f4\u5217\u8868\u7684\u5b9e\u7528\u6027\u964d\u4f4e\u3002\u8fd9\u662f\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u65e0\u6cd5\u4e8b\u5148\u786e\u5b9a\u9700\u8981\u5b58\u50a8\u591a\u5c11\u6570\u636e\uff0c\u4ece\u800c\u96be\u4ee5\u9009\u62e9\u5408\u9002\u7684\u5217\u8868\u957f\u5ea6\u3002\u82e5\u957f\u5ea6\u8fc7\u5c0f\uff0c\u5219\u5f88\u53ef\u80fd\u65e0\u6cd5\u6ee1\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u957f\u5ea6\u8fc7\u5927\uff0c\u5219\u4f1a\u9020\u6210\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002

    \u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff08dynamic array\uff09\u6765\u5b9e\u73b0\u5217\u8868\u3002\u5b83\u7ee7\u627f\u4e86\u6570\u7ec4\u7684\u5404\u9879\u4f18\u70b9\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u52a8\u6001\u6269\u5bb9\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u6807\u51c6\u5e93\u63d0\u4f9b\u7684\u5217\u8868\u662f\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982 Python \u4e2d\u7684 list \u3001Java \u4e2d\u7684 ArrayList \u3001C++ \u4e2d\u7684 vector \u548c C# \u4e2d\u7684 List \u7b49\u3002\u5728\u63a5\u4e0b\u6765\u7684\u8ba8\u8bba\u4e2d\uff0c\u6211\u4eec\u5c06\u628a\u201c\u5217\u8868\u201d\u548c\u201c\u52a8\u6001\u6570\u7ec4\u201d\u89c6\u4e3a\u7b49\u540c\u7684\u6982\u5ff5\u3002

    "},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1 \u00a0 \u5217\u8868\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u5217\u8868","text":"

    \u6211\u4eec\u901a\u5e38\u4f7f\u7528\u201c\u65e0\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u8fd9\u4e24\u79cd\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1: list[int] = []\n# \u6709\u521d\u59cb\u503c\nnums: list[int] = [1, 3, 2, 5, 4]\n
    list.cpp
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u65e0\u521d\u59cb\u503c\nvector<int> nums1;\n// \u6709\u521d\u59cb\u503c\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
    list.java
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u6570\u7ec4\u7684\u5143\u7d20\u7c7b\u578b\u9700\u4e3a int[] \u7684\u5305\u88c5\u7c7b Integer[]\uff09\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
    list.cs
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
    list_test.go
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
    list.swift
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
    list.js
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
    list.ts
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nconst nums1: number[] = [];\n// \u6709\u521d\u59cb\u503c\nconst nums: number[] = [1, 3, 2, 5, 4];\n
    list.dart
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nList<int> nums1 = [];\n// \u6709\u521d\u59cb\u503c\nList<int> nums = [1, 3, 2, 5, 4];\n
    list.rs
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nlet nums1: Vec<i32> = Vec::new();\n// \u6709\u521d\u59cb\u503c\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u521d\u59cb\u5316\u5217\u8868 */\n// \u65e0\u521d\u59cb\u503c\nvar nums1 = listOf<Int>()\n// \u6709\u521d\u59cb\u503c\nvar numbers = arrayOf(1, 3, 2, 5, 4)\nvar nums = numbers.toMutableList()\n
    list.rb
    # \u521d\u59cb\u5316\u5217\u8868\n# \u65e0\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
    list.zig
    // \u521d\u59cb\u5316\u5217\u8868\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#2","title":"2. \u00a0 \u8bbf\u95ee\u5143\u7d20","text":"

    \u5217\u8868\u672c\u8d28\u4e0a\u662f\u6570\u7ec4\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8bbf\u95ee\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u8bbf\u95ee\u5143\u7d20\nnum: int = nums[1]  # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.cpp
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.java
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums.get(1);  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.cs
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list_test.go
    /* \u8bbf\u95ee\u5143\u7d20 */\nnum := nums[1]  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.swift
    /* \u8bbf\u95ee\u5143\u7d20 */\nlet num = nums[1] // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.js
    /* \u8bbf\u95ee\u5143\u7d20 */\nconst num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.ts
    /* \u8bbf\u95ee\u5143\u7d20 */\nconst num: number = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.dart
    /* \u8bbf\u95ee\u5143\u7d20 */\nint num = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.rs
    /* \u8bbf\u95ee\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u8bbf\u95ee\u5143\u7d20 */\nval num = nums[1]       // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.rb
    # \u8bbf\u95ee\u5143\u7d20\nnum = nums[1] # \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    list.zig
    // \u8bbf\u95ee\u5143\u7d20\nvar num = nums.items[1]; // \u8bbf\u95ee\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c06\u7d22\u5f15 1 \u5904\u7684\u5143\u7d20\u66f4\u65b0\u4e3a 0\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#3","title":"3. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u5143\u7d20","text":"

    \u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5730\u6dfb\u52a0\u4e0e\u5220\u9664\u5143\u7d20\u3002\u5728\u5217\u8868\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u4e0e\u6570\u7ec4\u76f8\u540c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6e05\u7a7a\u5217\u8868\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.pop(3)        # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.cpp
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.java
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.cs
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list_test.go
    /* \u6e05\u7a7a\u5217\u8868 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.swift
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.js
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.ts
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.dart
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.rs
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);    // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u6e05\u7a7a\u5217\u8868 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n/* \u5220\u9664\u5143\u7d20 */\nnums.remove(3);  // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.rb
    # \u6e05\u7a7a\u5217\u8868\nnums.clear\n\n# \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n# \u5220\u9664\u5143\u7d20\nnums.delete_at(3) # \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    list.zig
    // \u6e05\u7a7a\u5217\u8868\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u5904\u63d2\u5165\u6570\u5b57 6\n\n// \u5220\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u5220\u9664\u7d22\u5f15 3 \u5904\u7684\u5143\u7d20\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u904d\u5386\u5217\u8868","text":"

    \u4e0e\u6570\u7ec4\u4e00\u6837\uff0c\u5217\u8868\u53ef\u4ee5\u6839\u636e\u7d22\u5f15\u904d\u5386\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u904d\u5386\u5404\u5143\u7d20\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\nfor num in nums:\n    count += num\n
    list.cpp
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
    list.java
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
    list.cs
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
    list_test.go
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
    list.swift
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
    list.js
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.ts
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.dart
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
    list.rs
    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
    list.rb
    # \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
    list.zig
    // \u901a\u8fc7\u7d22\u5f15\u904d\u5386\u5217\u8868\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u904d\u5386\u5217\u8868\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#5","title":"5. \u00a0 \u62fc\u63a5\u5217\u8868","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u65b0\u5217\u8868 nums1 \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u62fc\u63a5\u5230\u539f\u5217\u8868\u7684\u5c3e\u90e8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.cpp
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
    list.java
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.cs
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list_test.go
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.swift
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.js
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.ts
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.dart
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.rs
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u62fc\u63a5\u4e24\u4e2a\u5217\u8868 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    list.rb
    # \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
    list.zig
    // \u62fc\u63a5\u4e24\u4e2a\u5217\u8868\nvar nums1 = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums1.deinit();\ntry nums1.appendSlice(&[_]i32{ 6, 8, 7, 10, 9 });\ntry nums.insertSlice(nums.items.len, nums1.items); // \u5c06\u5217\u8868 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u540e\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#6","title":"6. \u00a0 \u6392\u5e8f\u5217\u8868","text":"

    \u5b8c\u6210\u5217\u8868\u6392\u5e8f\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u6570\u7ec4\u7c7b\u7b97\u6cd5\u9898\u4e2d\u7ecf\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u548c\u201c\u53cc\u6307\u9488\u201d\u7b97\u6cd5\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6392\u5e8f\u5217\u8868\nnums.sort()  # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.cpp
    /* \u6392\u5e8f\u5217\u8868 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.java
    /* \u6392\u5e8f\u5217\u8868 */\nCollections.sort(nums);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.cs
    /* \u6392\u5e8f\u5217\u8868 */\nnums.Sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list_test.go
    /* \u6392\u5e8f\u5217\u8868 */\nsort.Ints(nums)  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.swift
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.js
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.ts
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.dart
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.rs
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort(); // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u52a8\u6001\u6570\u7ec4\n
    list.kt
    /* \u6392\u5e8f\u5217\u8868 */\nnums.sort() // \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.rb
    # \u6392\u5e8f\u5217\u8868\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u540e\uff0c\u5217\u8868\u5143\u7d20\u4ece\u5c0f\u5230\u5927\u6392\u5217\n
    list.zig
    // \u6392\u5e8f\u5217\u8868\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u5217\u8868\u5b9e\u73b0","text":"

    \u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u4e86\u5217\u8868\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u4eec\u7684\u5b9e\u73b0\u6bd4\u8f83\u590d\u6742\uff0c\u5404\u4e2a\u53c2\u6570\u7684\u8bbe\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u6269\u5bb9\u500d\u6570\u7b49\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u6e90\u7801\u8fdb\u884c\u5b66\u4e60\u3002

    \u4e3a\u4e86\u52a0\u6df1\u5bf9\u5217\u8868\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u4eec\u5c1d\u8bd5\u5b9e\u73b0\u4e00\u4e2a\u7b80\u6613\u7248\u5217\u8868\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u4e2a\u91cd\u70b9\u8bbe\u8ba1\u3002

    • \u521d\u59cb\u5bb9\u91cf\uff1a\u9009\u53d6\u4e00\u4e2a\u5408\u7406\u7684\u6570\u7ec4\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u9009\u62e9 10 \u4f5c\u4e3a\u521d\u59cb\u5bb9\u91cf\u3002
    • \u6570\u91cf\u8bb0\u5f55\uff1a\u58f0\u660e\u4e00\u4e2a\u53d8\u91cf size \uff0c\u7528\u4e8e\u8bb0\u5f55\u5217\u8868\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff0c\u5e76\u968f\u7740\u5143\u7d20\u63d2\u5165\u548c\u5220\u9664\u5b9e\u65f6\u66f4\u65b0\u3002\u6839\u636e\u6b64\u53d8\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9a\u4f4d\u5217\u8868\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65ad\u662f\u5426\u9700\u8981\u6269\u5bb9\u3002
    • \u6269\u5bb9\u673a\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u65f6\u5217\u8868\u5bb9\u91cf\u5df2\u6ee1\uff0c\u5219\u9700\u8981\u8fdb\u884c\u6269\u5bb9\u3002\u5148\u6839\u636e\u6269\u5bb9\u500d\u6570\u521b\u5efa\u4e00\u4e2a\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u518d\u5c06\u5f53\u524d\u6570\u7ec4\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52a8\u81f3\u65b0\u6570\u7ec4\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u89c4\u5b9a\u6bcf\u6b21\u5c06\u6570\u7ec4\u6269\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
    class MyList:\n    \"\"\"\u5217\u8868\u7c7b\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._capacity: int = 10  # \u5217\u8868\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        self._size: int = 0  # \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u5217\u8868\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8bbf\u95ee\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u66f4\u65b0\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u5220\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u5217\u8868\u6269\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868\"\"\"\n        return self._arr[: self._size]\n
    my_list.cpp
    /* \u5217\u8868\u7c7b */\nclass MyList {\n  private:\n    int *arr;             // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u5217\u8868\u5bb9\u91cf\n    int arrSize = 0;      // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Vector \u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
    my_list.java
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    private int size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] toArray() {\n        int size = size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.cs
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private int[] arr;           // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u5217\u8868\u5bb9\u91cf\n    private int arrSize = 0;         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        return arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u7d22\u5f15\u8d8a\u754c\");\n        int num = arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a arrCapacity * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.go
    /* \u5217\u8868\u7c7b */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u5217\u8868\u5bb9\u91cf\n        arr:         make([]int, 10), // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrSize:     0,               // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n    }\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    return l.arr[index]\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    l.arr[index] = num\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize++\n}\n\n/* \u5220\u9664\u5143\u7d20 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u7d22\u5f15\u8d8a\u754c\")\n    }\n    num := l.arr[index]\n    // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u957f\u5ea6\u7684\u5217\u8868 */\nfunc (l *myList) toArray() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
    my_list.swift
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: [Int] // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var _capacity: Int // \u5217\u8868\u5bb9\u91cf\n    private var _size: Int // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5219\u629b\u51fa\u9519\u8bef\uff0c\u4e0b\u540c\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size += 1\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u7d22\u5f15\u8d8a\u754c\")\n        }\n        let num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
    my_list.js
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    #arr = new Array(); // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    #capacity = 10; // \u5217\u8868\u5bb9\u91cf\n    #size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.#arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.#arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.#arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    toArray() {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.ts
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private arr: Array<number>; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u5217\u8868\u5bb9\u91cf\n    private _size: number = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        return this.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        this.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u957f\u5ea6\u7b49\u4e8e\u5bb9\u91cf\uff0c\u5219\u9700\u8981\u6269\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c06\u65b0\u5143\u7d20\u6dfb\u52a0\u5230\u5217\u8868\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u7d22\u5f15\u8d8a\u754c');\n        let num = this.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.dart
    /* \u5217\u8868\u7c7b */\nclass MyList {\n  late List<int> _arr; // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n  int _capacity = 10; // \u5217\u8868\u5bb9\u91cf\n  int _size = 0; // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8bbf\u95ee\u5143\u7d20 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    return _arr[index];\n  }\n\n  /* \u66f4\u65b0\u5143\u7d20 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    _arr[index] = _num;\n  }\n\n  /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size++;\n  }\n\n  /* \u5220\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u5217\u8868\u6269\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 _extendRatio \u500d\u7684\u65b0\u6570\u7ec4\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
    my_list.rs
    /* \u5217\u8868\u7c7b */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    capacity: usize,     // \u5217\u8868\u5bb9\u91cf\n    size: usize,         // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = Vec::new();\n        vec.resize(capacity, 0);\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u7d22\u5f15\u8d8a\u754c\")\n        };\n        let num = self.arr[index];\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
    my_list.c
    /* \u5217\u8868\u7c7b */\ntypedef struct {\n    int *arr;        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    int capacity;    // \u5217\u8868\u5bb9\u91cf\n    int size;        // \u5217\u8868\u5927\u5c0f\n    int extendRatio; // \u5217\u8868\u6bcf\u6b21\u6269\u5bb9\u7684\u500d\u6570\n} MyList;\n\n/* \u6784\u9020\u51fd\u6570 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u83b7\u53d6\u5217\u8868\u957f\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u66f4\u65b0\u5143\u7d20 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u6269\u5bb9\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u5220\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u5360\u7528\u4e86 remove \u5173\u952e\u8bcd\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u5217\u8868\u6269\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u95f4\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u62f7\u8d1d\u65e7\u6570\u636e\u5230\u65b0\u6570\u636e\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91ca\u653e\u65e7\u6570\u636e\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u6570\u636e\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a Array \u7528\u4e8e\u6253\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
    my_list.kt
    /* \u5217\u8868\u7c7b */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u5217\u8868\u5bb9\u91cf\n    private var size: Int = 0 // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u83b7\u53d6\u5217\u8868\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8bbf\u95ee\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        return arr[index]\n    }\n\n    /* \u66f4\u65b0\u5143\u7d20 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        arr[index] = num\n    }\n\n    /* \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size++\n    }\n\n    /* \u5220\u9664\u5143\u7d20 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u7d22\u5f15\u8d8a\u754c\")\n        val num = arr[index]\n        // \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u5217\u8868\u6269\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extendRatio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
    my_list.rb
    ### \u5217\u8868\u7c7b ###\nclass MyList\n  attr_reader :size       # \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n  attr_reader :capacity   # \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8bbf\u95ee\u5143\u7d20 ###\n  def set(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  ### \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20 ###\n  def insert(index, num)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n\n    # \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n    extend_capacity if size == capacity\n\n    # \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size += 1\n  end\n\n  ### \u5220\u9664\u5143\u7d20 ###\n  def remove(index)\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u5c06\u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u5217\u8868\u6269\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a\u539f\u6570\u7ec4 extend_ratio \u500d\u7684\u65b0\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4 ###\n  def to_array\n    sz = size\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
    my_list.zig
    // \u5217\u8868\u7c7b\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u6570\u7ec4\uff08\u5b58\u50a8\u5217\u8868\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u5217\u8868\u5bb9\u91cf\n        numSize: usize = 0,                           // \u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u5217\u8868\u6269\u5bb9\u7684\u500d\u6570\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u5217\u8868\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u957f\u5ea6\uff08\u5f53\u524d\u5143\u7d20\u6570\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u83b7\u53d6\u5217\u8868\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8bbf\u95ee\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            return self.arr[index];\n        }  \n\n        // \u66f4\u65b0\u5143\u7d20\n        pub fn set(self: *Self, index: usize, num: T) void {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5219\u629b\u51fa\u5f02\u5e38\uff0c\u4e0b\u540c\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            self.arr[index] = num;\n        }  \n\n        // \u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u95f4\u63d2\u5165\u5143\u7d20\n        pub fn insert(self: *Self, index: usize, num: T) !void {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            // \u5143\u7d20\u6570\u91cf\u8d85\u51fa\u5bb9\u91cf\u65f6\uff0c\u89e6\u53d1\u6269\u5bb9\u673a\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c06\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n            var j = self.size() - 1;\n            while (j >= index) : (j -= 1) {\n                self.arr[j + 1] = self.arr[j];\n            }\n            self.arr[index] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize += 1;\n        }\n\n        // \u5220\u9664\u5143\u7d20\n        pub fn remove(self: *Self, index: usize) T {\n            if (index < 0 or index >= self.size()) @panic(\"\u7d22\u5f15\u8d8a\u754c\");\n            var num = self.arr[index];\n            // \u5c06\u7d22\u5f15 index \u4e4b\u540e\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52a8\u4e00\u4f4d\n            var j = index;\n            while (j < self.size() - 1) : (j += 1) {\n                self.arr[j] = self.arr[j + 1];\n            }\n            // \u66f4\u65b0\u5143\u7d20\u6570\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u5220\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u5217\u8868\u6269\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a size * extendRatio \u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u539f\u6570\u7ec4\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c06\u539f\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\u590d\u5236\u5230\u65b0\u6570\u7ec4\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u5217\u8868\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c06\u5217\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var arr = try self.mem_allocator.alloc(T, self.size());\n           @memset(arr, @as(T, 0));\n            for (arr, 0..) |*num, i| {\n                num.* = self.get(i);\n            }\n            return arr;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u5185\u5b58\u4e0e\u7f13\u5b58 *","text":"

    \u5728\u672c\u7ae0\u7684\u524d\u4e24\u8282\u4e2d\uff0c\u6211\u4eec\u63a2\u8ba8\u4e86\u6570\u7ec4\u548c\u94fe\u8868\u8fd9\u4e24\u79cd\u57fa\u7840\u4e14\u91cd\u8981\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b83\u4eec\u5206\u522b\u4ee3\u8868\u4e86\u201c\u8fde\u7eed\u5b58\u50a8\u201d\u548c\u201c\u5206\u6563\u5b58\u50a8\u201d\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u3002

    \u5b9e\u9645\u4e0a\uff0c\u7269\u7406\u7ed3\u6784\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u51b3\u5b9a\u4e86\u7a0b\u5e8f\u5bf9\u5185\u5b58\u548c\u7f13\u5b58\u7684\u4f7f\u7528\u6548\u7387\uff0c\u8fdb\u800c\u5f71\u54cd\u7b97\u6cd5\u7a0b\u5e8f\u7684\u6574\u4f53\u6027\u80fd\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u8bbe\u5907","text":"

    \u8ba1\u7b97\u673a\u4e2d\u5305\u62ec\u4e09\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u8bbe\u5907\uff1a\u786c\u76d8\uff08hard disk\uff09\u3001\u5185\u5b58\uff08random-access memory, RAM\uff09\u3001\u7f13\u5b58\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u4eec\u5728\u8ba1\u7b97\u673a\u7cfb\u7edf\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6027\u80fd\u7279\u70b9\u3002

    \u8868 4-2 \u00a0 \u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u8bbe\u5907

    \u786c\u76d8 \u5185\u5b58 \u7f13\u5b58 \u7528\u9014 \u957f\u671f\u5b58\u50a8\u6570\u636e\uff0c\u5305\u62ec\u64cd\u4f5c\u7cfb\u7edf\u3001\u7a0b\u5e8f\u3001\u6587\u4ef6\u7b49 \u4e34\u65f6\u5b58\u50a8\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u548c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e \u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u51cf\u5c11 CPU \u8bbf\u95ee\u5185\u5b58\u7684\u6b21\u6570 \u6613\u5931\u6027 \u65ad\u7535\u540e\u6570\u636e\u4e0d\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u65ad\u7535\u540e\u6570\u636e\u4f1a\u4e22\u5931 \u5bb9\u91cf \u8f83\u5927\uff0cTB \u7ea7\u522b \u8f83\u5c0f\uff0cGB \u7ea7\u522b \u975e\u5e38\u5c0f\uff0cMB \u7ea7\u522b \u901f\u5ea6 \u8f83\u6162\uff0c\u51e0\u767e\u5230\u51e0\u5343 MB/s \u8f83\u5feb\uff0c\u51e0\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u51e0\u5341\u5230\u51e0\u767e GB/s \u4ef7\u683c \u8f83\u4fbf\u5b9c\uff0c\u51e0\u6bdb\u5230\u51e0\u5143 / GB \u8f83\u8d35\uff0c\u51e0\u5341\u5230\u51e0\u767e\u5143 / GB \u975e\u5e38\u8d35\uff0c\u968f CPU \u6253\u5305\u8ba1\u4ef7

    \u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf\u60f3\u8c61\u4e3a\u56fe 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7ed3\u6784\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9876\u7aef\u7684\u5b58\u50a8\u8bbe\u5907\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u8fd9\u79cd\u591a\u5c42\u7ea7\u7684\u8bbe\u8ba1\u5e76\u975e\u5076\u7136\uff0c\u800c\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u5bb6\u548c\u5de5\u7a0b\u5e08\u4eec\u7ecf\u8fc7\u6df1\u601d\u719f\u8651\u7684\u7ed3\u679c\u3002

    • \u786c\u76d8\u96be\u4ee5\u88ab\u5185\u5b58\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u5185\u5b58\u4e2d\u7684\u6570\u636e\u5728\u65ad\u7535\u540e\u4f1a\u4e22\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9002\u5408\u957f\u671f\u5b58\u50a8\u6570\u636e\uff1b\u5176\u6b21\uff0c\u5185\u5b58\u7684\u6210\u672c\u662f\u786c\u76d8\u7684\u51e0\u5341\u500d\uff0c\u8fd9\u4f7f\u5f97\u5b83\u96be\u4ee5\u5728\u6d88\u8d39\u8005\u5e02\u573a\u666e\u53ca\u3002
    • \u7f13\u5b58\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96be\u4ee5\u517c\u5f97\u3002\u968f\u7740 L1\u3001L2\u3001L3 \u7f13\u5b58\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u4f1a\u53d8\u5927\uff0c\u4e0e CPU \u6838\u5fc3\u4e4b\u95f4\u7684\u7269\u7406\u8ddd\u79bb\u4f1a\u53d8\u8fdc\uff0c\u4ece\u800c\u5bfc\u81f4\u6570\u636e\u4f20\u8f93\u65f6\u95f4\u589e\u52a0\uff0c\u5143\u7d20\u8bbf\u95ee\u5ef6\u8fdf\u53d8\u9ad8\u3002\u5728\u5f53\u524d\u6280\u672f\u4e0b\uff0c\u591a\u5c42\u7ea7\u7684\u7f13\u5b58\u7ed3\u6784\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u95f4\u7684\u6700\u4f73\u5e73\u8861\u70b9\u3002

    \u56fe 4-9 \u00a0 \u8ba1\u7b97\u673a\u5b58\u50a8\u7cfb\u7edf

    Tip

    \u8ba1\u7b97\u673a\u7684\u5b58\u50a8\u5c42\u6b21\u7ed3\u6784\u4f53\u73b0\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u95f4\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5b9e\u9645\u4e0a\uff0c\u8fd9\u79cd\u6743\u8861\u666e\u904d\u5b58\u5728\u4e8e\u6240\u6709\u5de5\u4e1a\u9886\u57df\uff0c\u5b83\u8981\u6c42\u6211\u4eec\u5728\u4e0d\u540c\u7684\u4f18\u52bf\u548c\u9650\u5236\u4e4b\u95f4\u627e\u5230\u6700\u4f73\u5e73\u8861\u70b9\u3002

    \u603b\u7684\u6765\u8bf4\uff0c\u786c\u76d8\u7528\u4e8e\u957f\u671f\u5b58\u50a8\u5927\u91cf\u6570\u636e\uff0c\u5185\u5b58\u7528\u4e8e\u4e34\u65f6\u5b58\u50a8\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\uff0c\u800c\u7f13\u5b58\u5219\u7528\u4e8e\u5b58\u50a8\u7ecf\u5e38\u8bbf\u95ee\u7684\u6570\u636e\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5e8f\u8fd0\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u534f\u4f5c\uff0c\u786e\u4fdd\u8ba1\u7b97\u673a\u7cfb\u7edf\u9ad8\u6548\u8fd0\u884c\u3002

    \u5982\u56fe 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4f1a\u4ece\u786c\u76d8\u4e2d\u88ab\u8bfb\u53d6\u5230\u5185\u5b58\u4e2d\uff0c\u4f9b CPU \u8ba1\u7b97\u4f7f\u7528\u3002\u7f13\u5b58\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u901a\u8fc7\u667a\u80fd\u5730\u4ece\u5185\u5b58\u52a0\u8f7d\u6570\u636e\uff0c\u7ed9 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u6570\u636e\u8bfb\u53d6\uff0c\u4ece\u800c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\uff0c\u51cf\u5c11\u5bf9\u8f83\u6162\u7684\u5185\u5b58\u7684\u4f9d\u8d56\u3002

    \u56fe 4-10 \u00a0 \u786c\u76d8\u3001\u5185\u5b58\u548c\u7f13\u5b58\u4e4b\u95f4\u7684\u6570\u636e\u6d41\u901a

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u5185\u5b58\u6548\u7387","text":"

    \u5728\u5185\u5b58\u7a7a\u95f4\u5229\u7528\u65b9\u9762\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5404\u81ea\u5177\u6709\u4f18\u52bf\u548c\u5c40\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u5185\u5b58\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u5757\u5185\u5b58\u4e0d\u80fd\u88ab\u591a\u4e2a\u7a0b\u5e8f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u4eec\u5e0c\u671b\u6570\u636e\u7ed3\u6784\u80fd\u591f\u5c3d\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u95f4\u3002\u6570\u7ec4\u7684\u5143\u7d20\u7d27\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u989d\u5916\u7684\u7a7a\u95f4\u6765\u5b58\u50a8\u94fe\u8868\u8282\u70b9\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u56e0\u6b64\u7a7a\u95f4\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u6570\u7ec4\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u591f\u7684\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u8fd9\u53ef\u80fd\u5bfc\u81f4\u5185\u5b58\u6d6a\u8d39\uff0c\u6570\u7ec4\u6269\u5bb9\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u94fe\u8868\u4ee5\u201c\u8282\u70b9\u201d\u4e3a\u5355\u4f4d\u8fdb\u884c\u52a8\u6001\u5185\u5b58\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u7075\u6d3b\u6027\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u968f\u7740\u53cd\u590d\u7533\u8bf7\u4e0e\u91ca\u653e\u5185\u5b58\uff0c\u7a7a\u95f2\u5185\u5b58\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u4f1a\u8d8a\u6765\u8d8a\u9ad8\uff0c\u4ece\u800c\u5bfc\u81f4\u5185\u5b58\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u6570\u7ec4\u7531\u4e8e\u5176\u8fde\u7eed\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u76f8\u5bf9\u4e0d\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u94fe\u8868\u7684\u5143\u7d20\u662f\u5206\u6563\u5b58\u50a8\u7684\uff0c\u5728\u9891\u7e41\u7684\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5bfc\u81f4\u5185\u5b58\u788e\u7247\u5316\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u7f13\u5b58\u6548\u7387","text":"

    \u7f13\u5b58\u867d\u7136\u5728\u7a7a\u95f4\u5bb9\u91cf\u4e0a\u8fdc\u5c0f\u4e8e\u5185\u5b58\uff0c\u4f46\u5b83\u6bd4\u5185\u5b58\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5e8f\u6267\u884c\u901f\u5ea6\u4e0a\u8d77\u7740\u81f3\u5173\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u4e8e\u7f13\u5b58\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5b58\u50a8\u4e00\u5c0f\u90e8\u5206\u9891\u7e41\u8bbf\u95ee\u7684\u6570\u636e\uff0c\u56e0\u6b64\u5f53 CPU \u5c1d\u8bd5\u8bbf\u95ee\u7684\u6570\u636e\u4e0d\u5728\u7f13\u5b58\u4e2d\u65f6\uff0c\u5c31\u4f1a\u53d1\u751f\u7f13\u5b58\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u65f6 CPU \u4e0d\u5f97\u4e0d\u4ece\u901f\u5ea6\u8f83\u6162\u7684\u5185\u5b58\u4e2d\u52a0\u8f7d\u6240\u9700\u6570\u636e\u3002

    \u663e\u7136\uff0c\u201c\u7f13\u5b58\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8bfb\u5199\u6570\u636e\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5e8f\u6027\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u4eec\u5c06 CPU \u4ece\u7f13\u5b58\u4e2d\u6210\u529f\u83b7\u53d6\u6570\u636e\u7684\u6bd4\u4f8b\u79f0\u4e3a\u7f13\u5b58\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u8fd9\u4e2a\u6307\u6807\u901a\u5e38\u7528\u6765\u8861\u91cf\u7f13\u5b58\u6548\u7387\u3002

    \u4e3a\u4e86\u5c3d\u53ef\u80fd\u8fbe\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u7f13\u5b58\u4f1a\u91c7\u53d6\u4ee5\u4e0b\u6570\u636e\u52a0\u8f7d\u673a\u5236\u3002

    • \u7f13\u5b58\u884c\uff1a\u7f13\u5b58\u4e0d\u662f\u5355\u4e2a\u5b57\u8282\u5730\u5b58\u50a8\u4e0e\u52a0\u8f7d\u6570\u636e\uff0c\u800c\u662f\u4ee5\u7f13\u5b58\u884c\u4e3a\u5355\u4f4d\u3002\u76f8\u6bd4\u4e8e\u5355\u4e2a\u5b57\u8282\u7684\u4f20\u8f93\uff0c\u7f13\u5b58\u884c\u7684\u4f20\u8f93\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
    • \u9884\u53d6\u673a\u5236\uff1a\u5904\u7406\u5668\u4f1a\u5c1d\u8bd5\u9884\u6d4b\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\uff08\u4f8b\u5982\u987a\u5e8f\u8bbf\u95ee\u3001\u56fa\u5b9a\u6b65\u957f\u8df3\u8dc3\u8bbf\u95ee\u7b49\uff09\uff0c\u5e76\u6839\u636e\u7279\u5b9a\u6a21\u5f0f\u5c06\u6570\u636e\u52a0\u8f7d\u81f3\u7f13\u5b58\u4e4b\u4e2d\uff0c\u4ece\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
    • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u9644\u8fd1\u7684\u6570\u636e\u53ef\u80fd\u8fd1\u671f\u4e5f\u4f1a\u88ab\u8bbf\u95ee\u3002\u56e0\u6b64\uff0c\u7f13\u5b58\u5728\u52a0\u8f7d\u67d0\u4e00\u6570\u636e\u65f6\uff0c\u4e5f\u4f1a\u52a0\u8f7d\u5176\u9644\u8fd1\u7684\u6570\u636e\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
    • \u65f6\u95f4\u5c40\u90e8\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u6570\u636e\u88ab\u8bbf\u95ee\uff0c\u90a3\u4e48\u5b83\u5728\u4e0d\u4e45\u7684\u5c06\u6765\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8bbf\u95ee\u3002\u7f13\u5b58\u5229\u7528\u8fd9\u4e00\u539f\u7406\uff0c\u901a\u8fc7\u4fdd\u7559\u6700\u8fd1\u8bbf\u95ee\u8fc7\u7684\u6570\u636e\u6765\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

    \u5b9e\u9645\u4e0a\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u5bf9\u7f13\u5b58\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u3002

    • \u5360\u7528\u7a7a\u95f4\uff1a\u94fe\u8868\u5143\u7d20\u6bd4\u6570\u7ec4\u5143\u7d20\u5360\u7528\u7a7a\u95f4\u66f4\u591a\uff0c\u5bfc\u81f4\u7f13\u5b58\u4e2d\u5bb9\u7eb3\u7684\u6709\u6548\u6570\u636e\u91cf\u66f4\u5c11\u3002
    • \u7f13\u5b58\u884c\uff1a\u94fe\u8868\u6570\u636e\u5206\u6563\u5728\u5185\u5b58\u5404\u5904\uff0c\u800c\u7f13\u5b58\u662f\u201c\u6309\u884c\u52a0\u8f7d\u201d\u7684\uff0c\u56e0\u6b64\u52a0\u8f7d\u5230\u65e0\u6548\u6570\u636e\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
    • \u9884\u53d6\u673a\u5236\uff1a\u6570\u7ec4\u6bd4\u94fe\u8868\u7684\u6570\u636e\u8bbf\u95ee\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9884\u6d4b\u6027\u201d\uff0c\u5373\u7cfb\u7edf\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c06\u88ab\u52a0\u8f7d\u7684\u6570\u636e\u3002
    • \u7a7a\u95f4\u5c40\u90e8\u6027\uff1a\u6570\u7ec4\u88ab\u5b58\u50a8\u5728\u96c6\u4e2d\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u56e0\u6b64\u88ab\u52a0\u8f7d\u6570\u636e\u9644\u8fd1\u7684\u6570\u636e\u66f4\u6709\u53ef\u80fd\u5373\u5c06\u88ab\u8bbf\u95ee\u3002

    \u603b\u4f53\u800c\u8a00\uff0c\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u4f18\u4e8e\u94fe\u8868\u3002\u8fd9\u4f7f\u5f97\u5728\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u5f80\u5f80\u66f4\u53d7\u6b22\u8fce\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u7f13\u5b58\u6548\u7387\u5e76\u4e0d\u610f\u5473\u7740\u6570\u7ec4\u5728\u6240\u6709\u60c5\u51b5\u4e0b\u90fd\u4f18\u4e8e\u94fe\u8868\u3002\u5b9e\u9645\u5e94\u7528\u4e2d\u9009\u62e9\u54ea\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u6765\u51b3\u5b9a\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5b9e\u73b0\u201c\u6808\u201d\u6570\u636e\u7ed3\u6784\uff08\u4e0b\u4e00\u7ae0\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\uff09\uff0c\u4f46\u5b83\u4eec\u9002\u7528\u4e8e\u4e0d\u540c\u573a\u666f\u3002

    • \u5728\u505a\u7b97\u6cd5\u9898\u65f6\uff0c\u6211\u4eec\u4f1a\u503e\u5411\u4e8e\u9009\u62e9\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\uff0c\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u968f\u673a\u8bbf\u95ee\u7684\u80fd\u529b\uff0c\u4ee3\u4ef7\u4ec5\u662f\u9700\u8981\u9884\u5148\u4e3a\u6570\u7ec4\u5206\u914d\u4e00\u5b9a\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    • \u5982\u679c\u6570\u636e\u91cf\u975e\u5e38\u5927\u3001\u52a8\u6001\u6027\u5f88\u9ad8\u3001\u6808\u7684\u9884\u671f\u5927\u5c0f\u96be\u4ee5\u4f30\u8ba1\uff0c\u90a3\u4e48\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u66f4\u52a0\u5408\u9002\u3002\u94fe\u8868\u80fd\u591f\u5c06\u5927\u91cf\u6570\u636e\u5206\u6563\u5b58\u50a8\u4e8e\u5185\u5b58\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u5e76\u4e14\u907f\u514d\u4e86\u6570\u7ec4\u6269\u5bb9\u4ea7\u751f\u7684\u989d\u5916\u5f00\u9500\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u6570\u7ec4\u548c\u94fe\u8868\u662f\u4e24\u79cd\u57fa\u672c\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5206\u522b\u4ee3\u8868\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u4e24\u79cd\u5b58\u50a8\u65b9\u5f0f\uff1a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\u3002\u4e24\u8005\u7684\u7279\u70b9\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u6027\u3002
    • \u6570\u7ec4\u652f\u6301\u968f\u673a\u8bbf\u95ee\u3001\u5360\u7528\u5185\u5b58\u8f83\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u5220\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002
    • \u94fe\u8868\u901a\u8fc7\u66f4\u6539\u5f15\u7528\uff08\u6307\u9488\uff09\u5b9e\u73b0\u9ad8\u6548\u7684\u8282\u70b9\u63d2\u5165\u4e0e\u5220\u9664\uff0c\u4e14\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\uff1b\u4f46\u8282\u70b9\u8bbf\u95ee\u6548\u7387\u4f4e\u3001\u5360\u7528\u5185\u5b58\u8f83\u591a\u3002\u5e38\u89c1\u7684\u94fe\u8868\u7c7b\u578b\u5305\u62ec\u5355\u5411\u94fe\u8868\u3001\u73af\u5f62\u94fe\u8868\u3001\u53cc\u5411\u94fe\u8868\u3002
    • \u5217\u8868\u662f\u4e00\u79cd\u652f\u6301\u589e\u5220\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u4e8e\u52a8\u6001\u6570\u7ec4\u5b9e\u73b0\u3002\u5b83\u4fdd\u7559\u4e86\u6570\u7ec4\u7684\u4f18\u52bf\uff0c\u540c\u65f6\u53ef\u4ee5\u7075\u6d3b\u8c03\u6574\u957f\u5ea6\u3002
    • \u5217\u8868\u7684\u51fa\u73b0\u5927\u5e45\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u3002
    • \u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u6570\u7ec4\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u5185\u5b58\u7a7a\u95f4\u6548\u7387\uff0c\u800c\u94fe\u8868\u5219\u5728\u5185\u5b58\u4f7f\u7528\u4e0a\u66f4\u52a0\u7075\u6d3b\u3002
    • \u7f13\u5b58\u901a\u8fc7\u7f13\u5b58\u884c\u3001\u9884\u53d6\u673a\u5236\u4ee5\u53ca\u7a7a\u95f4\u5c40\u90e8\u6027\u548c\u65f6\u95f4\u5c40\u90e8\u6027\u7b49\u6570\u636e\u52a0\u8f7d\u673a\u5236\uff0c\u4e3a CPU \u63d0\u4f9b\u5feb\u901f\u6570\u636e\u8bbf\u95ee\uff0c\u663e\u8457\u63d0\u5347\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\u3002
    • \u7531\u4e8e\u6570\u7ec4\u5177\u6709\u66f4\u9ad8\u7684\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u94fe\u8868\u66f4\u9ad8\u6548\u3002\u5728\u9009\u62e9\u6570\u636e\u7ed3\u6784\u65f6\uff0c\u5e94\u6839\u636e\u5177\u4f53\u9700\u6c42\u548c\u573a\u666f\u505a\u51fa\u6070\u5f53\u9009\u62e9\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6570\u7ec4\u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5b58\u50a8\u5728\u5806\u4e0a\uff0c\u5bf9\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u5426\u6709\u5f71\u54cd\uff1f

    \u5b58\u50a8\u5728\u6808\u4e0a\u548c\u5806\u4e0a\u7684\u6570\u7ec4\u90fd\u88ab\u5b58\u50a8\u5728\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\u5185\uff0c\u6570\u636e\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u6808\u548c\u5806\u5177\u6709\u5404\u81ea\u7684\u7279\u70b9\uff0c\u4ece\u800c\u5bfc\u81f4\u4ee5\u4e0b\u4e0d\u540c\u70b9\u3002

    1. \u5206\u914d\u548c\u91ca\u653e\u6548\u7387\uff1a\u6808\u662f\u4e00\u5757\u8f83\u5c0f\u7684\u5185\u5b58\uff0c\u5206\u914d\u7531\u7f16\u8bd1\u5668\u81ea\u52a8\u5b8c\u6210\uff1b\u800c\u5806\u5185\u5b58\u76f8\u5bf9\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u4ee3\u7801\u4e2d\u52a8\u6001\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u4e0a\u7684\u5206\u914d\u548c\u91ca\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u6808\u4e0a\u7684\u6162\u3002
    2. \u5927\u5c0f\u9650\u5236\uff1a\u6808\u5185\u5b58\u76f8\u5bf9\u8f83\u5c0f\uff0c\u5806\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\u3002\u56e0\u6b64\u5806\u66f4\u52a0\u9002\u5408\u5b58\u50a8\u5927\u578b\u6570\u7ec4\u3002
    3. \u7075\u6d3b\u6027\uff1a\u6808\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u9700\u8981\u5728\u7f16\u8bd1\u65f6\u786e\u5b9a\uff0c\u800c\u5806\u4e0a\u7684\u6570\u7ec4\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u8fd0\u884c\u65f6\u52a8\u6001\u786e\u5b9a\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u6570\u7ec4\u8981\u6c42\u76f8\u540c\u7c7b\u578b\u7684\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u5374\u6ca1\u6709\u5f3a\u8c03\u76f8\u540c\u7c7b\u578b\u5462\uff1f

    \u94fe\u8868\u7531\u8282\u70b9\u7ec4\u6210\uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u5f15\u7528\uff08\u6307\u9488\uff09\u8fde\u63a5\uff0c\u5404\u4e2a\u8282\u70b9\u53ef\u4ee5\u5b58\u50a8\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

    \u76f8\u5bf9\u5730\uff0c\u6570\u7ec4\u5143\u7d20\u5219\u5fc5\u987b\u662f\u76f8\u540c\u7c7b\u578b\u7684\uff0c\u8fd9\u6837\u624d\u80fd\u901a\u8fc7\u8ba1\u7b97\u504f\u79fb\u91cf\u6765\u83b7\u53d6\u5bf9\u5e94\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u6570\u7ec4\u540c\u65f6\u5305\u542b int \u548c long \u4e24\u79cd\u7c7b\u578b\uff0c\u5355\u4e2a\u5143\u7d20\u5206\u522b\u5360\u7528 4 \u5b57\u8282 \u548c 8 \u5b57\u8282 \uff0c\u6b64\u65f6\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8ba1\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5305\u542b\u4e86\u4e24\u79cd\u201c\u5143\u7d20\u957f\u5ea6\u201d\u3002

    # \u5143\u7d20\u5185\u5b58\u5730\u5740 = \u6570\u7ec4\u5185\u5b58\u5730\u5740\uff08\u9996\u5143\u7d20\u5185\u5b58\u5730\u5740\uff09 + \u5143\u7d20\u957f\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

    Q\uff1a\u5220\u9664\u8282\u70b9 P \u540e\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8bbe\u4e3a None \u5462\uff1f

    \u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u4ece\u8be5\u94fe\u8868\u7684\u89d2\u5ea6\u770b\uff0c\u4ece\u5934\u8282\u70b9\u904d\u5386\u5230\u5c3e\u8282\u70b9\u5df2\u7ecf\u4e0d\u4f1a\u9047\u5230 P \u4e86\u3002\u8fd9\u610f\u5473\u7740\u8282\u70b9 P \u5df2\u7ecf\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u4e86\uff0c\u6b64\u65f6\u8282\u70b9 P \u6307\u5411\u54ea\u91cc\u90fd\u4e0d\u4f1a\u5bf9\u8be5\u94fe\u8868\u4ea7\u751f\u5f71\u54cd\u3002

    \u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff08\u505a\u9898\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65ad\u5f00\u6ca1\u6709\u5173\u7cfb\uff0c\u53ea\u8981\u4fdd\u8bc1\u7a0b\u5e8f\u7684\u903b\u8f91\u662f\u6b63\u786e\u7684\u5c31\u884c\u3002\u4ece\u6807\u51c6\u5e93\u7684\u89d2\u5ea6\u770b\uff0c\u65ad\u5f00\u66f4\u52a0\u5b89\u5168\u3001\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65ad\u5f00\uff0c\u5047\u8bbe\u88ab\u5220\u9664\u8282\u70b9\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u4e48\u5b83\u4f1a\u5f71\u54cd\u540e\u7ee7\u8282\u70b9\u7684\u5185\u5b58\u56de\u6536\u3002

    Q\uff1a\u5728\u94fe\u8868\u4e2d\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u5220\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u67e5\u627e\u5143\u7d20\uff0c\u90a3\u4e3a\u4ec0\u4e48\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

    \u5982\u679c\u662f\u5148\u67e5\u627e\u5143\u7d20\u3001\u518d\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u786e\u5b9e\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u94fe\u8868\u7684 \\(O(1)\\) \u589e\u5220\u7684\u4f18\u52bf\u53ef\u4ee5\u5728\u5176\u4ed6\u5e94\u7528\u4e0a\u5f97\u5230\u4f53\u73b0\u3002\u4f8b\u5982\uff0c\u53cc\u5411\u961f\u5217\u9002\u5408\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff0c\u6211\u4eec\u7ef4\u62a4\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u59cb\u7ec8\u6307\u5411\u5934\u8282\u70b9\u3001\u5c3e\u8282\u70b9\uff0c\u6bcf\u6b21\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

    Q\uff1a\u56fe\u201c\u94fe\u8868\u5b9a\u4e49\u4e0e\u5b58\u50a8\u65b9\u5f0f\u201d\u4e2d\uff0c\u6d45\u84dd\u8272\u7684\u5b58\u50a8\u8282\u70b9\u6307\u9488\u662f\u5360\u7528\u4e00\u5757\u5185\u5b58\u5730\u5740\u5417\uff1f\u8fd8\u662f\u548c\u8282\u70b9\u503c\u5404\u5360\u4e00\u534a\u5462\uff1f

    \u8be5\u793a\u610f\u56fe\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

    • \u4e0d\u540c\u7c7b\u578b\u7684\u8282\u70b9\u503c\u5360\u7528\u7684\u7a7a\u95f4\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u5b9e\u4f8b\u5bf9\u8c61\u7b49\u3002
    • \u6307\u9488\u53d8\u91cf\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u5927\u5c0f\u6839\u636e\u6240\u4f7f\u7528\u7684\u64cd\u4f5c\u7cfb\u7edf\u53ca\u7f16\u8bd1\u73af\u5883\u800c\u5b9a\uff0c\u5927\u591a\u4e3a 8 \u5b57\u8282\u6216 4 \u5b57\u8282\u3002

    Q\uff1a\u5728\u5217\u8868\u672b\u5c3e\u6dfb\u52a0\u5143\u7d20\u662f\u5426\u65f6\u65f6\u523b\u523b\u90fd\u4e3a \\(O(1)\\) \uff1f

    \u5982\u679c\u6dfb\u52a0\u5143\u7d20\u65f6\u8d85\u51fa\u5217\u8868\u957f\u5ea6\uff0c\u5219\u9700\u8981\u5148\u6269\u5bb9\u5217\u8868\u518d\u6dfb\u52a0\u3002\u7cfb\u7edf\u4f1a\u7533\u8bf7\u4e00\u5757\u65b0\u7684\u5185\u5b58\uff0c\u5e76\u5c06\u539f\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u642c\u8fd0\u8fc7\u53bb\uff0c\u8fd9\u65f6\u5019\u65f6\u95f4\u590d\u6742\u5ea6\u5c31\u4f1a\u662f \\(O(n)\\) \u3002

    Q\uff1a\u201c\u5217\u8868\u7684\u51fa\u73b0\u6781\u5927\u5730\u63d0\u9ad8\u4e86\u6570\u7ec4\u7684\u5b9e\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5bfc\u81f4\u90e8\u5206\u5185\u5b58\u7a7a\u95f4\u6d6a\u8d39\u201d\uff0c\u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u662f\u6307\u989d\u5916\u589e\u52a0\u7684\u53d8\u91cf\u5982\u5bb9\u91cf\u3001\u957f\u5ea6\u3001\u6269\u5bb9\u500d\u6570\u6240\u5360\u7684\u5185\u5b58\u5417\uff1f

    \u8fd9\u91cc\u7684\u7a7a\u95f4\u6d6a\u8d39\u4e3b\u8981\u6709\u4e24\u65b9\u9762\u542b\u4e49\uff1a\u4e00\u65b9\u9762\uff0c\u5217\u8868\u90fd\u4f1a\u8bbe\u5b9a\u4e00\u4e2a\u521d\u59cb\u957f\u5ea6\uff0c\u6211\u4eec\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u8fd9\u4e48\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u4e3a\u4e86\u9632\u6b62\u9891\u7e41\u6269\u5bb9\uff0c\u6269\u5bb9\u4e00\u822c\u4f1a\u4e58\u4ee5\u4e00\u4e2a\u7cfb\u6570\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u8fd9\u6837\u4e00\u6765\uff0c\u4e5f\u4f1a\u51fa\u73b0\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u4eec\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6ee1\u5b83\u4eec\u3002

    Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u540e\uff0c\u8fd9 3 \u4e2a\u5143\u7d20\u7684\u5730\u5740\u662f\u76f8\u8fde\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u4f1a\u53d1\u73b0\u5b83\u4eec\u6bcf\u4e2a\u5143\u7d20\u7684 id \u5e76\u4e0d\u662f\u8fde\u7eed\u7684\uff0c\u800c\u662f\u5206\u522b\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u8fd9\u4e9b\u5143\u7d20\u7684\u5730\u5740\u4e0d\u8fde\u7eed\uff0c\u90a3\u4e48 m \u8fd8\u662f\u6570\u7ec4\u5417\uff1f

    \u5047\u5982\u628a\u5217\u8868\u5143\u7d20\u6362\u6210\u94fe\u8868\u8282\u70b9 n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u8fd9 5 \u4e2a\u8282\u70b9\u5bf9\u8c61\u4e5f\u5206\u6563\u5b58\u50a8\u5728\u5185\u5b58\u5404\u5904\u3002\u7136\u800c\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u5217\u8868\u7d22\u5f15\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u8282\u70b9\u5185\u5b58\u5730\u5740\uff0c\u4ece\u800c\u8bbf\u95ee\u5230\u5bf9\u5e94\u7684\u8282\u70b9\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u4e2d\u5b58\u50a8\u7684\u662f\u8282\u70b9\u7684\u5f15\u7528\uff0c\u800c\u975e\u8282\u70b9\u672c\u8eab\u3002

    \u4e0e\u8bb8\u591a\u8bed\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6570\u5b57\u4e5f\u88ab\u5305\u88c5\u4e3a\u5bf9\u8c61\uff0c\u5217\u8868\u4e2d\u5b58\u50a8\u7684\u4e0d\u662f\u6570\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5bf9\u6570\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u4f1a\u53d1\u73b0\u4e24\u4e2a\u6570\u7ec4\u4e2d\u7684\u76f8\u540c\u6570\u5b57\u62e5\u6709\u540c\u4e00\u4e2a id \uff0c\u5e76\u4e14\u8fd9\u4e9b\u6570\u5b57\u7684\u5185\u5b58\u5730\u5740\u65e0\u987b\u8fde\u7eed\u3002

    Q\uff1aC++ STL \u91cc\u9762\u7684 std::list \u5df2\u7ecf\u5b9e\u73b0\u4e86\u53cc\u5411\u94fe\u8868\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u7b97\u6cd5\u4e66\u4e0a\u4e0d\u600e\u4e48\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u4e3a\u6709\u4ec0\u4e48\u5c40\u9650\u6027\u5462\uff1f

    \u4e00\u65b9\u9762\uff0c\u6211\u4eec\u5f80\u5f80\u66f4\u9752\u7750\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u65f6\u624d\u4f7f\u7528\u94fe\u8868\uff0c\u4e3b\u8981\u6709\u4e24\u4e2a\u539f\u56e0\u3002

    • \u7a7a\u95f4\u5f00\u9500\uff1a\u7531\u4e8e\u6bcf\u4e2a\u5143\u7d20\u9700\u8981\u4e24\u4e2a\u989d\u5916\u7684\u6307\u9488\uff08\u4e00\u4e2a\u7528\u4e8e\u524d\u4e00\u4e2a\u5143\u7d20\uff0c\u4e00\u4e2a\u7528\u4e8e\u540e\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u5360\u7528\u7a7a\u95f4\u3002
    • \u7f13\u5b58\u4e0d\u53cb\u597d\uff1a\u7531\u4e8e\u6570\u636e\u4e0d\u662f\u8fde\u7eed\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5bf9\u7f13\u5b58\u7684\u5229\u7528\u7387\u8f83\u4f4e\u3002\u4e00\u822c\u60c5\u51b5\u4e0b\uff0cstd::vector \u7684\u6027\u80fd\u4f1a\u66f4\u597d\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u94fe\u8868\u7684\u60c5\u51b5\u4e3b\u8981\u662f\u4e8c\u53c9\u6811\u548c\u56fe\u3002\u6808\u548c\u961f\u5217\u5f80\u5f80\u4f1a\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u94fe\u8868\u3002

    Q\uff1a\u521d\u59cb\u5316\u5217\u8868 res = [0] * self.size() \u64cd\u4f5c\uff0c\u4f1a\u5bfc\u81f4 res \u7684\u6bcf\u4e2a\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u5730\u5740\u5417\uff1f

    \u4e0d\u4f1a\u3002\u4f46\u4e8c\u7ef4\u6570\u7ec4\u4f1a\u6709\u8fd9\u4e2a\u95ee\u9898\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7ef4\u5217\u8868 res = [[0]] * self.size() \uff0c\u5219\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u4e2a\u5217\u8868 [0] \u3002

    "},{"location":"chapter_backtracking/","title":"\u7b2c 13 \u7ae0 \u00a0 \u56de\u6eaf","text":"

    Abstract

    \u6211\u4eec\u5982\u540c\u8ff7\u5bab\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u8fdb\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u4f1a\u9047\u5230\u56f0\u96be\u3002

    \u56de\u6eaf\u7684\u529b\u91cf\u8ba9\u6211\u4eec\u80fd\u591f\u91cd\u65b0\u5f00\u59cb\uff0c\u4e0d\u65ad\u5c1d\u8bd5\uff0c\u6700\u7ec8\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

    "},{"location":"chapter_backtracking/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5
    • 13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898
    • 13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898
    • 13.4 \u00a0 N \u7687\u540e\u95ee\u9898
    • 13.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_backtracking/backtracking_algorithm/","title":"13.1 \u00a0 \u56de\u6eaf\u7b97\u6cd5","text":"

    \u56de\u6eaf\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u79cd\u901a\u8fc7\u7a77\u4e3e\u6765\u89e3\u51b3\u95ee\u9898\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u4ece\u4e00\u4e2a\u521d\u59cb\u72b6\u6001\u51fa\u53d1\uff0c\u66b4\u529b\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u5f53\u9047\u5230\u6b63\u786e\u7684\u89e3\u5219\u5c06\u5176\u8bb0\u5f55\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5c1d\u8bd5\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u90fd\u65e0\u6cd5\u627e\u5230\u89e3\u4e3a\u6b62\u3002

    \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u6765\u904d\u5386\u89e3\u7a7a\u95f4\u3002\u5728\u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5229\u7528\u524d\u5e8f\u904d\u5386\u6784\u9020\u4e00\u4e2a\u56de\u6eaf\u95ee\u9898\uff0c\u9010\u6b65\u4e86\u89e3\u56de\u6eaf\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u4f8b\u9898\u4e00

    \u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\uff0c\u641c\u7d22\u5e76\u8bb0\u5f55\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u8282\u70b9\u5217\u8868\u3002

    \u5bf9\u4e8e\u6b64\u9898\uff0c\u6211\u4eec\u524d\u5e8f\u904d\u5386\u8fd9\u68f5\u6811\uff0c\u5e76\u5224\u65ad\u5f53\u524d\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \uff0c\u82e5\u662f\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u7684\u503c\u52a0\u5165\u7ed3\u679c\u5217\u8868 res \u4e4b\u4e2d\u3002\u76f8\u5173\u8fc7\u7a0b\u5b9e\u73b0\u5982\u56fe 13-1 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
    preorder_traversal_i_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
    preorder_traversal_i_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
    preorder_traversal_i_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, root)\n    }\n    preOrderI(root.Left, res)\n    preOrderI(root.Right, res)\n}\n
    preorder_traversal_i_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(root)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n
    preorder_traversal_i_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.dart
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(root);\n  }\n  preOrder(root.left, res);\n  preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.rs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<&Rc<RefCell<TreeNode>>>) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.as_ref());\n        pre_order(res, node.borrow().right.as_ref());\n    }\n}\n
    preorder_traversal_i_compact.c
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.kt
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
    preorder_traversal_i_compact.rb
    ### \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e00 ###\ndef pre_order(root)\n  return unless root\n\n  # \u8bb0\u5f55\u89e3\n  $res << root if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\nend\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 13-1 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u4e2d\u641c\u7d22\u8282\u70b9

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000","text":"

    \u4e4b\u6240\u4ee5\u79f0\u4e4b\u4e3a\u56de\u6eaf\u7b97\u6cd5\uff0c\u662f\u56e0\u4e3a\u8be5\u7b97\u6cd5\u5728\u641c\u7d22\u89e3\u7a7a\u95f4\u65f6\u4f1a\u91c7\u7528\u201c\u5c1d\u8bd5\u201d\u4e0e\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u5f53\u7b97\u6cd5\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u9047\u5230\u67d0\u4e2a\u72b6\u6001\u65e0\u6cd5\u7ee7\u7eed\u524d\u8fdb\u6216\u65e0\u6cd5\u5f97\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u65f6\uff0c\u5b83\u4f1a\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u5c1d\u8bd5\u5176\u4ed6\u53ef\u80fd\u7684\u9009\u62e9\u3002

    \u5bf9\u4e8e\u4f8b\u9898\u4e00\uff0c\u8bbf\u95ee\u6bcf\u4e2a\u8282\u70b9\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5c1d\u8bd5\u201d\uff0c\u800c\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u8fd4\u56de\u7236\u8282\u70b9\u7684 return \u5219\u8868\u793a\u201c\u56de\u9000\u201d\u3002

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u56de\u9000\u5e76\u4e0d\u4ec5\u4ec5\u5305\u62ec\u51fd\u6570\u8fd4\u56de\u3002\u4e3a\u89e3\u91ca\u8fd9\u4e00\u70b9\uff0c\u6211\u4eec\u5bf9\u4f8b\u9898\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

    \u4f8b\u9898\u4e8c

    \u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\u3002

    \u5728\u4f8b\u9898\u4e00\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u5217\u8868 path \u8bb0\u5f55\u8bbf\u95ee\u8fc7\u7684\u8282\u70b9\u8def\u5f84\u3002\u5f53\u8bbf\u95ee\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u590d\u5236 path \u5e76\u6dfb\u52a0\u8fdb\u7ed3\u679c\u5217\u8868 res \u3002\u904d\u5386\u5b8c\u6210\u540e\uff0cres \u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
    preorder_traversal_ii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
    preorder_traversal_ii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
    preorder_traversal_ii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_ii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderII(root.Left, res, path)\n    preOrderII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_ii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
    preorder_traversal_ii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_ii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_ii_compact.dart
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
    preorder_traversal_ii_compact.rs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<&Rc<RefCell<TreeNode>>>,\n) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_ii_compact.c
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; ++i) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
    preorder_traversal_ii_compact.kt
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
    preorder_traversal_ii_compact.rb
    ### \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e8c ###\ndef pre_order(root)\n  return unless root\n\n  # \u5c1d\u8bd5\n  $path << root\n\n  # \u8bb0\u5f55\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_ii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5728\u6bcf\u6b21\u201c\u5c1d\u8bd5\u201d\u4e2d\uff0c\u6211\u4eec\u901a\u8fc7\u5c06\u5f53\u524d\u8282\u70b9\u6dfb\u52a0\u8fdb path \u6765\u8bb0\u5f55\u8def\u5f84\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u4eec\u9700\u8981\u5c06\u8be5\u8282\u70b9\u4ece path \u4e2d\u5f39\u51fa\uff0c\u4ee5\u6062\u590d\u672c\u6b21\u5c1d\u8bd5\u4e4b\u524d\u7684\u72b6\u6001\u3002

    \u89c2\u5bdf\u56fe 13-2 \u6240\u793a\u7684\u8fc7\u7a0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5c1d\u8bd5\u548c\u56de\u9000\u7406\u89e3\u4e3a\u201c\u524d\u8fdb\u201d\u4e0e\u201c\u64a4\u9500\u201d\uff0c\u4e24\u4e2a\u64cd\u4f5c\u4e92\u4e3a\u9006\u5411\u3002

    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 13-2 \u00a0 \u5c1d\u8bd5\u4e0e\u56de\u9000

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1312","title":"13.1.2 \u00a0 \u526a\u679d","text":"

    \u590d\u6742\u7684\u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u7ea6\u675f\u6761\u4ef6\u901a\u5e38\u53ef\u7528\u4e8e\u201c\u526a\u679d\u201d\u3002

    \u4f8b\u9898\u4e09

    \u5728\u4e8c\u53c9\u6811\u4e2d\u641c\u7d22\u6240\u6709\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\uff0c\u8bf7\u8fd4\u56de\u6839\u8282\u70b9\u5230\u8fd9\u4e9b\u8282\u70b9\u7684\u8def\u5f84\uff0c\u5e76\u8981\u6c42\u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u3002

    \u4e3a\u4e86\u6ee1\u8db3\u4ee5\u4e0a\u7ea6\u675f\u6761\u4ef6\uff0c\u6211\u4eec\u9700\u8981\u6dfb\u52a0\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\uff0c\u5219\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7:\n        # \u8bb0\u5f55\u89e3\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u56de\u9000\n    path.pop()\n
    preorder_traversal_iii_compact.cpp
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    path.pop_back();\n}\n
    preorder_traversal_iii_compact.java
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u56de\u9000\n    path.remove(path.size() - 1);\n}\n
    preorder_traversal_iii_compact.cs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u56de\u9000\n    path.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_iii_compact.go
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5c1d\u8bd5\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8bb0\u5f55\u89e3\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderIII(root.Left, res, path)\n    preOrderIII(root.Right, res, path)\n    // \u56de\u9000\n    *path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_iii_compact.swift
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5c1d\u8bd5\n    path.append(root)\n    if root.val == 7 {\n        // \u8bb0\u5f55\u89e3\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u56de\u9000\n    path.removeLast()\n}\n
    preorder_traversal_iii_compact.js
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_iii_compact.ts
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path.push(root);\n    if (root.val === 7) {\n        // \u8bb0\u5f55\u89e3\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u56de\u9000\n    path.pop();\n}\n
    preorder_traversal_iii_compact.dart
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null || root.val == 3) {\n    return;\n  }\n\n  // \u5c1d\u8bd5\n  path.add(root);\n  if (root.val == 7) {\n    // \u8bb0\u5f55\u89e3\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u56de\u9000\n  path.removeLast();\n}\n
    preorder_traversal_iii_compact.rs
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<&Rc<RefCell<TreeNode>>>,\n) {\n    // \u526a\u679d\n    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {\n        return;\n    }\n    if let Some(node) = root {\n        // \u5c1d\u8bd5\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8bb0\u5f55\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u56de\u9000\n        path.pop();\n    }\n}\n
    preorder_traversal_iii_compact.c
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5c1d\u8bd5\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8bb0\u5f55\u89e3\n        for (int i = 0; i < pathSize; i++) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u56de\u9000\n    pathSize--;\n}\n
    preorder_traversal_iii_compact.kt
    /* \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5c1d\u8bd5\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8bb0\u5f55\u89e3\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u56de\u9000\n    path!!.removeAt(path!!.size - 1)\n}\n
    preorder_traversal_iii_compact.rb
    ### \u524d\u5e8f\u904d\u5386\uff1a\u4f8b\u9898\u4e09 ###\ndef pre_order(root)\n  # \u526a\u679d\n  return if !root || root.val == 3\n\n  # \u5c1d\u8bd5\n  $path.append(root)\n\n  # \u8bb0\u5f55\u89e3\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u56de\u9000\n  $path.pop\nend\n
    preorder_traversal_iii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u201c\u526a\u679d\u201d\u662f\u4e00\u4e2a\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8bcd\u3002\u5982\u56fe 13-3 \u6240\u793a\uff0c\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u641c\u7d22\u5206\u652f\uff0c\u907f\u514d\u8bb8\u591a\u65e0\u610f\u4e49\u7684\u5c1d\u8bd5\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u641c\u7d22\u6548\u7387\u3002

    \u56fe 13-3 \u00a0 \u6839\u636e\u7ea6\u675f\u6761\u4ef6\u526a\u679d

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u4ee3\u7801","text":"

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c1d\u8bd5\u5c06\u56de\u6eaf\u7684\u201c\u5c1d\u8bd5\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u4f53\u6846\u67b6\u63d0\u70bc\u51fa\u6765\uff0c\u63d0\u5347\u4ee3\u7801\u7684\u901a\u7528\u6027\u3002

    \u5728\u4ee5\u4e0b\u6846\u67b6\u4ee3\u7801\u4e2d\uff0cstate \u8868\u793a\u95ee\u9898\u7684\u5f53\u524d\u72b6\u6001\uff0cchoices \u8868\u793a\u5f53\u524d\u72b6\u6001\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9009\u62e9\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7ee7\u7eed\u641c\u7d22\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    ### \u56de\u6eaf\u7b97\u6cd5\u6846\u67b6 ###\ndef backtrack(state, choices, res)\n    # \u5224\u65ad\u662f\u5426\u4e3a\u89e3\n    if is_solution?(state)\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n        return\n    end\n\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices\n        # \u526a\u679d\uff1a\u5224\u65ad\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid?(state, choice)\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n        end\n    end\nend\n
    \n

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u57fa\u4e8e\u6846\u67b6\u4ee3\u7801\u6765\u89e3\u51b3\u4f8b\u9898\u4e09\u3002\u72b6\u6001 state \u4e3a\u8282\u70b9\u904d\u5386\u8def\u5f84\uff0c\u9009\u62e9 choices \u4e3a\u5f53\u524d\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\uff0c\u7ed3\u679c res \u662f\u8def\u5f84\u5217\u8868\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
    def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8bb0\u5f55\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5\"\"\"\n    return choice is not None and choice.val != 3\n\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u66f4\u65b0\u72b6\u6001\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u590d\u72b6\u6001\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09\"\"\"\n    # \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state):\n        # \u8bb0\u5f55\u89e3\n        record_solution(state, res)\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice)\n
    preorder_traversal_iii_template.cpp
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.java
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.cs
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (IsSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        RecordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            MakeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.go
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.swift
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state: &state, choice: choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.js
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.ts
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.dart
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n  if (isSolution(state)) {\n    // \u8bb0\u5f55\u89e3\n    recordSolution(state, res);\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      makeChoice(state, choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undoChoice(state, choice);\n    }\n  }\n}\n
    preorder_traversal_iii_template.rs
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.last().unwrap().borrow().val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfn record_solution(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    res.push(state.clone());\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Option<&Rc<RefCell<TreeNode>>>) -> bool {\n    return choice.is_some() && choice.unwrap().borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &Vec<Option<&Rc<RefCell<TreeNode>>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if is_solution(state) {\n        // \u8bb0\u5f55\u89e3\n        record_solution(state, res);\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for &choice in choices.iter() {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice.unwrap().clone());\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(\n                state,\n                &vec![\n                    choice.unwrap().borrow().left.as_ref(),\n                    choice.unwrap().borrow().right.as_ref(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undo_choice(state, choice.unwrap().clone());\n        }\n    }\n}\n
    preorder_traversal_iii_template.c
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8bb0\u5f55\u89e3 */\nvoid recordSolution(void) {\n    for (int i = 0; i < pathSize; i++) {\n        res[resSize][i] = path[i];\n    }\n    resSize++;\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution()) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution();\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice();\n        }\n    }\n}\n
    preorder_traversal_iii_template.kt
    /* \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8bb0\u5f55\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72b6\u6001 */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u590d\u72b6\u6001 */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n    if (isSolution(state)) {\n        // \u8bb0\u5f55\u89e3\n        recordSolution(state, res)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            makeChoice(state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.rb
    ### \u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u5426\u4e3a\u89e3 ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n### \u8bb0\u5f55\u89e3 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n### \u5224\u65ad\u5728\u5f53\u524d\u72b6\u6001\u4e0b\uff0c\u8be5\u9009\u62e9\u662f\u5426\u5408\u6cd5 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n### \u66f4\u65b0\u72b6\u6001 ###\ndef make_choice(state, choice)\n  state << choice\nend\n\n### \u6062\u590d\u72b6\u6001 ###\ndef undo_choice(state, choice)\n  state.pop\nend\n\n### \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 ###\ndef backtrack(state, choices, res)\n  # \u68c0\u67e5\u662f\u5426\u4e3a\u89e3\n  record_solution(state, res) if is_solution?(state)\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  for choice in choices\n    # \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n    if is_valid?(state, choice)\n      # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      make_choice(state, choice)\n      # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, [choice.left, choice.right], res)\n      # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      undo_choice(state, choice)\n    end\n  end\nend\n
    preorder_traversal_iii_template.zig
    [class]{}-[func]{isSolution}\n\n[class]{}-[func]{recordSolution}\n\n[class]{}-[func]{isValid}\n\n[class]{}-[func]{makeChoice}\n\n[class]{}-[func]{undoChoice}\n\n[class]{}-[func]{backtrack}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6839\u636e\u9898\u610f\uff0c\u6211\u4eec\u5728\u627e\u5230\u503c\u4e3a \\(7\\) \u7684\u8282\u70b9\u540e\u5e94\u8be5\u7ee7\u7eed\u641c\u7d22\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u8bb0\u5f55\u89e3\u4e4b\u540e\u7684 return \u8bed\u53e5\u5220\u9664\u3002\u56fe 13-4 \u5bf9\u6bd4\u4e86\u4fdd\u7559\u6216\u5220\u9664 return \u8bed\u53e5\u7684\u641c\u7d22\u8fc7\u7a0b\u3002

    \u56fe 13-4 \u00a0 \u4fdd\u7559\u4e0e\u5220\u9664 return \u7684\u641c\u7d22\u8fc7\u7a0b\u5bf9\u6bd4

    \u76f8\u6bd4\u57fa\u4e8e\u524d\u5e8f\u904d\u5386\u7684\u4ee3\u7801\u5b9e\u73b0\uff0c\u57fa\u4e8e\u56de\u6eaf\u7b97\u6cd5\u6846\u67b6\u7684\u4ee3\u7801\u5b9e\u73b0\u867d\u7136\u663e\u5f97\u5570\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u56de\u6eaf\u95ee\u9898\u53ef\u4ee5\u5728\u8be5\u6846\u67b6\u4e0b\u89e3\u51b3\u3002\u6211\u4eec\u53ea\u9700\u6839\u636e\u5177\u4f53\u95ee\u9898\u6765\u5b9a\u4e49 state \u548c choices \uff0c\u5e76\u5b9e\u73b0\u6846\u67b6\u4e2d\u7684\u5404\u4e2a\u65b9\u6cd5\u5373\u53ef\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4 \u00a0 \u5e38\u7528\u672f\u8bed","text":"

    \u4e3a\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u7b97\u6cd5\u95ee\u9898\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e0b\u56de\u6eaf\u7b97\u6cd5\u4e2d\u5e38\u7528\u672f\u8bed\u7684\u542b\u4e49\uff0c\u5e76\u5bf9\u7167\u4f8b\u9898\u4e09\u7ed9\u51fa\u5bf9\u5e94\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

    \u8868 13-1 \u00a0 \u5e38\u89c1\u7684\u56de\u6eaf\u7b97\u6cd5\u672f\u8bed

    \u540d\u8bcd \u5b9a\u4e49 \u4f8b\u9898\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6ee1\u8db3\u95ee\u9898\u7279\u5b9a\u6761\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u4e2a\u6216\u591a\u4e2a \u6839\u8282\u70b9\u5230\u8282\u70b9 \\(7\\) \u7684\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u6240\u6709\u8def\u5f84 \u7ea6\u675f\u6761\u4ef6\uff08constraint\uff09 \u7ea6\u675f\u6761\u4ef6\u662f\u95ee\u9898\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u6761\u4ef6\uff0c\u901a\u5e38\u7528\u4e8e\u526a\u679d \u8def\u5f84\u4e2d\u4e0d\u5305\u542b\u8282\u70b9 \\(3\\) \u72b6\u6001\uff08state\uff09 \u72b6\u6001\u8868\u793a\u95ee\u9898\u5728\u67d0\u4e00\u65f6\u523b\u7684\u60c5\u51b5\uff0c\u5305\u62ec\u5df2\u7ecf\u505a\u51fa\u7684\u9009\u62e9 \u5f53\u524d\u5df2\u8bbf\u95ee\u7684\u8282\u70b9\u8def\u5f84\uff0c\u5373 path \u8282\u70b9\u5217\u8868 \u5c1d\u8bd5\uff08attempt\uff09 \u5c1d\u8bd5\u662f\u6839\u636e\u53ef\u7528\u9009\u62e9\u6765\u63a2\u7d22\u89e3\u7a7a\u95f4\u7684\u8fc7\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\uff0c\u68c0\u67e5\u662f\u5426\u4e3a\u89e3 \u9012\u5f52\u8bbf\u95ee\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\uff0c\u5c06\u8282\u70b9\u6dfb\u52a0\u8fdb path \uff0c\u5224\u65ad\u8282\u70b9\u7684\u503c\u662f\u5426\u4e3a \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u72b6\u6001\u65f6\uff0c\u64a4\u9500\u524d\u9762\u505a\u51fa\u7684\u9009\u62e9\uff0c\u56de\u5230\u4e0a\u4e00\u4e2a\u72b6\u6001 \u5f53\u8d8a\u8fc7\u53f6\u8282\u70b9\u3001\u7ed3\u675f\u8282\u70b9\u8bbf\u95ee\u3001\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\u7ec8\u6b62\u641c\u7d22\uff0c\u51fd\u6570\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u636e\u95ee\u9898\u7279\u6027\u548c\u7ea6\u675f\u6761\u4ef6\u907f\u514d\u65e0\u610f\u4e49\u7684\u641c\u7d22\u8def\u5f84\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u7d22\u6548\u7387 \u5f53\u9047\u5230\u503c\u4e3a \\(3\\) \u7684\u8282\u70b9\u65f6\uff0c\u5219\u4e0d\u518d\u7ee7\u7eed\u641c\u7d22

    Tip

    \u95ee\u9898\u3001\u89e3\u3001\u72b6\u6001\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u4e0a\u662f\u4e00\u79cd\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u7b97\u6cd5\uff0c\u5b83\u5c1d\u8bd5\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\u76f4\u5230\u627e\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u3002\u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u5728\u4e8e\u80fd\u591f\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e14\u5728\u5408\u7406\u7684\u526a\u679d\u64cd\u4f5c\u4e0b\uff0c\u5177\u6709\u5f88\u9ad8\u7684\u6548\u7387\u3002

    \u7136\u800c\uff0c\u5728\u5904\u7406\u5927\u89c4\u6a21\u6216\u8005\u590d\u6742\u95ee\u9898\u65f6\uff0c\u56de\u6eaf\u7b97\u6cd5\u7684\u8fd0\u884c\u6548\u7387\u53ef\u80fd\u96be\u4ee5\u63a5\u53d7\u3002

    • \u65f6\u95f4\uff1a\u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u904d\u5386\u72b6\u6001\u7a7a\u95f4\u7684\u6240\u6709\u53ef\u80fd\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u6307\u6570\u9636\u6216\u9636\u4e58\u9636\u3002
    • \u7a7a\u95f4\uff1a\u5728\u9012\u5f52\u8c03\u7528\u4e2d\u9700\u8981\u4fdd\u5b58\u5f53\u524d\u7684\u72b6\u6001\uff08\u4f8b\u5982\u8def\u5f84\u3001\u7528\u4e8e\u526a\u679d\u7684\u8f85\u52a9\u53d8\u91cf\u7b49\uff09\uff0c\u5f53\u6df1\u5ea6\u5f88\u5927\u65f6\uff0c\u7a7a\u95f4\u9700\u6c42\u53ef\u80fd\u4f1a\u53d8\u5f97\u5f88\u5927\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u7684\u6700\u4f73\u89e3\u51b3\u65b9\u6848\u3002\u5bf9\u4e8e\u8fd9\u4e9b\u95ee\u9898\uff0c\u7531\u4e8e\u65e0\u6cd5\u9884\u6d4b\u54ea\u4e9b\u9009\u62e9\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u4eec\u5fc5\u987b\u5bf9\u6240\u6709\u53ef\u80fd\u7684\u9009\u62e9\u8fdb\u884c\u904d\u5386\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5173\u952e\u662f\u5982\u4f55\u4f18\u5316\u6548\u7387\uff0c\u5e38\u89c1\u7684\u6548\u7387\u4f18\u5316\u65b9\u6cd5\u6709\u4e24\u79cd\u3002

    • \u526a\u679d\uff1a\u907f\u514d\u641c\u7d22\u90a3\u4e9b\u80af\u5b9a\u4e0d\u4f1a\u4ea7\u751f\u89e3\u7684\u8def\u5f84\uff0c\u4ece\u800c\u8282\u7701\u65f6\u95f4\u548c\u7a7a\u95f4\u3002
    • \u542f\u53d1\u5f0f\u641c\u7d22\uff1a\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8ba1\u503c\uff0c\u4ece\u800c\u4f18\u5148\u641c\u7d22\u6700\u6709\u53ef\u80fd\u4ea7\u751f\u6709\u6548\u89e3\u7684\u8def\u5f84\u3002
    "},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u9898","text":"

    \u56de\u6eaf\u7b97\u6cd5\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u641c\u7d22\u95ee\u9898\u3001\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u548c\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u3002

    \u641c\u7d22\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u89e3\u51b3\u65b9\u6848\u3002

    • \u5168\u6392\u5217\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7ec4\u5408\u3002
    • \u5b50\u96c6\u548c\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\u548c\u4e00\u4e2a\u76ee\u6807\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u4e3a\u76ee\u6807\u548c\u7684\u5b50\u96c6\u3002
    • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5706\u76d8\uff0c\u8981\u6c42\u5c06\u6240\u6709\u5706\u76d8\u4ece\u4e00\u6839\u67f1\u5b50\u79fb\u52a8\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\uff0c\u4e14\u4e0d\u80fd\u5c06\u5927\u5706\u76d8\u653e\u5728\u5c0f\u5706\u76d8\u4e0a\u3002

    \u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u5230\u6ee1\u8db3\u6240\u6709\u7ea6\u675f\u6761\u4ef6\u7684\u89e3\u3002

    • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76d8\u4e0a\u653e\u7f6e \\(n\\) \u4e2a\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u4eec\u4e92\u4e0d\u653b\u51fb\u3002
    • \u6570\u72ec\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7f51\u683c\u4e2d\u586b\u5165\u6570\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u4e2a \\(3 \\times 3\\) \u5b50\u7f51\u683c\u4e2d\u7684\u6570\u5b57\u4e0d\u91cd\u590d\u3002
    • \u56fe\u7740\u8272\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u7528\u6700\u5c11\u7684\u989c\u8272\u7ed9\u56fe\u7684\u6bcf\u4e2a\u9876\u70b9\u7740\u8272\uff0c\u4f7f\u5f97\u76f8\u90bb\u9876\u70b9\u989c\u8272\u4e0d\u540c\u3002

    \u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff1a\u8fd9\u7c7b\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u4e00\u4e2a\u7ec4\u5408\u7a7a\u95f4\u4e2d\u627e\u5230\u6ee1\u8db3\u67d0\u4e9b\u6761\u4ef6\u7684\u6700\u4f18\u89e3\u3002

    • 0-1 \u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u80cc\u5305\uff0c\u6bcf\u4e2a\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u4ef7\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5185\uff0c\u9009\u62e9\u7269\u54c1\u4f7f\u5f97\u603b\u4ef7\u503c\u6700\u5927\u3002
    • \u65c5\u884c\u5546\u95ee\u9898\uff1a\u5728\u4e00\u4e2a\u56fe\u4e2d\uff0c\u4ece\u4e00\u4e2a\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u6240\u6709\u5176\u4ed6\u70b9\u6070\u597d\u4e00\u6b21\u540e\u8fd4\u56de\u8d77\u70b9\uff0c\u6c42\u6700\u77ed\u8def\u5f84\u3002
    • \u6700\u5927\u56e2\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u65e0\u5411\u56fe\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u56fe\uff0c\u5373\u5b50\u56fe\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u90fd\u6709\u8fb9\u76f8\u8fde\u3002

    \u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u4f18\u89e3\u51b3\u65b9\u6848\u3002

    • 0-1 \u80cc\u5305\u95ee\u9898\u901a\u5e38\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\uff0c\u4ee5\u8fbe\u5230\u66f4\u9ad8\u7684\u65f6\u95f4\u6548\u7387\u3002
    • \u65c5\u884c\u5546\u662f\u4e00\u4e2a\u8457\u540d\u7684 NP-Hard \u95ee\u9898\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u9057\u4f20\u7b97\u6cd5\u548c\u8681\u7fa4\u7b97\u6cd5\u7b49\u3002
    • \u6700\u5927\u56e2\u95ee\u9898\u662f\u56fe\u8bba\u4e2d\u7684\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\uff0c\u53ef\u7528\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u542f\u53d1\u5f0f\u7b97\u6cd5\u6765\u89e3\u51b3\u3002
    "},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u95ee\u9898","text":"

    Question

    \u6839\u636e\u56fd\u9645\u8c61\u68cb\u7684\u89c4\u5219\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u51fb\u4e0e\u540c\u5904\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u6761\u659c\u7ebf\u4e0a\u7684\u68cb\u5b50\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u7687\u540e\u548c\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5bfb\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u95f4\u65e0\u6cd5\u76f8\u4e92\u653b\u51fb\u7684\u6446\u653e\u65b9\u6848\u3002

    \u5982\u56fe 13-15 \u6240\u793a\uff0c\u5f53 \\(n = 4\\) \u65f6\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u4e24\u4e2a\u89e3\u3002\u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76d8\u5171\u6709 \\(n^2\\) \u4e2a\u683c\u5b50\uff0c\u7ed9\u51fa\u4e86\u6240\u6709\u7684\u9009\u62e9 choices \u3002\u5728\u9010\u4e2a\u653e\u7f6e\u7687\u540e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u68cb\u76d8\u72b6\u6001\u5728\u4e0d\u65ad\u5730\u53d8\u5316\uff0c\u6bcf\u4e2a\u65f6\u523b\u7684\u68cb\u76d8\u5c31\u662f\u72b6\u6001 state \u3002

    \u56fe 13-15 \u00a0 4 \u7687\u540e\u95ee\u9898\u7684\u89e3

    \u56fe 13-16 \u5c55\u793a\u4e86\u672c\u9898\u7684\u4e09\u4e2a\u7ea6\u675f\u6761\u4ef6\uff1a\u591a\u4e2a\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u6761\u5bf9\u89d2\u7ebf\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u89d2\u7ebf\u5206\u4e3a\u4e3b\u5bf9\u89d2\u7ebf \\ \u548c\u6b21\u5bf9\u89d2\u7ebf / \u4e24\u79cd\u3002

    \u56fe 13-16 \u00a0 n \u7687\u540e\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6

    "},{"location":"chapter_backtracking/n_queens_problem/#1","title":"1. \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565","text":"

    \u7687\u540e\u7684\u6570\u91cf\u548c\u68cb\u76d8\u7684\u884c\u6570\u90fd\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u6211\u4eec\u5bb9\u6613\u5f97\u5230\u4e00\u4e2a\u63a8\u8bba\uff1a\u68cb\u76d8\u6bcf\u884c\u90fd\u5141\u8bb8\u4e14\u53ea\u5141\u8bb8\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u4ece\u7b2c\u4e00\u884c\u5f00\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\uff0c\u76f4\u81f3\u6700\u540e\u4e00\u884c\u7ed3\u675f\u3002

    \u56fe 13-17 \u6240\u793a\u4e3a 4 \u7687\u540e\u95ee\u9898\u7684\u9010\u884c\u653e\u7f6e\u8fc7\u7a0b\u3002\u53d7\u753b\u5e45\u9650\u5236\uff0c\u56fe 13-17 \u4ec5\u5c55\u5f00\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u4e2a\u641c\u7d22\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u4e0d\u6ee1\u8db3\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u65b9\u6848\u90fd\u8fdb\u884c\u4e86\u526a\u679d\u3002

    \u56fe 13-17 \u00a0 \u9010\u884c\u653e\u7f6e\u7b56\u7565

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9010\u884c\u653e\u7f6e\u7b56\u7565\u8d77\u5230\u4e86\u526a\u679d\u7684\u4f5c\u7528\uff0c\u5b83\u907f\u514d\u4e86\u540c\u4e00\u884c\u51fa\u73b0\u591a\u4e2a\u7687\u540e\u7684\u6240\u6709\u641c\u7d22\u5206\u652f\u3002

    "},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u4e0e\u5bf9\u89d2\u7ebf\u526a\u679d","text":"

    \u4e3a\u4e86\u6ee1\u8db3\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5e03\u5c14\u578b\u6570\u7ec4 cols \u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u51b3\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u4eec\u901a\u8fc7 cols \u5c06\u5df2\u6709\u7687\u540e\u7684\u5217\u8fdb\u884c\u526a\u679d\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u52a8\u6001\u66f4\u65b0 cols \u7684\u72b6\u6001\u3002

    \u90a3\u4e48\uff0c\u5982\u4f55\u5904\u7406\u5bf9\u89d2\u7ebf\u7ea6\u675f\u5462\uff1f\u8bbe\u68cb\u76d8\u4e2d\u67d0\u4e2a\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\((row, col)\\) \uff0c\u9009\u5b9a\u77e9\u9635\u4e2d\u7684\u67d0\u6761\u4e3b\u5bf9\u89d2\u7ebf\uff0c\u6211\u4eec\u53d1\u73b0\u8be5\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u51cf\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5bf9\u89d2\u7ebf\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u4e3a\u6052\u5b9a\u503c\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u4e24\u4e2a\u683c\u5b50\u6ee1\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5219\u5b83\u4eec\u4e00\u5b9a\u5904\u5728\u540c\u4e00\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u3002\u5229\u7528\u8be5\u89c4\u5f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u56fe 13-18 \u6240\u793a\u7684\u6570\u7ec4 diags1 \u8bb0\u5f55\u6bcf\u6761\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

    \u540c\u7406\uff0c\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6052\u5b9a\u503c\u3002\u6211\u4eec\u540c\u6837\u4e5f\u53ef\u4ee5\u501f\u52a9\u6570\u7ec4 diags2 \u6765\u5904\u7406\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002

    \u56fe 13-18 \u00a0 \u5904\u7406\u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f

    "},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u8bf7\u6ce8\u610f\uff0c\\(n\\) \u7ef4\u65b9\u9635\u4e2d \\(row - col\\) \u7684\u8303\u56f4\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u8303\u56f4\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7684\u6570\u91cf\u90fd\u4e3a \\(2n - 1\\) \uff0c\u5373\u6570\u7ec4 diags1 \u548c diags2 \u7684\u957f\u5ea6\u90fd\u4e3a \\(2n - 1\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig n_queens.py
    def backtrack(\n    row: int,\n    n: int,\n    state: list[list[str]],\n    res: list[list[list[str]]],\n    cols: list[bool],\n    diags1: list[bool],\n    diags2: list[bool],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u904d\u5386\u6240\u6709\u5217\n    for col in range(n):\n        # \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = diags1[diag1] = diags2[diag2] = True\n            # \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            # \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = diags1[diag1] = diags2[diag2] = False\n\ndef n_queens(n: int) -> list[list[list[str]]]:\n    \"\"\"\u6c42\u89e3 n \u7687\u540e\"\"\"\n    # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state = [[\"#\" for _ in range(n)] for _ in range(n)]\n    cols = [False] * n  # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    res = []\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n
    n_queens.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\n               vector<bool> &diags1, vector<bool> &diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nvector<vector<vector<string>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    vector<vector<string>> state(n, vector<string>(n, \"#\"));\n    vector<bool> cols(n, false);           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<vector<vector<string>>> res;\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\n        boolean[] cols, boolean[] diags1, boolean[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<String>> copyState = new ArrayList<>();\n        for (List<String> sRow : state) {\n            copyState.add(new ArrayList<>(sRow));\n        }\n        res.add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get(row).set(col, \"Q\");\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get(row).set(col, \"#\");\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<String>> state = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<String> row = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            row.add(\"#\");\n        }\n        state.add(row);\n    }\n    boolean[] cols = new boolean[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<String>>> res = new ArrayList<>();\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\n        bool[] cols, bool[] diags1, bool[] diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        List<List<string>> copyState = [];\n        foreach (List<string> sRow in state) {\n            copyState.Add(new List<string>(sRow));\n        }\n        res.Add(copyState);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            Backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<string>>> NQueens(int n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    List<List<string>> state = [];\n    for (int i = 0; i < n; i++) {\n        List<string> row = [];\n        for (int j = 0; j < n; j++) {\n            row.Add(\"#\");\n        }\n        state.Add(row);\n    }\n    bool[] cols = new bool[n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    List<List<List<string>>> res = [];\n\n    Backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        newState := make([][]string, len(*state))\n        for i, _ := range newState {\n            newState[i] = make([]string, len((*state)[0]))\n            copy(newState[i], (*state)[i])\n\n        }\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            (*state)[row][col] = \"Q\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row+1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            (*state)[row][col] = \"#\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n int) [][][]string {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    state := make([][]string, n)\n    for i := 0; i < n; i++ {\n        row := make([]string, n)\n        for i := 0; i < n; i++ {\n            row[i] = \"#\"\n        }\n        state[i] = row\n    }\n    // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    cols := make([]bool, n)\n    diags1 := make([]bool, 2*n-1)\n    diags2 := make([]bool, 2*n-1)\n    res := make([][][]string, 0)\n    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)\n    return res\n}\n
    n_queens.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            cols[col] = true\n            diags1[diag1] = true\n            diags2[diag2] = true\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            cols[col] = false\n            diags1[diag1] = false\n            diags2[diag2] = false\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunc nQueens(n: Int) -> [[[String]]] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    var state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\n    var cols = Array(repeating: false, count: n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var res: [[[String]]] = []\n\n    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n\n    return res\n}\n
    n_queens.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n) {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(\n    row: number,\n    n: number,\n    state: string[][],\n    res: string[][][],\n    cols: boolean[],\n    diags1: boolean[],\n    diags2: boolean[]\n): void {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfunction nQueens(n: number): string[][][] {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const res: string[][][] = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(\n  int row,\n  int n,\n  List<List<String>> state,\n  List<List<List<String>>> res,\n  List<bool> cols,\n  List<bool> diags1,\n  List<bool> diags2,\n) {\n  // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (row == n) {\n    List<List<String>> copyState = [];\n    for (List<String> sRow in state) {\n      copyState.add(List.from(sRow));\n    }\n    res.add(copyState);\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n      state[row][col] = \"Q\";\n      cols[col] = true;\n      diags1[diag1] = true;\n      diags2[diag2] = true;\n      // \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2);\n      // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n      state[row][col] = \"#\";\n      cols[col] = false;\n      diags1[diag1] = false;\n      diags2[diag2] = false;\n    }\n  }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nList<List<List<String>>> nQueens(int n) {\n  // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  List<List<String>> state = List.generate(n, (index) => List.filled(n, \"#\"));\n  List<bool> cols = List.filled(n, false); // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<List<List<String>>> res = [];\n\n  backtrack(0, n, state, res, cols, diags1, diags2);\n\n  return res;\n}\n
    n_queens.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfn backtrack(\n    row: usize,\n    n: usize,\n    state: &mut Vec<Vec<String>>,\n    res: &mut Vec<Vec<Vec<String>>>,\n    cols: &mut [bool],\n    diags1: &mut [bool],\n    diags2: &mut [bool],\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if row == n {\n        let mut copy_state: Vec<Vec<String>> = Vec::new();\n        for s_row in state.clone() {\n            copy_state.push(s_row);\n        }\n        res.push(copy_state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state.get_mut(row).unwrap()[col] = \"Q\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state.get_mut(row).unwrap()[col] = \"#\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    let mut state: Vec<Vec<String>> = Vec::new();\n    for _ in 0..n {\n        let mut row: Vec<String> = Vec::new();\n        for _ in 0..n {\n            row.push(\"#\".into());\n        }\n        state.push(row);\n    }\n    let mut cols = vec![false; n]; // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut res: Vec<Vec<Vec<String>>> = Vec::new();\n\n    backtrack(\n        0,\n        n,\n        &mut state,\n        &mut res,\n        &mut cols,\n        &mut diags1,\n        &mut diags2,\n    );\n\n    res\n}\n
    n_queens.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nvoid backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],\n               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        res[*resSize] = (char **)malloc(sizeof(char *) * n);\n        for (int i = 0; i < n; ++i) {\n            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));\n            strcpy(res[*resSize][i], state[i]);\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nchar ***nQueens(int n, int *returnSize) {\n    char state[MAX_SIZE][MAX_SIZE];\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    for (int i = 0; i < n; ++i) {\n        for (int j = 0; j < n; ++j) {\n            state[i][j] = '#';\n        }\n        state[i][n] = '\\0';\n    }\n    bool cols[MAX_SIZE] = {false};           // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n\n    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);\n    *returnSize = 0;\n    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e */\nfun backtrack(\n    row: Int,\n    n: Int,\n    state: MutableList<MutableList<String>>,\n    res: MutableList<MutableList<MutableList<String>>?>,\n    cols: BooleanArray,\n    diags1: BooleanArray,\n    diags2: BooleanArray\n) {\n    // \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (row == n) {\n        val copyState = mutableListOf<MutableList<String>>()\n        for (sRow in state) {\n            copyState.add(sRow.toMutableList())\n        }\n        res.add(copyState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n            state[row][col] = \"Q\"\n            diags2[diag2] = true\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n            // \u653e\u7f6e\u4e0b\u4e00\u884c\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            // \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n            state[row][col] = \"#\"\n            diags2[diag2] = false\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n        }\n    }\n}\n\n/* \u6c42\u89e3 n \u7687\u540e */\nfun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {\n    // \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n    val state = mutableListOf<MutableList<String>>()\n    for (i in 0..<n) {\n        val row = mutableListOf<String>()\n        for (j in 0..<n) {\n            row.add(\"#\")\n        }\n        state.add(row)\n    }\n    val cols = BooleanArray(n) // \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val res = mutableListOf<MutableList<MutableList<String>>?>()\n\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n}\n
    n_queens.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1an \u7687\u540e ###\ndef backtrack(row, n, state, res, cols, diags1, diags2)\n  # \u5f53\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if row == n\n    res << state.map { |row| row.dup }\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u5217\n  for col in 0...n\n    # \u8ba1\u7b97\u8be5\u683c\u5b50\u5bf9\u5e94\u7684\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\n    diag1 = row - col + n - 1\n    diag2 = row + col\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8be5\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5bf9\u89d2\u7ebf\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u5b58\u5728\u7687\u540e\n    if !cols[col] && !diags1[diag1] && !diags2[diag2]\n      # \u5c1d\u8bd5\uff1a\u5c06\u7687\u540e\u653e\u7f6e\u5728\u8be5\u683c\u5b50\n      state[row][col] = \"Q\"\n      cols[col] = diags1[diag1] = diags2[diag2] = true\n      # \u653e\u7f6e\u4e0b\u4e00\u884c\n      backtrack(row + 1, n, state, res, cols, diags1, diags2)\n      # \u56de\u9000\uff1a\u5c06\u8be5\u683c\u5b50\u6062\u590d\u4e3a\u7a7a\u4f4d\n      state[row][col] = \"#\"\n      cols[col] = diags1[diag1] = diags2[diag2] = false\n    end\n  end\nend\n\n### \u6c42\u89e3 n \u7687\u540e ###\ndef n_queens(n)\n  # \u521d\u59cb\u5316 n*n \u5927\u5c0f\u7684\u68cb\u76d8\uff0c\u5176\u4e2d 'Q' \u4ee3\u8868\u7687\u540e\uff0c'#' \u4ee3\u8868\u7a7a\u4f4d\n  state = Array.new(n) { Array.new(n, \"#\") }\n  cols = Array.new(n, false) # \u8bb0\u5f55\u5217\u662f\u5426\u6709\u7687\u540e\n  diags1 = Array.new(2 * n - 1, false) # \u8bb0\u5f55\u4e3b\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  diags2 = Array.new(2 * n - 1, false) # \u8bb0\u5f55\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u6709\u7687\u540e\n  res = []\n  backtrack(0, n, state, res, cols, diags1, diags2)\n\n  res\nend\n
    n_queens.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u8651\u5217\u7ea6\u675f\uff0c\u5219\u4ece\u7b2c\u4e00\u884c\u5230\u6700\u540e\u4e00\u884c\u5206\u522b\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u4e2a\u9009\u62e9\uff0c\u4f7f\u7528 \\(O(n!)\\) \u65f6\u95f4\u3002\u5f53\u8bb0\u5f55\u89e3\u65f6\uff0c\u9700\u8981\u590d\u5236\u77e9\u9635 state \u5e76\u6dfb\u52a0\u8fdb res \uff0c\u590d\u5236\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002\u56e0\u6b64\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n! \\cdot n^2)\\) \u3002\u5b9e\u9645\u4e0a\uff0c\u6839\u636e\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u526a\u679d\u4e5f\u80fd\u591f\u5927\u5e45\u7f29\u5c0f\u641c\u7d22\u7a7a\u95f4\uff0c\u56e0\u800c\u641c\u7d22\u6548\u7387\u5f80\u5f80\u4f18\u4e8e\u4ee5\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    \u6570\u7ec4 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff0c\u6570\u7ec4 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/","title":"13.2 \u00a0 \u5168\u6392\u5217\u95ee\u9898","text":"

    \u5168\u6392\u5217\u95ee\u9898\u662f\u56de\u6eaf\u7b97\u6cd5\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u7684\u5b9a\u4e49\u662f\u5728\u7ed9\u5b9a\u4e00\u4e2a\u96c6\u5408\uff08\u5982\u4e00\u4e2a\u6570\u7ec4\u6216\u5b57\u7b26\u4e32\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u8868 13-2 \u5217\u4e3e\u4e86\u51e0\u4e2a\u793a\u4f8b\u6570\u636e\uff0c\u5305\u62ec\u8f93\u5165\u6570\u7ec4\u548c\u5bf9\u5e94\u7684\u6240\u6709\u6392\u5217\u3002

    \u8868 13-2 \u00a0 \u5168\u6392\u5217\u793a\u4f8b

    \u8f93\u5165\u6570\u7ec4 \u6240\u6709\u6392\u5217 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1321","title":"13.2.1 \u00a0 \u65e0\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u4ece\u56de\u6eaf\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\u3002\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u4eec\u5148\u9009\u62e9 \\(1\\) \uff0c\u518d\u9009\u62e9 \\(3\\) \uff0c\u6700\u540e\u9009\u62e9 \\(2\\) \uff0c\u5219\u83b7\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u9500\u4e00\u4e2a\u9009\u62e9\uff0c\u4e4b\u540e\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002

    \u4ece\u56de\u6eaf\u4ee3\u7801\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9009\u96c6\u5408 choices \u662f\u8f93\u5165\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72b6\u6001 state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9009\u62e9\u7684\u5143\u7d20\u3002\u8bf7\u6ce8\u610f\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u5141\u8bb8\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u5e94\u8be5\u662f\u552f\u4e00\u7684\u3002

    \u5982\u56fe 13-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u641c\u7d22\u8fc7\u7a0b\u5c55\u5f00\u6210\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u5f53\u524d\u72b6\u6001 state \u3002\u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u7ecf\u8fc7\u4e09\u8f6e\u9009\u62e9\u540e\u5230\u8fbe\u53f6\u8282\u70b9\uff0c\u6bcf\u4e2a\u53f6\u8282\u70b9\u90fd\u5bf9\u5e94\u4e00\u4e2a\u6392\u5217\u3002

    \u56fe 13-5 \u00a0 \u5168\u6392\u5217\u7684\u9012\u5f52\u6811

    "},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u590d\u9009\u62e9\u526a\u679d","text":"

    \u4e3a\u4e86\u5b9e\u73b0\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u6211\u4eec\u8003\u8651\u5f15\u5165\u4e00\u4e2a\u5e03\u5c14\u578b\u6570\u7ec4 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9009\u62e9\uff0c\u5e76\u57fa\u4e8e\u5b83\u5b9e\u73b0\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

    • \u5728\u505a\u51fa\u9009\u62e9 choice[i] \u540e\uff0c\u6211\u4eec\u5c31\u5c06 selected[i] \u8d4b\u503c\u4e3a \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9009\u62e9\u3002
    • \u904d\u5386\u9009\u62e9\u5217\u8868 choices \u65f6\uff0c\u8df3\u8fc7\u6240\u6709\u5df2\u88ab\u9009\u62e9\u7684\u8282\u70b9\uff0c\u5373\u526a\u679d\u3002

    \u5982\u56fe 13-6 \u6240\u793a\uff0c\u5047\u8bbe\u6211\u4eec\u7b2c\u4e00\u8f6e\u9009\u62e9 1 \uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9 3 \uff0c\u7b2c\u4e09\u8f6e\u9009\u62e9 2 \uff0c\u5219\u9700\u8981\u5728\u7b2c\u4e8c\u8f6e\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f6e\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

    \u56fe 13-6 \u00a0 \u5168\u6392\u5217\u526a\u679d\u793a\u4f8b

    \u89c2\u5bdf\u56fe 13-6 \u53d1\u73b0\uff0c\u8be5\u526a\u679d\u64cd\u4f5c\u5c06\u641c\u7d22\u7a7a\u95f4\u5927\u5c0f\u4ece \\(O(n^n)\\) \u51cf\u5c0f\u81f3 \\(O(n!)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u60f3\u6e05\u695a\u4ee5\u4e0a\u4fe1\u606f\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u4ee3\u7801\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u4e3a\u4e86\u7f29\u77ed\u6574\u4f53\u4ee3\u7801\uff0c\u6211\u4eec\u4e0d\u5355\u72ec\u5b9e\u73b0\u6846\u67b6\u4ee3\u7801\u4e2d\u7684\u5404\u4e2a\u51fd\u6570\uff0c\u800c\u662f\u5c06\u5b83\u4eec\u5c55\u5f00\u5728 backtrack() \u51fd\u6570\u4e2d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_i.py
    def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if not selected[i]:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 I\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
    permutations_i.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
    permutations_i.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<Integer>> permutationsI(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
    permutations_i.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> PermutationsI(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
    permutations_i.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackI(&state, &nums, &selected, &res)\n    return res\n}\n
    permutations_i.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
    permutations_i.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_i.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 I */\nfunction permutationsI(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_i.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n    if (!selected[i]) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 I */\nList<List<int>> permutationsI(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
    permutations_i.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if !selected[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
    permutations_i.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nint **permutationsI(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
    permutations_i.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n        if (!selected[i]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 I */\nfun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
    permutations_i.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I ###\ndef backtrack(state, choices, selected, res)\n  # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  choices.each_with_index do |choice, i|\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20\n    unless selected[i]\n      # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      selected[i] = true\n      state << choice\n      # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res)\n      # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n### \u5168\u6392\u5217 I ###\ndef permutations_i(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_backtracking/permutations_problem/#1322","title":"13.2.2 \u00a0 \u8003\u8651\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u590d\u7684\u6392\u5217\u3002

    \u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u4e3a \\([1, 1, 2]\\) \u3002\u4e3a\u4e86\u65b9\u4fbf\u533a\u5206\u4e24\u4e2a\u91cd\u590d\u5143\u7d20 \\(1\\) \uff0c\u6211\u4eec\u5c06\u7b2c\u4e8c\u4e2a \\(1\\) \u8bb0\u4e3a \\(\\hat{1}\\) \u3002

    \u5982\u56fe 13-7 \u6240\u793a\uff0c\u4e0a\u8ff0\u65b9\u6cd5\u751f\u6210\u7684\u6392\u5217\u6709\u4e00\u534a\u662f\u91cd\u590d\u7684\u3002

    \u56fe 13-7 \u00a0 \u91cd\u590d\u6392\u5217

    \u90a3\u4e48\u5982\u4f55\u53bb\u9664\u91cd\u590d\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\uff0c\u76f4\u63a5\u5bf9\u6392\u5217\u7ed3\u679c\u8fdb\u884c\u53bb\u91cd\u3002\u7136\u800c\u8fd9\u6837\u505a\u4e0d\u591f\u4f18\u96c5\uff0c\u56e0\u4e3a\u751f\u6210\u91cd\u590d\u6392\u5217\u7684\u641c\u7d22\u5206\u652f\u6ca1\u6709\u5fc5\u8981\uff0c\u5e94\u5f53\u63d0\u524d\u8bc6\u522b\u5e76\u526a\u679d\uff0c\u8fd9\u6837\u53ef\u4ee5\u8fdb\u4e00\u6b65\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002

    "},{"location":"chapter_backtracking/permutations_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

    \u89c2\u5bdf\u56fe 13-8 \uff0c\u5728\u7b2c\u4e00\u8f6e\u4e2d\uff0c\u9009\u62e9 \\(1\\) \u6216\u9009\u62e9 \\(\\hat{1}\\) \u662f\u7b49\u4ef7\u7684\uff0c\u5728\u8fd9\u4e24\u4e2a\u9009\u62e9\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u590d\u7684\u3002\u56e0\u6b64\u5e94\u8be5\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

    \u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(2\\) \u4e4b\u540e\uff0c\u7b2c\u4e8c\u8f6e\u9009\u62e9\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u5e94\u5c06\u7b2c\u4e8c\u8f6e\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u5728\u67d0\u4e00\u8f6e\u9009\u62e9\u4e2d\uff0c\u4fdd\u8bc1\u591a\u4e2a\u76f8\u7b49\u7684\u5143\u7d20\u4ec5\u88ab\u9009\u62e9\u4e00\u6b21\u3002

    \u56fe 13-8 \u00a0 \u91cd\u590d\u6392\u5217\u526a\u679d

    "},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5728\u4e0a\u4e00\u9898\u7684\u4ee3\u7801\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u8003\u8651\u5728\u6bcf\u4e00\u8f6e\u9009\u62e9\u4e2d\u5f00\u542f\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 duplicated \uff0c\u7528\u4e8e\u8bb0\u5f55\u8be5\u8f6e\u4e2d\u5df2\u7ecf\u5c1d\u8bd5\u8fc7\u7684\u5143\u7d20\uff0c\u5e76\u5c06\u91cd\u590d\u5143\u7d20\u526a\u679d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig permutations_ii.py
    def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice)  # \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = False\n            state.pop()\n\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u5168\u6392\u5217 II\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
    permutations_ii.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    unordered_set<int> duplicated;\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.emplace(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
    permutations_ii.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    Set<Integer> duplicated = new HashSet<Integer>();\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<Integer>> permutationsII(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
    permutations_ii.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.Add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> PermutationsII(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
    permutations_ii.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    duplicated := make(map[int]struct{}, 0)\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrackII(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackII(&state, &nums, &selected, &res)\n    return res\n}\n
    permutations_ii.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
    permutations_ii.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_ii.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u5168\u6392\u5217 II */\nfunction permutationsII(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_ii.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      duplicated.add(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u5168\u6392\u5217 II */\nList<List<int>> permutationsII(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
    permutations_ii.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    let mut duplicated = HashSet::<i32>::new();\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.insert(choice); // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n            state.remove(state.len() - 1);\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new();\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
    permutations_ii.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    bool duplicated[MAX_SIZE] = {false};\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated[choice] = true; // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nint **permutationsII(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
    permutations_ii.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            duplicated.add(choice) // \u8bb0\u5f55\u9009\u62e9\u8fc7\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u5168\u6392\u5217 II */\nfun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
    permutations_ii.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II ###\ndef backtrack(state, choices, selected, res)\n  # \u5f53\u72b6\u6001\u957f\u5ea6\u7b49\u4e8e\u5143\u7d20\u6570\u91cf\u65f6\uff0c\u8bb0\u5f55\u89e3\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  duplicated = Set.new\n  choices.each_with_index do |choice, i|\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u5143\u7d20 \u4e14 \u4e0d\u5141\u8bb8\u91cd\u590d\u9009\u62e9\u76f8\u7b49\u5143\u7d20\n    if !selected[i] && !duplicated.include?(choice)\n      # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n      duplicated.add(choice)\n      selected[i] = true\n      state << choice\n      # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n      backtrack(state, choices, selected, res)\n      # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n### \u5168\u6392\u5217 II ###\ndef permutations_ii(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5047\u8bbe\u5143\u7d20\u4e24\u4e24\u4e4b\u95f4\u4e92\u4e0d\u76f8\u540c\uff0c\u5219 \\(n\\) \u4e2a\u5143\u7d20\u5171\u6709 \\(n!\\) \u79cd\u6392\u5217\uff08\u9636\u4e58\uff09\uff1b\u5728\u8bb0\u5f55\u7ed3\u679c\u65f6\uff0c\u9700\u8981\u590d\u5236\u957f\u5ea6\u4e3a \\(n\\) \u7684\u5217\u8868\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n!n)\\) \u3002

    \u6700\u5927\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002\u540c\u4e00\u65f6\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u4e2a duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u95f4\u3002\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u4e24\u79cd\u526a\u679d\u5bf9\u6bd4","text":"

    \u8bf7\u6ce8\u610f\uff0c\u867d\u7136 selected \u548c duplicated \u90fd\u7528\u4e8e\u526a\u679d\uff0c\u4f46\u4e24\u8005\u7684\u76ee\u6807\u4e0d\u540c\u3002

    • \u91cd\u590d\u9009\u62e9\u526a\u679d\uff1a\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\u4e2d\u53ea\u6709\u4e00\u4e2a selected \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5f53\u524d\u72b6\u6001\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u4e2a\u5143\u7d20\u5728 state \u4e2d\u91cd\u590d\u51fa\u73b0\u3002
    • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f6e\u9009\u62e9\uff08\u6bcf\u4e2a\u8c03\u7528\u7684 backtrack \u51fd\u6570\uff09\u90fd\u5305\u542b\u4e00\u4e2a duplicated \u3002\u5b83\u8bb0\u5f55\u7684\u662f\u5728\u672c\u8f6e\u904d\u5386\uff08for \u5faa\u73af\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9009\u62e9\u8fc7\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8bc1\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002

    \u56fe 13-9 \u5c55\u793a\u4e86\u4e24\u4e2a\u526a\u679d\u6761\u4ef6\u7684\u751f\u6548\u8303\u56f4\u3002\u6ce8\u610f\uff0c\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u9009\u62e9\uff0c\u4ece\u6839\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\u6784\u6210\u4e00\u4e2a\u6392\u5217\u3002

    \u56fe 13-9 \u00a0 \u4e24\u79cd\u526a\u679d\u6761\u4ef6\u7684\u4f5c\u7528\u8303\u56f4

    "},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u95ee\u9898","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u65e0\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ef\u4ee5\u88ab\u9009\u53d6\u591a\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

    \u4f8b\u5982\uff0c\u8f93\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6807\u6574\u6570 \\(9\\) \uff0c\u89e3\u4e3a \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

    • \u8f93\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u91cd\u590d\u9009\u53d6\u3002
    • \u5b50\u96c6\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u4e2a\u5b50\u96c6\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c2\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

    \u7c7b\u4f3c\u4e8e\u5168\u6392\u5217\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u8fc7\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9009\u62e9\u7684\u7ed3\u679c\uff0c\u5e76\u5728\u9009\u62e9\u8fc7\u7a0b\u4e2d\u5b9e\u65f6\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u5f53\u5143\u7d20\u548c\u7b49\u4e8e target \u65f6\uff0c\u5c31\u5c06\u5b50\u96c6\u8bb0\u5f55\u81f3\u7ed3\u679c\u5217\u8868\u3002

    \u800c\u4e0e\u5168\u6392\u5217\u95ee\u9898\u4e0d\u540c\u7684\u662f\uff0c\u672c\u9898\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u65e0\u9650\u6b21\u9009\u53d6\uff0c\u56e0\u6b64\u65e0\u987b\u501f\u52a9 selected \u5e03\u5c14\u5217\u8868\u6765\u8bb0\u5f55\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9009\u62e9\u3002\u6211\u4eec\u53ef\u4ee5\u5bf9\u5168\u6392\u5217\u4ee3\u7801\u8fdb\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u9898\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i_naive.py
    def backtrack(\n    state: list[int],\n    target: int,\n    total: int,\n    choices: list[int],\n    res: list[list[int]],\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
    subset_sum_i_naive.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i_naive.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)\n    return res\n}\n
    subset_sum_i_naive.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    total: number,\n    choices: number[],\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  int total,\n  List<int> choices,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
    subset_sum_i_naive.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    total: i32,\n    choices: &[i32],\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
    subset_sum_i_naive.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6570\u91cf\u4e3a0\n    backtrack(target, 0, nums, numsSize);\n}\n
    subset_sum_i_naive.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    total: Int,\n    choices: IntArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
    subset_sum_i_naive.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, total, choices, res)\n  # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if total == target\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  for i in 0...choices.length\n    # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u8df3\u8fc7\u8be5\u9009\u62e9\n    next if total + choices[i] > target\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state << choices[i]\n    # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target, total + choices[i], choices, res)\n    # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.pop\n  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u590d\u5b50\u96c6\uff09###\ndef subset_sum_i_naive(nums, target)\n  state = [] # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  total = 0 # \u5b50\u96c6\u548c\n  res = [] # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, total, nums, res)\n  res\nend\n
    subset_sum_i_naive.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5411\u4ee5\u4e0a\u4ee3\u7801\u8f93\u5165\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u8f93\u51fa\u7ed3\u679c\u4e3a \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u867d\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u4e3a \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u590d\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

    \u8fd9\u662f\u56e0\u4e3a\u641c\u7d22\u8fc7\u7a0b\u662f\u533a\u5206\u9009\u62e9\u987a\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u533a\u5206\u9009\u62e9\u987a\u5e8f\u3002\u5982\u56fe 13-10 \u6240\u793a\uff0c\u5148\u9009 \\(4\\) \u540e\u9009 \\(5\\) \u4e0e\u5148\u9009 \\(5\\) \u540e\u9009 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5bf9\u5e94\u540c\u4e00\u4e2a\u5b50\u96c6\u3002

    \u56fe 13-10 \u00a0 \u5b50\u96c6\u641c\u7d22\u4e0e\u8d8a\u754c\u526a\u679d

    \u4e3a\u4e86\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u601d\u8def\u662f\u5bf9\u7ed3\u679c\u5217\u8868\u8fdb\u884c\u53bb\u91cd\u3002\u4f46\u8fd9\u4e2a\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u4e24\u65b9\u9762\u539f\u56e0\u3002

    • \u5f53\u6570\u7ec4\u5143\u7d20\u8f83\u591a\uff0c\u5c24\u5176\u662f\u5f53 target \u8f83\u5927\u65f6\uff0c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u4ea7\u751f\u5927\u91cf\u7684\u91cd\u590d\u5b50\u96c6\u3002
    • \u6bd4\u8f83\u5b50\u96c6\uff08\u6570\u7ec4\uff09\u7684\u5f02\u540c\u975e\u5e38\u8017\u65f6\uff0c\u9700\u8981\u5148\u6392\u5e8f\u6570\u7ec4\uff0c\u518d\u6bd4\u8f83\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u5143\u7d20\u7684\u5f02\u540c\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u590d\u5b50\u96c6\u526a\u679d","text":"

    \u6211\u4eec\u8003\u8651\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u901a\u8fc7\u526a\u679d\u8fdb\u884c\u53bb\u91cd\u3002\u89c2\u5bdf\u56fe 13-11 \uff0c\u91cd\u590d\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u987a\u5e8f\u9009\u62e9\u6570\u7ec4\u5143\u7d20\u65f6\u4ea7\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u51b5\u3002

    1. \u5f53\u7b2c\u4e00\u8f6e\u548c\u7b2c\u4e8c\u8f6e\u5206\u522b\u9009\u62e9 \\(3\\) \u548c \\(4\\) \u65f6\uff0c\u4f1a\u751f\u6210\u5305\u542b\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8bb0\u4e3a \\([3, 4, \\dots]\\) \u3002
    2. \u4e4b\u540e\uff0c\u5f53\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(4\\) \u65f6\uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \uff0c\u56e0\u4e3a\u8be5\u9009\u62e9\u4ea7\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

    \u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c42\u7684\u9009\u62e9\u90fd\u662f\u4ece\u5de6\u5230\u53f3\u88ab\u9010\u4e2a\u5c1d\u8bd5\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

    1. \u524d\u4e24\u8f6e\u9009\u62e9 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
    2. \u524d\u4e24\u8f6e\u9009\u62e9 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
    3. \u82e5\u7b2c\u4e00\u8f6e\u9009\u62e9 \\(5\\) \uff0c\u5219\u7b2c\u4e8c\u8f6e\u5e94\u8be5\u8df3\u8fc7 \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u4e3a\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u4e0e\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u590d\u3002

    \u56fe 13-11 \u00a0 \u4e0d\u540c\u9009\u62e9\u987a\u5e8f\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

    \u603b\u7ed3\u6765\u770b\uff0c\u7ed9\u5b9a\u8f93\u5165\u6570\u7ec4 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8bbe\u641c\u7d22\u8fc7\u7a0b\u4e2d\u7684\u9009\u62e9\u5e8f\u5217\u4e3a \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5219\u8be5\u9009\u62e9\u5e8f\u5217\u9700\u8981\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6ee1\u8db3\u8be5\u6761\u4ef6\u7684\u9009\u62e9\u5e8f\u5217\u90fd\u4f1a\u9020\u6210\u91cd\u590d\uff0c\u5e94\u5f53\u526a\u679d\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u4e3a\u5b9e\u73b0\u8be5\u526a\u679d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u53d8\u91cf start \uff0c\u7528\u4e8e\u6307\u793a\u904d\u5386\u8d77\u59cb\u70b9\u3002\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i\\) \u5f00\u59cb\u904d\u5386\u3002\u8fd9\u6837\u505a\u5c31\u53ef\u4ee5\u8ba9\u9009\u62e9\u5e8f\u5217\u6ee1\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4ece\u800c\u4fdd\u8bc1\u5b50\u96c6\u552f\u4e00\u3002

    \u9664\u6b64\u4e4b\u5916\uff0c\u6211\u4eec\u8fd8\u5bf9\u4ee3\u7801\u8fdb\u884c\u4e86\u4ee5\u4e0b\u4e24\u9879\u4f18\u5316\u3002

    • \u5728\u5f00\u542f\u641c\u7d22\u524d\uff0c\u5148\u5c06\u6570\u7ec4 nums \u6392\u5e8f\u3002\u5728\u904d\u5386\u6240\u6709\u9009\u62e9\u65f6\uff0c\u5f53\u5b50\u96c6\u548c\u8d85\u8fc7 target \u65f6\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\uff0c\u56e0\u4e3a\u540e\u8fb9\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target \u3002
    • \u7701\u53bb\u5143\u7d20\u548c\u53d8\u91cf total \uff0c\u901a\u8fc7\u5728 target \u4e0a\u6267\u884c\u51cf\u6cd5\u6765\u7edf\u8ba1\u5143\u7d20\u548c\uff0c\u5f53 target \u7b49\u4e8e \\(0\\) \u65f6\u8bb0\u5f55\u89e3\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_i.py
    def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_i(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c I\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_i.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvector<vector<int>> subsetSumI(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<Integer>> subsetSumI(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> SubsetSumI(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_i.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nList<List<int>> subsetSumI(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_i.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_i.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; ++i) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nvoid subsetSumI(int *nums, int numsSize, int target) {\n    qsort(nums, numsSize, sizeof(int), cmp); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                           // \u904d\u5386\u8d77\u59cb\u70b9\n    backtrack(target, nums, numsSize, start);\n}\n
    subset_sum_i.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_i.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  for i in start...choices.length\n    # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    break if target - choices[i] < 0\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state << choices[i]\n    # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i, res)\n    # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.pop\n  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c I ###\ndef subset_sum_i(nums, target)\n  state = [] # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort! # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  start = 0 # \u904d\u5386\u8d77\u59cb\u70b9\n  res = [] # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res)\n  res\nend\n
    subset_sum_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 13-12 \u6240\u793a\u4e3a\u5c06\u6570\u7ec4 \\([3, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u8f93\u5165\u4ee5\u4e0a\u4ee3\u7801\u540e\u7684\u6574\u4f53\u56de\u6eaf\u8fc7\u7a0b\u3002

    \u56fe 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u8fc7\u7a0b

    "},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u8651\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u6b63\u6574\u6570 target \uff0c\u8bf7\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\uff0c\u4f7f\u5f97\u7ec4\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u4e8e target \u3002\u7ed9\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ea\u53ef\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u8bf7\u4ee5\u5217\u8868\u5f62\u5f0f\u8fd4\u56de\u8fd9\u4e9b\u7ec4\u5408\uff0c\u5217\u8868\u4e2d\u4e0d\u5e94\u5305\u542b\u91cd\u590d\u7ec4\u5408\u3002

    \u76f8\u6bd4\u4e8e\u4e0a\u9898\uff0c\u672c\u9898\u7684\u8f93\u5165\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u8fd9\u5f15\u5165\u4e86\u65b0\u7684\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u7ed9\u5b9a\u6570\u7ec4 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \uff0c\u5219\u73b0\u6709\u4ee3\u7801\u7684\u8f93\u51fa\u7ed3\u679c\u4e3a \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73b0\u4e86\u91cd\u590d\u5b50\u96c6\u3002

    \u9020\u6210\u8fd9\u79cd\u91cd\u590d\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f6e\u4e2d\u88ab\u591a\u6b21\u9009\u62e9\u3002\u5728\u56fe 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f6e\u5171\u6709\u4e09\u4e2a\u9009\u62e9\uff0c\u5176\u4e2d\u4e24\u4e2a\u90fd\u4e3a \\(4\\) \uff0c\u4f1a\u4ea7\u751f\u4e24\u4e2a\u91cd\u590d\u7684\u641c\u7d22\u5206\u652f\uff0c\u4ece\u800c\u8f93\u51fa\u91cd\u590d\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f6e\u7684\u4e24\u4e2a \\(4\\) \u4e5f\u4f1a\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002

    \u56fe 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5bfc\u81f4\u7684\u91cd\u590d\u5b50\u96c6

    "},{"location":"chapter_backtracking/subset_sum_problem/#1_1","title":"1. \u00a0 \u76f8\u7b49\u5143\u7d20\u526a\u679d","text":"

    \u4e3a\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5b9e\u73b0\u65b9\u5f0f\u6bd4\u8f83\u5de7\u5999\uff1a\u7531\u4e8e\u6570\u7ec4\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u90bb\u7684\u3002\u8fd9\u610f\u5473\u7740\u5728\u67d0\u8f6e\u9009\u62e9\u4e2d\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u4e0e\u5176\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u5219\u8bf4\u660e\u5b83\u5df2\u7ecf\u88ab\u9009\u62e9\u8fc7\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u8fc7\u5f53\u524d\u5143\u7d20\u3002

    \u4e0e\u6b64\u540c\u65f6\uff0c\u672c\u9898\u89c4\u5b9a\u6bcf\u4e2a\u6570\u7ec4\u5143\u7d20\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\u3002\u5e78\u8fd0\u7684\u662f\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5229\u7528\u53d8\u91cf start \u6765\u6ee1\u8db3\u8be5\u7ea6\u675f\uff1a\u5f53\u505a\u51fa\u9009\u62e9 \\(x_{i}\\) \u540e\uff0c\u8bbe\u5b9a\u4e0b\u4e00\u8f6e\u4ece\u7d22\u5f15 \\(i + 1\\) \u5f00\u59cb\u5411\u540e\u904d\u5386\u3002\u8fd9\u6837\u65e2\u80fd\u53bb\u9664\u91cd\u590d\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u590d\u9009\u62e9\u5143\u7d20\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig subset_sum_ii.py
    def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop()\n\ndef subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u6c42\u89e3\u5b50\u96c6\u548c II\"\"\"\n    state = []  # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start = 0  # \u904d\u5386\u8d77\u59cb\u70b9\n    res = []  # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_ii.cpp
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvector<vector<int>> subsetSumII(vector<int> &nums, int target) {\n    vector<int> state;              // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0;                  // \u904d\u5386\u8d77\u59cb\u70b9\n    vector<vector<int>> res;        // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.java
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<Integer>> subsetSumII(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<Integer>> res = new ArrayList<>(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.cs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> SubsetSumII(int[] nums, int target) {\n    List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.go
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    start := 0              // \u904d\u5386\u8d77\u59cb\u70b9\n    res := make([][]int, 0) // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_ii.swift
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    var res: [[Int]] = [] // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_ii.js
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.ts
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    const start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    const res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.dart
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nList<List<int>> subsetSumII(List<int> nums, int target) {\n  List<int> state = []; // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  int start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n  List<List<int>> res = []; // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_ii.rs
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfn backtrack(\n    mut state: Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    let start = 0; // \u904d\u5386\u8d77\u59cb\u70b9\n    let mut res = Vec::new(); // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_ii.c
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u5f00\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
    subset_sum_ii.kt
    /* \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    // \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n        // \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72b6\u6001\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n    val start = 0 // \u904d\u5386\u8d77\u59cb\u70b9\n    val res = mutableListOf<MutableList<Int>?>() // \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_ii.rb
    ### \u56de\u6eaf\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II ###\ndef backtrack(state, target, choices, start, res)\n  # \u5b50\u96c6\u548c\u7b49\u4e8e target \u65f6\uff0c\u8bb0\u5f55\u89e3\n  if target.zero?\n    res << state.dup\n    return\n  end\n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  # \u526a\u679d\u4e8c\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u751f\u6210\u91cd\u590d\u5b50\u96c6\n  # \u526a\u679d\u4e09\uff1a\u4ece start \u5f00\u59cb\u904d\u5386\uff0c\u907f\u514d\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\n  for i in start...choices.length\n    # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u8fc7 target \uff0c\u5219\u76f4\u63a5\u7ed3\u675f\u5faa\u73af\n    # \u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u5df2\u6392\u5e8f\uff0c\u540e\u8fb9\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u8fc7 target\n    break if target - choices[i] < 0\n    # \u526a\u679d\u56db\uff1a\u5982\u679c\u8be5\u5143\u7d20\u4e0e\u5de6\u8fb9\u5143\u7d20\u76f8\u7b49\uff0c\u8bf4\u660e\u8be5\u641c\u7d22\u5206\u652f\u91cd\u590d\uff0c\u76f4\u63a5\u8df3\u8fc7\n    next if i > start && choices[i] == choices[i - 1]\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0 target, start\n    state << choices[i]\n    # \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n    backtrack(state, target - choices[i], choices, i + 1, res)\n    # \u56de\u9000\uff1a\u64a4\u9500\u9009\u62e9\uff0c\u6062\u590d\u5230\u4e4b\u524d\u7684\u72b6\u6001\n    state.pop\n  end\nend\n\n### \u6c42\u89e3\u5b50\u96c6\u548c II ###\ndef subset_sum_ii(nums, target)\n  state = [] # \u72b6\u6001\uff08\u5b50\u96c6\uff09\n  nums.sort! # \u5bf9 nums \u8fdb\u884c\u6392\u5e8f\n  start = 0 # \u904d\u5386\u8d77\u59cb\u70b9\n  res = [] # \u7ed3\u679c\u5217\u8868\uff08\u5b50\u96c6\u5217\u8868\uff09\n  backtrack(state, target, nums, start, res)\n  res\nend\n
    subset_sum_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 13-14 \u5c55\u793a\u4e86\u6570\u7ec4 \\([4, 4, 5]\\) \u548c\u76ee\u6807\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u8fc7\u7a0b\uff0c\u5171\u5305\u542b\u56db\u79cd\u526a\u679d\u64cd\u4f5c\u3002\u8bf7\u4f60\u5c06\u56fe\u793a\u4e0e\u4ee3\u7801\u6ce8\u91ca\u76f8\u7ed3\u5408\uff0c\u7406\u89e3\u6574\u4e2a\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u79cd\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

    \u56fe 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u8fc7\u7a0b

    "},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u56de\u6eaf\u7b97\u6cd5\u672c\u8d28\u662f\u7a77\u4e3e\u6cd5\uff0c\u901a\u8fc7\u5bf9\u89e3\u7a7a\u95f4\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6765\u5bfb\u627e\u7b26\u5408\u6761\u4ef6\u7684\u89e3\u3002\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\uff0c\u9047\u5230\u6ee1\u8db3\u6761\u4ef6\u7684\u89e3\u5219\u8bb0\u5f55\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u904d\u5386\u5b8c\u6210\u540e\u7ed3\u675f\u3002
    • \u56de\u6eaf\u7b97\u6cd5\u7684\u641c\u7d22\u8fc7\u7a0b\u5305\u62ec\u5c1d\u8bd5\u4e0e\u56de\u9000\u4e24\u4e2a\u90e8\u5206\u3002\u5b83\u901a\u8fc7\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u6765\u5c1d\u8bd5\u5404\u79cd\u9009\u62e9\uff0c\u5f53\u9047\u5230\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u60c5\u51b5\u65f6\uff0c\u5219\u64a4\u9500\u4e0a\u4e00\u6b65\u7684\u9009\u62e9\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5e76\u7ee7\u7eed\u5c1d\u8bd5\u5176\u4ed6\u9009\u62e9\u3002\u5c1d\u8bd5\u4e0e\u56de\u9000\u662f\u4e24\u4e2a\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
    • \u56de\u6eaf\u95ee\u9898\u901a\u5e38\u5305\u542b\u591a\u4e2a\u7ea6\u675f\u6761\u4ef6\uff0c\u5b83\u4eec\u53ef\u7528\u4e8e\u5b9e\u73b0\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7ed3\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u7d22\u6548\u7387\u3002
    • \u56de\u6eaf\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u4e8e\u89e3\u51b3\u641c\u7d22\u95ee\u9898\u548c\u7ea6\u675f\u6ee1\u8db3\u95ee\u9898\u3002\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u867d\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u7b97\u6cd5\u89e3\u51b3\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
    • \u5168\u6392\u5217\u95ee\u9898\u65e8\u5728\u641c\u7d22\u7ed9\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e2a\u5143\u7d20\u662f\u5426\u88ab\u9009\u62e9\uff0c\u526a\u6389\u91cd\u590d\u9009\u62e9\u540c\u4e00\u5143\u7d20\u7684\u641c\u7d22\u5206\u652f\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5143\u7d20\u53ea\u88ab\u9009\u62e9\u4e00\u6b21\u3002
    • \u5728\u5168\u6392\u5217\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff0c\u5219\u6700\u7ec8\u7ed3\u679c\u4f1a\u51fa\u73b0\u91cd\u590d\u6392\u5217\u3002\u6211\u4eec\u9700\u8981\u7ea6\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u62e9\u4e00\u6b21\uff0c\u8fd9\u901a\u5e38\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408\u6765\u5b9e\u73b0\u3002
    • \u5b50\u96c6\u548c\u95ee\u9898\u7684\u76ee\u6807\u662f\u5728\u7ed9\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u4e3a\u76ee\u6807\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u533a\u5206\u5143\u7d20\u987a\u5e8f\uff0c\u800c\u641c\u7d22\u8fc7\u7a0b\u4f1a\u8f93\u51fa\u6240\u6709\u987a\u5e8f\u7684\u7ed3\u679c\uff0c\u4ea7\u751f\u91cd\u590d\u5b50\u96c6\u3002\u6211\u4eec\u5728\u56de\u6eaf\u524d\u5c06\u6570\u636e\u8fdb\u884c\u6392\u5e8f\uff0c\u5e76\u8bbe\u7f6e\u4e00\u4e2a\u53d8\u91cf\u6765\u6307\u793a\u6bcf\u4e00\u8f6e\u7684\u904d\u5386\u8d77\u59cb\u70b9\uff0c\u4ece\u800c\u5c06\u751f\u6210\u91cd\u590d\u5b50\u96c6\u7684\u641c\u7d22\u5206\u652f\u8fdb\u884c\u526a\u679d\u3002
    • \u5bf9\u4e8e\u5b50\u96c6\u548c\u95ee\u9898\uff0c\u6570\u7ec4\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u4f1a\u4ea7\u751f\u91cd\u590d\u96c6\u5408\u3002\u6211\u4eec\u5229\u7528\u6570\u7ec4\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\uff0c\u901a\u8fc7\u5224\u65ad\u76f8\u90bb\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5b9e\u73b0\u526a\u679d\uff0c\u4ece\u800c\u786e\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f6e\u4e2d\u53ea\u80fd\u88ab\u9009\u4e2d\u4e00\u6b21\u3002
    • \\(n\\) \u7687\u540e\u95ee\u9898\u65e8\u5728\u5bfb\u627e\u5c06 \\(n\\) \u4e2a\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76d8\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u4e24\u4e24\u4e4b\u95f4\u65e0\u6cd5\u653b\u51fb\u5bf9\u65b9\u3002\u8be5\u95ee\u9898\u7684\u7ea6\u675f\u6761\u4ef6\u6709\u884c\u7ea6\u675f\u3001\u5217\u7ea6\u675f\u3001\u4e3b\u5bf9\u89d2\u7ebf\u548c\u6b21\u5bf9\u89d2\u7ebf\u7ea6\u675f\u3002\u4e3a\u6ee1\u8db3\u884c\u7ea6\u675f\uff0c\u6211\u4eec\u91c7\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8bc1\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u4e2a\u7687\u540e\u3002
    • \u5217\u7ea6\u675f\u548c\u5bf9\u89d2\u7ebf\u7ea6\u675f\u7684\u5904\u7406\u65b9\u5f0f\u7c7b\u4f3c\u3002\u5bf9\u4e8e\u5217\u7ea6\u675f\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u8bb0\u5f55\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u4ece\u800c\u6307\u793a\u9009\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5bf9\u4e8e\u5bf9\u89d2\u7ebf\u7ea6\u675f\uff0c\u6211\u4eec\u501f\u52a9\u4e24\u4e2a\u6570\u7ec4\u6765\u5206\u522b\u8bb0\u5f55\u8be5\u4e3b\u3001\u6b21\u5bf9\u89d2\u7ebf\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96be\u70b9\u5728\u4e8e\u627e\u5904\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5bf9\u89d2\u7ebf\u4e0a\u683c\u5b50\u6ee1\u8db3\u7684\u884c\u5217\u7d22\u5f15\u89c4\u5f8b\u3002
    "},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u600e\u4e48\u7406\u89e3\u56de\u6eaf\u548c\u9012\u5f52\u7684\u5173\u7cfb\uff1f

    \u603b\u7684\u6765\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u79cd\u201c\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u9012\u5f52\u66f4\u50cf\u662f\u4e00\u4e2a\u201c\u5de5\u5177\u201d\u3002

    • \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u9012\u5f52\u7684\u5e94\u7528\u573a\u666f\u4e4b\u4e00\uff0c\u662f\u9012\u5f52\u5728\u641c\u7d22\u95ee\u9898\u4e2d\u7684\u5e94\u7528\u3002
    • \u9012\u5f52\u7684\u7ed3\u6784\u4f53\u73b0\u4e86\u201c\u5b50\u95ee\u9898\u5206\u89e3\u201d\u7684\u89e3\u9898\u8303\u5f0f\uff0c\u5e38\u7528\u4e8e\u89e3\u51b3\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\uff08\u8bb0\u5fc6\u5316\u9012\u5f52\uff09\u7b49\u95ee\u9898\u3002
    "},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    Abstract

    \u590d\u6742\u5ea6\u5206\u6790\u72b9\u5982\u6d69\u701a\u7684\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u65f6\u7a7a\u5411\u5bfc\u3002

    \u5b83\u5e26\u9886\u6211\u4eec\u5728\u65f6\u95f4\u4e0e\u7a7a\u95f4\u8fd9\u4e24\u4e2a\u7ef4\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5bfb\u627e\u66f4\u4f18\u96c5\u7684\u89e3\u51b3\u65b9\u6848\u3002

    "},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30
    • 2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52
    • 2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6
    • 2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6
    • 2.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52","text":"

    \u5728\u7b97\u6cd5\u4e2d\uff0c\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u662f\u5f88\u5e38\u89c1\u7684\uff0c\u5b83\u4e0e\u590d\u6742\u5ea6\u5206\u6790\u606f\u606f\u76f8\u5173\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7ecd\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e4b\u524d\uff0c\u6211\u4eec\u5148\u6765\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5e8f\u4e2d\u5b9e\u73b0\u91cd\u590d\u6267\u884c\u4efb\u52a1\uff0c\u5373\u4e24\u79cd\u57fa\u672c\u7684\u7a0b\u5e8f\u63a7\u5236\u7ed3\u6784\uff1a\u8fed\u4ee3\u3001\u9012\u5f52\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#221","title":"2.2.1 \u00a0 \u8fed\u4ee3","text":"

    \u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u79cd\u91cd\u590d\u6267\u884c\u67d0\u4e2a\u4efb\u52a1\u7684\u63a7\u5236\u7ed3\u6784\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5e8f\u4f1a\u5728\u6ee1\u8db3\u4e00\u5b9a\u7684\u6761\u4ef6\u4e0b\u91cd\u590d\u6267\u884c\u67d0\u6bb5\u4ee3\u7801\uff0c\u76f4\u5230\u8fd9\u4e2a\u6761\u4ef6\u4e0d\u518d\u6ee1\u8db3\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for","title":"1. \u00a0 for \u5faa\u73af","text":"

    for \u5faa\u73af\u662f\u6700\u5e38\u89c1\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9002\u5408\u5728\u9884\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6570\u65f6\u4f7f\u7528\u3002

    \u4ee5\u4e0b\u51fd\u6570\u57fa\u4e8e for \u5faa\u73af\u5b9e\u73b0\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7ed3\u679c\u4f7f\u7528\u53d8\u91cf res \u8bb0\u5f55\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5bf9\u5e94\u7684\u533a\u95f4\u662f\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u7684\uff0c\u5bf9\u5e94\u7684\u904d\u5386\u8303\u56f4\u4e3a \\(a, a + 1, \\dots, b-1\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def for_loop(n: int) -> int:\n    \"\"\"for \u5faa\u73af\"\"\"\n    res = 0\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
    iteration.cpp
    /* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.java
    /* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.cs
    /* for \u5faa\u73af */\nint ForLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.go
    /* for \u5faa\u73af */\nfunc forLoop(n int) int {\n    res := 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
    iteration.swift
    /* for \u5faa\u73af */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
    iteration.js
    /* for \u5faa\u73af */\nfunction forLoop(n) {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.ts
    /* for \u5faa\u73af */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.dart
    /* for \u5faa\u73af */\nint forLoop(int n) {\n  int res = 0;\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
    iteration.rs
    /* for \u5faa\u73af */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
    iteration.c
    /* for \u5faa\u73af */\nint forLoop(int n) {\n    int res = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.kt
    /* for \u5faa\u73af */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
    iteration.rb
    ### for \u5faa\u73af ###\ndef for_loop(n)\n  res = 0\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
    iteration.zig
    // for \u5faa\u73af\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        res = res + @as(i32, @intCast(i));\n    }\n    return res;\n} \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-1 \u662f\u8be5\u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe\u3002

    \u56fe 2-1 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u6d41\u7a0b\u6846\u56fe

    \u6b64\u6c42\u548c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u6210\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u8fd9\u4e2a\u201c\u7ebf\u6027\u5173\u7cfb\u201d\u3002\u76f8\u5173\u5185\u5bb9\u5c06\u4f1a\u5728\u4e0b\u4e00\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while","title":"2. \u00a0 while \u5faa\u73af","text":"

    \u4e0e for \u5faa\u73af\u7c7b\u4f3c\uff0cwhile \u5faa\u73af\u4e5f\u662f\u4e00\u79cd\u5b9e\u73b0\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u7a0b\u5e8f\u6bcf\u8f6e\u90fd\u4f1a\u5148\u68c0\u67e5\u6761\u4ef6\uff0c\u5982\u679c\u6761\u4ef6\u4e3a\u771f\uff0c\u5219\u7ee7\u7eed\u6267\u884c\uff0c\u5426\u5219\u5c31\u7ed3\u675f\u5faa\u73af\u3002

    \u4e0b\u9762\u6211\u4eec\u7528 while \u5faa\u73af\u6765\u5b9e\u73b0\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def while_loop(n: int) -> int:\n    \"\"\"while \u5faa\u73af\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    return res\n
    iteration.cpp
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.java
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.cs
    /* while \u5faa\u73af */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.go
    /* while \u5faa\u73af */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n    }\n    return res\n}\n
    iteration.swift
    /* while \u5faa\u73af */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
    iteration.js
    /* while \u5faa\u73af */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.ts
    /* while \u5faa\u73af */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.dart
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  }\n  return res;\n}\n
    iteration.rs
    /* while \u5faa\u73af */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    res\n}\n
    iteration.c
    /* while \u5faa\u73af */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res;\n}\n
    iteration.kt
    /* while \u5faa\u73af */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    }\n    return res\n}\n
    iteration.rb
    ### while \u5faa\u73af ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n  end\n\n  res\nend\n
    iteration.zig
    // while \u5faa\u73af\nfn whileLoop(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += @intCast(i);\n        i += 1;\n    }\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    while \u5faa\u73af\u6bd4 for \u5faa\u73af\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u5faa\u73af\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u7531\u5730\u8bbe\u8ba1\u6761\u4ef6\u53d8\u91cf\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9aa4\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6761\u4ef6\u53d8\u91cf \\(i\\) \u6bcf\u8f6e\u8fdb\u884c\u4e24\u6b21\u66f4\u65b0\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u5faa\u73af\u5b9e\u73b0\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def while_loop_ii(n: int) -> int:\n    \"\"\"while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\"\"\"\n    res = 0\n    i = 1  # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    return res\n
    iteration.cpp
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.java
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.cs
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
    iteration.go
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    i := 1\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
    iteration.swift
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
    iteration.js
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.ts
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.dart
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n  // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
    iteration.rs
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
    iteration.c
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.kt
    /* while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09 */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i++\n        i *= 2\n    }\n    return res\n}\n
    iteration.rb
    ### while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n\n  # \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
    iteration.zig
    //  while \u5faa\u73af\uff08\u4e24\u6b21\u66f4\u65b0\uff09\nfn whileLoopII(n: i32) i32 {\n    var res: i32 = 0;\n    var i: i32 = 1; // \u521d\u59cb\u5316\u6761\u4ef6\u53d8\u91cf\n    // \u5faa\u73af\u6c42\u548c 1, 4, 10, ...\n    while (i <= n) {\n        res += @intCast(i);\n        // \u66f4\u65b0\u6761\u4ef6\u53d8\u91cf\n        i += 1;\n        i *= 2;\n    }\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u603b\u7684\u6765\u8bf4\uff0cfor \u5faa\u73af\u7684\u4ee3\u7801\u66f4\u52a0\u7d27\u51d1\uff0cwhile \u5faa\u73af\u66f4\u52a0\u7075\u6d3b\uff0c\u4e24\u8005\u90fd\u53ef\u4ee5\u5b9e\u73b0\u8fed\u4ee3\u7ed3\u6784\u3002\u9009\u62e9\u4f7f\u7528\u54ea\u4e00\u4e2a\u5e94\u8be5\u6839\u636e\u7279\u5b9a\u95ee\u9898\u7684\u9700\u6c42\u6765\u51b3\u5b9a\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5d4c\u5957\u5faa\u73af","text":"

    \u6211\u4eec\u53ef\u4ee5\u5728\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\u5185\u5d4c\u5957\u53e6\u4e00\u4e2a\u5faa\u73af\u7ed3\u6784\uff0c\u4e0b\u9762\u4ee5 for \u5faa\u73af\u4e3a\u4f8b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def nested_for_loop(n: int) -> str:\n    \"\"\"\u53cc\u5c42 for \u5faa\u73af\"\"\"\n    res = \"\"\n    # \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
    iteration.cpp
    /* \u53cc\u5c42 for \u5faa\u73af */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
    iteration.java
    /* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
    iteration.cs
    /* \u53cc\u5c42 for \u5faa\u73af */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
    iteration.go
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u5faa\u73af j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
    iteration.swift
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
    iteration.js
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
    iteration.ts
    /* \u53cc\u5c42 for \u5faa\u73af */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
    iteration.dart
    /* \u53cc\u5c42 for \u5faa\u73af */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u5faa\u73af i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u5faa\u73af j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
    iteration.rs
    /* \u53cc\u5c42 for \u5faa\u73af */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
    iteration.c
    /* \u53cc\u5c42 for \u5faa\u73af */\nchar *nestedForLoop(int n) {\n    // n * n \u4e3a\u5bf9\u5e94\u70b9\u6570\u91cf\uff0c\"(i, j), \" \u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u6700\u5927\u4e3a 6+10*2\uff0c\u52a0\u4e0a\u6700\u540e\u4e00\u4e2a\u7a7a\u5b57\u7b26 \\0 \u7684\u989d\u5916\u7a7a\u95f4\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
    iteration.kt
    /* \u53cc\u5c42 for \u5faa\u73af */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
    iteration.rb
    ### \u53cc\u5c42 for \u5faa\u73af ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u5faa\u73af i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u5faa\u73af j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
    iteration.zig
    // \u53cc\u5c42 for \u5faa\u73af\nfn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 {\n    var res = std.ArrayList(u8).init(allocator);\n    defer res.deinit();\n    var buffer: [20]u8 = undefined;\n    // \u5faa\u73af i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u5faa\u73af j = 1, 2, ..., n-1, n\n        for (1..n+1) |j| {\n            var _str = try std.fmt.bufPrint(&buffer, \"({d}, {d}), \", .{i, j});\n            try res.appendSlice(_str);\n        }\n    }\n    return res.toOwnedSlice();\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-2 \u662f\u8be5\u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe\u3002

    \u56fe 2-2 \u00a0 \u5d4c\u5957\u5faa\u73af\u7684\u6d41\u7a0b\u6846\u56fe

    \u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8bf4\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u548c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u5173\u7cfb\u201d\u3002

    \u6211\u4eec\u53ef\u4ee5\u7ee7\u7eed\u6dfb\u52a0\u5d4c\u5957\u5faa\u73af\uff0c\u6bcf\u4e00\u6b21\u5d4c\u5957\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7ef4\u201d\uff0c\u5c06\u4f1a\u4f7f\u65f6\u95f4\u590d\u6742\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u5173\u7cfb\u201d\u201c\u56db\u6b21\u65b9\u5173\u7cfb\u201d\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#222","title":"2.2.2 \u00a0 \u9012\u5f52","text":"

    \u9012\u5f52\uff08recursion\uff09\u662f\u4e00\u79cd\u7b97\u6cd5\u7b56\u7565\uff0c\u901a\u8fc7\u51fd\u6570\u8c03\u7528\u81ea\u8eab\u6765\u89e3\u51b3\u95ee\u9898\u3002\u5b83\u4e3b\u8981\u5305\u542b\u4e24\u4e2a\u9636\u6bb5\u3002

    1. \u9012\uff1a\u7a0b\u5e8f\u4e0d\u65ad\u6df1\u5165\u5730\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u4f20\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\uff0c\u76f4\u5230\u8fbe\u5230\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u3002
    2. \u5f52\uff1a\u89e6\u53d1\u201c\u7ec8\u6b62\u6761\u4ef6\u201d\u540e\uff0c\u7a0b\u5e8f\u4ece\u6700\u6df1\u5c42\u7684\u9012\u5f52\u51fd\u6570\u5f00\u59cb\u9010\u5c42\u8fd4\u56de\uff0c\u6c47\u805a\u6bcf\u4e00\u5c42\u7684\u7ed3\u679c\u3002

    \u800c\u4ece\u5b9e\u73b0\u7684\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u4ee3\u7801\u4e3b\u8981\u5305\u542b\u4e09\u4e2a\u8981\u7d20\u3002

    1. \u7ec8\u6b62\u6761\u4ef6\uff1a\u7528\u4e8e\u51b3\u5b9a\u4ec0\u4e48\u65f6\u5019\u7531\u201c\u9012\u201d\u8f6c\u201c\u5f52\u201d\u3002
    2. \u9012\u5f52\u8c03\u7528\uff1a\u5bf9\u5e94\u201c\u9012\u201d\uff0c\u51fd\u6570\u8c03\u7528\u81ea\u8eab\uff0c\u901a\u5e38\u8f93\u5165\u66f4\u5c0f\u6216\u66f4\u7b80\u5316\u7684\u53c2\u6570\u3002
    3. \u8fd4\u56de\u7ed3\u679c\uff1a\u5bf9\u5e94\u201c\u5f52\u201d\uff0c\u5c06\u5f53\u524d\u9012\u5f52\u5c42\u7ea7\u7684\u7ed3\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c42\u3002

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u53ea\u9700\u8c03\u7528\u51fd\u6570 recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8ba1\u7b97\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def recur(n: int) -> int:\n    \"\"\"\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 1:\n        return 1\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res = recur(n - 1)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n
    recursion.cpp
    /* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.java
    /* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.cs
    /* \u9012\u5f52 */\nint Recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = Recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.go
    /* \u9012\u5f52 */\nfunc recur(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    res := recur(n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
    recursion.swift
    /* \u9012\u5f52 */\nfunc recur(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n: n - 1)\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
    recursion.js
    /* \u9012\u5f52 */\nfunction recur(n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.ts
    /* \u9012\u5f52 */\nfunction recur(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 1) return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    const res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.dart
    /* \u9012\u5f52 */\nint recur(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 1) return 1;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  int res = recur(n - 1);\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  return n + res;\n}\n
    recursion.rs
    /* \u9012\u5f52 */\nfn recur(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    let res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    n + res\n}\n
    recursion.c
    /* \u9012\u5f52 */\nint recur(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    int res = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    recursion.kt
    /* \u9012\u5f52 */\nfun recur(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1)\n        return 1\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    val res = recur(n - 1)\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    return n + res\n}\n
    recursion.rb
    ### \u9012\u5f52 ###\ndef recur(n)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return 1 if n == 1\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  res = recur(n - 1)\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  n + res\nend\n
    recursion.zig
    // \u9012\u5f52\u51fd\u6570\nfn recur(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var res: i32 = recur(n - 1);\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    return n + res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-3 \u5c55\u793a\u4e86\u8be5\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b\u3002

    \u56fe 2-3 \u00a0 \u6c42\u548c\u51fd\u6570\u7684\u9012\u5f52\u8fc7\u7a0b

    \u867d\u7136\u4ece\u8ba1\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u4e0e\u9012\u5f52\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7ed3\u679c\uff0c\u4f46\u5b83\u4eec\u4ee3\u8868\u4e86\u4e24\u79cd\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u51b3\u95ee\u9898\u7684\u8303\u5f0f\u3002

    • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u4ece\u6700\u57fa\u7840\u7684\u6b65\u9aa4\u5f00\u59cb\uff0c\u7136\u540e\u4e0d\u65ad\u91cd\u590d\u6216\u7d2f\u52a0\u8fd9\u4e9b\u6b65\u9aa4\uff0c\u76f4\u5230\u4efb\u52a1\u5b8c\u6210\u3002
    • \u9012\u5f52\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u51b3\u95ee\u9898\u3002\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u8fd9\u4e9b\u5b50\u95ee\u9898\u548c\u539f\u95ee\u9898\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u6765\u5c06\u5b50\u95ee\u9898\u7ee7\u7eed\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u51b5\u65f6\u505c\u6b62\uff08\u57fa\u672c\u60c5\u51b5\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

    \u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u6570\u4e3a\u4f8b\uff0c\u8bbe\u95ee\u9898 \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

    • \u8fed\u4ee3\uff1a\u5728\u5faa\u73af\u4e2d\u6a21\u62df\u6c42\u548c\u8fc7\u7a0b\uff0c\u4ece \\(1\\) \u904d\u5386\u5230 \\(n\\) \uff0c\u6bcf\u8f6e\u6267\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
    • \u9012\u5f52\uff1a\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u5b50\u95ee\u9898 \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65ad\uff08\u9012\u5f52\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u51b5 \\(f(1) = 1\\) \u65f6\u7ec8\u6b62\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u8c03\u7528\u6808","text":"

    \u9012\u5f52\u51fd\u6570\u6bcf\u6b21\u8c03\u7528\u81ea\u8eab\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u4e3a\u65b0\u5f00\u542f\u7684\u51fd\u6570\u5206\u914d\u5185\u5b58\uff0c\u4ee5\u5b58\u50a8\u5c40\u90e8\u53d8\u91cf\u3001\u8c03\u7528\u5730\u5740\u548c\u5176\u4ed6\u4fe1\u606f\u7b49\u3002\u8fd9\u5c06\u5bfc\u81f4\u4e24\u65b9\u9762\u7684\u7ed3\u679c\u3002

    • \u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u90fd\u5b58\u50a8\u5728\u79f0\u4e3a\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u7684\u5185\u5b58\u533a\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u6570\u8fd4\u56de\u540e\u624d\u4f1a\u88ab\u91ca\u653e\u3002\u56e0\u6b64\uff0c\u9012\u5f52\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
    • \u9012\u5f52\u8c03\u7528\u51fd\u6570\u4f1a\u4ea7\u751f\u989d\u5916\u7684\u5f00\u9500\u3002\u56e0\u6b64\u9012\u5f52\u901a\u5e38\u6bd4\u5faa\u73af\u7684\u65f6\u95f4\u6548\u7387\u66f4\u4f4e\u3002

    \u5982\u56fe 2-4 \u6240\u793a\uff0c\u5728\u89e6\u53d1\u7ec8\u6b62\u6761\u4ef6\u524d\uff0c\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684\u9012\u5f52\u51fd\u6570\uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002

    \u56fe 2-4 \u00a0 \u9012\u5f52\u8c03\u7528\u6df1\u5ea6

    \u5728\u5b9e\u9645\u4e2d\uff0c\u7f16\u7a0b\u8bed\u8a00\u5141\u8bb8\u7684\u9012\u5f52\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u8fc7\u6df1\u7684\u9012\u5f52\u53ef\u80fd\u5bfc\u81f4\u6808\u6ea2\u51fa\u9519\u8bef\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2","title":"2. \u00a0 \u5c3e\u9012\u5f52","text":"

    \u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u6570\u5728\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u6b65\u624d\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5219\u8be5\u51fd\u6570\u53ef\u4ee5\u88ab\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u4f18\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u95f4\u6548\u7387\u4e0a\u4e0e\u8fed\u4ee3\u76f8\u5f53\u3002\u8fd9\u79cd\u60c5\u51b5\u88ab\u79f0\u4e3a\u5c3e\u9012\u5f52\uff08tail recursion\uff09\u3002

    • \u666e\u901a\u9012\u5f52\uff1a\u5f53\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u7684\u51fd\u6570\u540e\uff0c\u9700\u8981\u7ee7\u7eed\u6267\u884c\u4ee3\u7801\uff0c\u56e0\u6b64\u7cfb\u7edf\u9700\u8981\u4fdd\u5b58\u4e0a\u4e00\u5c42\u8c03\u7528\u7684\u4e0a\u4e0b\u6587\u3002
    • \u5c3e\u9012\u5f52\uff1a\u9012\u5f52\u8c03\u7528\u662f\u51fd\u6570\u8fd4\u56de\u524d\u7684\u6700\u540e\u4e00\u4e2a\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u51fd\u6570\u8fd4\u56de\u5230\u4e0a\u4e00\u5c42\u7ea7\u540e\uff0c\u65e0\u987b\u7ee7\u7eed\u6267\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7edf\u65e0\u987b\u4fdd\u5b58\u4e0a\u4e00\u5c42\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u3002

    \u4ee5\u8ba1\u7b97 \\(1 + 2 + \\dots + n\\) \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u7ed3\u679c\u53d8\u91cf res \u8bbe\u4e3a\u51fd\u6570\u53c2\u6570\uff0c\u4ece\u800c\u5b9e\u73b0\u5c3e\u9012\u5f52\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def tail_recur(n, res):\n    \"\"\"\u5c3e\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u9012\u5f52\u8c03\u7528\n    return tail_recur(n - 1, res + n)\n
    recursion.cpp
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.java
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.cs
    /* \u5c3e\u9012\u5f52 */\nint TailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return TailRecur(n - 1, res + n);\n}\n
    recursion.go
    /* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n int, res int) int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n-1, res+n)\n}\n
    recursion.swift
    /* \u5c3e\u9012\u5f52 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n: n - 1, res: res + n)\n}\n
    recursion.js
    /* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n, res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.ts
    /* \u5c3e\u9012\u5f52 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.dart
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u9012\u5f52\u8c03\u7528\n  return tailRecur(n - 1, res + n);\n}\n
    recursion.rs
    /* \u5c3e\u9012\u5f52 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    tail_recur(n - 1, res + n)\n}\n
    recursion.c
    /* \u5c3e\u9012\u5f52 */\nint tailRecur(int n, int res) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.kt
    /* \u5c3e\u9012\u5f52 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u6dfb\u52a0 tailrec \u5173\u952e\u8bcd\uff0c\u4ee5\u5f00\u542f\u5c3e\u9012\u5f52\u4f18\u5316\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n)\n}\n
    recursion.rb
    ### \u5c3e\u9012\u5f52 ###\ndef tail_recur(n, res)\n  # \u7ec8\u6b62\u6761\u4ef6\n  return res if n == 0\n  # \u5c3e\u9012\u5f52\u8c03\u7528\n  tail_recur(n - 1, res + n)\nend\n
    recursion.zig
    // \u5c3e\u9012\u5f52\u51fd\u6570\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u9012\u5f52\u8c03\u7528\n    return tailRecur(n - 1, res + n);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5c3e\u9012\u5f52\u7684\u6267\u884c\u8fc7\u7a0b\u5982\u56fe 2-5 \u6240\u793a\u3002\u5bf9\u6bd4\u666e\u901a\u9012\u5f52\u548c\u5c3e\u9012\u5f52\uff0c\u4e24\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u6267\u884c\u70b9\u662f\u4e0d\u540c\u7684\u3002

    • \u666e\u901a\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u6bcf\u5c42\u8fd4\u56de\u540e\u90fd\u8981\u518d\u6267\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
    • \u5c3e\u9012\u5f52\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u6267\u884c\u7684\uff0c\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u53ea\u9700\u5c42\u5c42\u8fd4\u56de\u3002

    \u56fe 2-5 \u00a0 \u5c3e\u9012\u5f52\u8fc7\u7a0b

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u8bb8\u591a\u7f16\u8bd1\u5668\u6216\u89e3\u91ca\u5668\u5e76\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\u3002\u4f8b\u5982\uff0cPython \u9ed8\u8ba4\u4e0d\u652f\u6301\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u6570\u662f\u5c3e\u9012\u5f52\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u4f1a\u9047\u5230\u6808\u6ea2\u51fa\u95ee\u9898\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u9012\u5f52\u6811","text":"

    \u5f53\u5904\u7406\u4e0e\u201c\u5206\u6cbb\u201d\u76f8\u5173\u7684\u7b97\u6cd5\u95ee\u9898\u65f6\uff0c\u9012\u5f52\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c2\u3001\u4ee3\u7801\u66f4\u52a0\u6613\u8bfb\u3002\u4ee5\u201c\u6590\u6ce2\u90a3\u5951\u6570\u5217\u201d\u4e3a\u4f8b\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6590\u6ce2\u90a3\u5951\u6570\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8be5\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u3002

    \u8bbe\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\u4e3a \\(f(n)\\) \uff0c\u6613\u5f97\u4e24\u4e2a\u7ed3\u8bba\u3002

    • \u6570\u5217\u7684\u524d\u4e24\u4e2a\u6570\u5b57\u4e3a \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
    • \u6570\u5217\u4e2d\u7684\u6bcf\u4e2a\u6570\u5b57\u662f\u524d\u4e24\u4e2a\u6570\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

    \u6309\u7167\u9012\u63a8\u5173\u7cfb\u8fdb\u884c\u9012\u5f52\u8c03\u7528\uff0c\u5c06\u524d\u4e24\u4e2a\u6570\u5b57\u4f5c\u4e3a\u7ec8\u6b62\u6761\u4ef6\uff0c\u4fbf\u53ef\u5199\u51fa\u9012\u5f52\u4ee3\u7801\u3002\u8c03\u7528 fib(n) \u5373\u53ef\u5f97\u5230\u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u7b2c \\(n\\) \u4e2a\u6570\u5b57\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def fib(n: int) -> int:\n    \"\"\"\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n
    recursion.cpp
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.java
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.cs
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint Fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.go
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n int) int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
    recursion.swift
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunc fib(n: Int) -> Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
    recursion.js
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.ts
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfunction fib(n: number): number {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.dart
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n  // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7ed3\u679c f(n)\n  return res;\n}\n
    recursion.rs
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfn fib(n: i32) -> i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c\n    res\n}\n
    recursion.c
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nint fib(int n) {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    recursion.kt
    /* \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 */\nfun fib(n: Int): Int {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res\n}\n
    recursion.rb
    ### \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\u9012\u5f52 ###\ndef fib(n)\n  # \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7ed3\u679c f(n)\n  res\nend\n
    recursion.zig
    // \u6590\u6ce2\u90a3\u5951\u6570\u5217\nfn fib(n: i32) i32 {\n    // \u7ec8\u6b62\u6761\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u9012\u5f52\u8c03\u7528 f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7ed3\u679c f(n)\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u6211\u4eec\u5728\u51fd\u6570\u5185\u9012\u5f52\u8c03\u7528\u4e86\u4e24\u4e2a\u51fd\u6570\uff0c\u8fd9\u610f\u5473\u7740\u4ece\u4e00\u4e2a\u8c03\u7528\u4ea7\u751f\u4e86\u4e24\u4e2a\u8c03\u7528\u5206\u652f\u3002\u5982\u56fe 2-6 \u6240\u793a\uff0c\u8fd9\u6837\u4e0d\u65ad\u9012\u5f52\u8c03\u7528\u4e0b\u53bb\uff0c\u6700\u7ec8\u5c06\u4ea7\u751f\u4e00\u68f5\u5c42\u6570\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff08recursion tree\uff09\u3002

    \u56fe 2-6 \u00a0 \u6590\u6ce2\u90a3\u5951\u6570\u5217\u7684\u9012\u5f52\u6811

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9012\u5f52\u4f53\u73b0\u4e86\u201c\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u66f4\u5c0f\u5b50\u95ee\u9898\u201d\u7684\u601d\u7ef4\u8303\u5f0f\uff0c\u8fd9\u79cd\u5206\u6cbb\u7b56\u7565\u81f3\u5173\u91cd\u8981\u3002

    • \u4ece\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u7d22\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u7b49\u8bb8\u591a\u91cd\u8981\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u95f4\u63a5\u5730\u5e94\u7528\u4e86\u8fd9\u79cd\u601d\u7ef4\u65b9\u5f0f\u3002
    • \u4ece\u6570\u636e\u7ed3\u6784\u89d2\u5ea6\u770b\uff0c\u9012\u5f52\u5929\u7136\u9002\u5408\u5904\u7406\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u76f8\u5173\u95ee\u9898\uff0c\u56e0\u4e3a\u5b83\u4eec\u975e\u5e38\u9002\u5408\u7528\u5206\u6cbb\u601d\u60f3\u8fdb\u884c\u5206\u6790\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u4e24\u8005\u5bf9\u6bd4","text":"

    \u603b\u7ed3\u4ee5\u4e0a\u5185\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5b9e\u73b0\u3001\u6027\u80fd\u548c\u9002\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

    \u8868 2-1 \u00a0 \u8fed\u4ee3\u4e0e\u9012\u5f52\u7279\u70b9\u5bf9\u6bd4

    \u8fed\u4ee3 \u9012\u5f52 \u5b9e\u73b0\u65b9\u5f0f \u5faa\u73af\u7ed3\u6784 \u51fd\u6570\u8c03\u7528\u81ea\u8eab \u65f6\u95f4\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f83\u9ad8\uff0c\u65e0\u51fd\u6570\u8c03\u7528\u5f00\u9500 \u6bcf\u6b21\u51fd\u6570\u8c03\u7528\u90fd\u4f1a\u4ea7\u751f\u5f00\u9500 \u5185\u5b58\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u5185\u5b58\u7a7a\u95f4 \u7d2f\u79ef\u51fd\u6570\u8c03\u7528\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u6808\u5e27\u7a7a\u95f4 \u9002\u7528\u95ee\u9898 \u9002\u7528\u4e8e\u7b80\u5355\u5faa\u73af\u4efb\u52a1\uff0c\u4ee3\u7801\u76f4\u89c2\u3001\u53ef\u8bfb\u6027\u597d \u9002\u7528\u4e8e\u5b50\u95ee\u9898\u5206\u89e3\uff0c\u5982\u6811\u3001\u56fe\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u4ee3\u7801\u7ed3\u6784\u7b80\u6d01\u3001\u6e05\u6670

    Tip

    \u5982\u679c\u611f\u89c9\u4ee5\u4e0b\u5185\u5bb9\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5728\u8bfb\u5b8c\u201c\u6808\u201d\u7ae0\u8282\u540e\u518d\u6765\u590d\u4e60\u3002

    \u90a3\u4e48\uff0c\u8fed\u4ee3\u548c\u9012\u5f52\u5177\u6709\u4ec0\u4e48\u5185\u5728\u8054\u7cfb\u5462\uff1f\u4ee5\u4e0a\u8ff0\u9012\u5f52\u51fd\u6570\u4e3a\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u9012\u5f52\u7684\u201c\u5f52\u201d\u9636\u6bb5\u8fdb\u884c\u3002\u8fd9\u610f\u5473\u7740\u6700\u521d\u88ab\u8c03\u7528\u7684\u51fd\u6570\u5b9e\u9645\u4e0a\u662f\u6700\u540e\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u8fd9\u79cd\u5de5\u4f5c\u673a\u5236\u4e0e\u6808\u7684\u201c\u5148\u5165\u540e\u51fa\u201d\u539f\u5219\u5f02\u66f2\u540c\u5de5\u3002

    \u4e8b\u5b9e\u4e0a\uff0c\u201c\u8c03\u7528\u6808\u201d\u548c\u201c\u6808\u5e27\u7a7a\u95f4\u201d\u8fd9\u7c7b\u9012\u5f52\u672f\u8bed\u5df2\u7ecf\u6697\u793a\u4e86\u9012\u5f52\u4e0e\u6808\u4e4b\u95f4\u7684\u5bc6\u5207\u5173\u7cfb\u3002

    1. \u9012\uff1a\u5f53\u51fd\u6570\u88ab\u8c03\u7528\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5728\u201c\u8c03\u7528\u6808\u201d\u4e0a\u4e3a\u8be5\u51fd\u6570\u5206\u914d\u65b0\u7684\u6808\u5e27\uff0c\u7528\u4e8e\u5b58\u50a8\u51fd\u6570\u7684\u5c40\u90e8\u53d8\u91cf\u3001\u53c2\u6570\u3001\u8fd4\u56de\u5730\u5740\u7b49\u6570\u636e\u3002
    2. \u5f52\uff1a\u5f53\u51fd\u6570\u5b8c\u6210\u6267\u884c\u5e76\u8fd4\u56de\u65f6\uff0c\u5bf9\u5e94\u7684\u6808\u5e27\u4f1a\u88ab\u4ece\u201c\u8c03\u7528\u6808\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u590d\u4e4b\u524d\u51fd\u6570\u7684\u6267\u884c\u73af\u5883\u3002

    \u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u8c03\u7528\u6808\u7684\u884c\u4e3a\uff0c\u4ece\u800c\u5c06\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u5f62\u5f0f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\"\"\"\n    # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack = []\n    res = 0\n    # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in range(n, 0, -1):\n        # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while stack:\n        # \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
    recursion.cpp
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack<int> stack;\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.empty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.java
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (!stack.isEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.cs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    Stack<int> stack = new();\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.Push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.Count > 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.go
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    stack := list.New()\n    res := 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i := n; i > 0; i-- {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.PushBack(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    for stack.Len() != 0 {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.swift
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [Int] = []\n    var res = 0\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1 ... n).reversed() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.append(i)\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.isEmpty {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.js
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    const stack = [];\n    let res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.ts
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808 \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (let i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (stack.length) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.dart
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  List<int> stack = [];\n  int res = 0;\n  // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for (int i = n; i > 0; i--) {\n    // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack.add(i);\n  }\n  // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while (!stack.isEmpty) {\n    // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
    recursion.rs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for i in (1..=n).rev() {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i);\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while !stack.is_empty() {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
    recursion.c
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u501f\u52a9\u4e00\u4e2a\u5927\u6570\u7ec4\u6765\u6a21\u62df\u6808\n    int top = -1;    // \u6808\u9876\u7d22\u5f15\n    int res = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    for (int i = n; i > 0; i--) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack[1 + top++] = i;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    while (top >= 0) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.kt
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    val stack = Stack<Int>()\n    var res = 0\n    // \u9012: \u9012\u5f52\u8c03\u7528\n    for (i in n downTo 0) {\n        // \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n        stack.push(i)\n    }\n    // \u5f52: \u8fd4\u56de\u7ed3\u679c\n    while (stack.isNotEmpty()) {\n        // \u901a\u8fc7\u201c\u51fa\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u5f52\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.rb
    ### \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n  stack = []\n  res = 0\n\n  # \u9012\uff1a\u9012\u5f52\u8c03\u7528\n  for i in n.downto(0)\n    # \u901a\u8fc7\u201c\u5165\u6808\u64cd\u4f5c\u201d\u6a21\u62df\u201c\u9012\u201d\n    stack << i\n  end\n  # \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
    recursion.zig
    // \u4f7f\u7528\u8fed\u4ee3\u6a21\u62df\u9012\u5f52\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u4e2a\u663e\u5f0f\u7684\u6808\u6765\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u9012\uff1a\u9012\u5f52\u8c03\u7528\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u5f52\uff1a\u8fd4\u56de\u7ed3\u679c\n    var index: usize = n;\n    while (index > 0) {\n        index -= 1;\n        res += stack[index];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u5f53\u9012\u5f52\u8f6c\u5316\u4e3a\u8fed\u4ee3\u540e\uff0c\u4ee3\u7801\u53d8\u5f97\u66f4\u52a0\u590d\u6742\u4e86\u3002\u5c3d\u7ba1\u8fed\u4ee3\u548c\u9012\u5f52\u5728\u5f88\u591a\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f6c\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u8fd9\u6837\u505a\uff0c\u6709\u4ee5\u4e0b\u4e24\u70b9\u539f\u56e0\u3002

    • \u8f6c\u5316\u540e\u7684\u4ee3\u7801\u53ef\u80fd\u66f4\u52a0\u96be\u4ee5\u7406\u89e3\uff0c\u53ef\u8bfb\u6027\u66f4\u5dee\u3002
    • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u6a21\u62df\u7cfb\u7edf\u8c03\u7528\u6808\u7684\u884c\u4e3a\u53ef\u80fd\u975e\u5e38\u56f0\u96be\u3002

    \u603b\u4e4b\uff0c\u9009\u62e9\u8fed\u4ee3\u8fd8\u662f\u9012\u5f52\u53d6\u51b3\u4e8e\u7279\u5b9a\u95ee\u9898\u7684\u6027\u8d28\u3002\u5728\u7f16\u7a0b\u5b9e\u8df5\u4e2d\uff0c\u6743\u8861\u4e24\u8005\u7684\u4f18\u52a3\u5e76\u6839\u636e\u60c5\u5883\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\u81f3\u5173\u91cd\u8981\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30","text":"

    \u5728\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u8ffd\u6c42\u4ee5\u4e0b\u4e24\u4e2a\u5c42\u9762\u7684\u76ee\u6807\u3002

    1. \u627e\u5230\u95ee\u9898\u89e3\u6cd5\uff1a\u7b97\u6cd5\u9700\u8981\u5728\u89c4\u5b9a\u7684\u8f93\u5165\u8303\u56f4\u5185\u53ef\u9760\u5730\u6c42\u5f97\u95ee\u9898\u7684\u6b63\u786e\u89e3\u3002
    2. \u5bfb\u6c42\u6700\u4f18\u89e3\u6cd5\uff1a\u540c\u4e00\u4e2a\u95ee\u9898\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u89e3\u6cd5\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u5c3d\u53ef\u80fd\u9ad8\u6548\u7684\u7b97\u6cd5\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5728\u80fd\u591f\u89e3\u51b3\u95ee\u9898\u7684\u524d\u63d0\u4e0b\uff0c\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u4e3a\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u4e24\u4e2a\u7ef4\u5ea6\u3002

    • \u65f6\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u7684\u957f\u77ed\u3002
    • \u7a7a\u95f4\u6548\u7387\uff1a\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u7684\u5927\u5c0f\u3002

    \u7b80\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u7684\u76ee\u6807\u662f\u8bbe\u8ba1\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u53ea\u6709\u8fd9\u6837\uff0c\u6211\u4eec\u624d\u80fd\u5c06\u5404\u79cd\u7b97\u6cd5\u8fdb\u884c\u5bf9\u6bd4\uff0c\u8fdb\u800c\u6307\u5bfc\u7b97\u6cd5\u8bbe\u8ba1\u4e0e\u4f18\u5316\u8fc7\u7a0b\u3002

    \u6548\u7387\u8bc4\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u4e3a\u4e24\u79cd\uff1a\u5b9e\u9645\u6d4b\u8bd5\u3001\u7406\u8bba\u4f30\u7b97\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5b9e\u9645\u6d4b\u8bd5","text":"

    \u5047\u8bbe\u6211\u4eec\u73b0\u5728\u6709\u7b97\u6cd5 A \u548c\u7b97\u6cd5 B \uff0c\u5b83\u4eec\u90fd\u80fd\u89e3\u51b3\u540c\u4e00\u95ee\u9898\uff0c\u73b0\u5728\u9700\u8981\u5bf9\u6bd4\u8fd9\u4e24\u4e2a\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u53f0\u8ba1\u7b97\u673a\uff0c\u8fd0\u884c\u8fd9\u4e24\u4e2a\u7b97\u6cd5\uff0c\u5e76\u76d1\u63a7\u8bb0\u5f55\u5b83\u4eec\u7684\u8fd0\u884c\u65f6\u95f4\u548c\u5185\u5b58\u5360\u7528\u60c5\u51b5\u3002\u8fd9\u79cd\u8bc4\u4f30\u65b9\u5f0f\u80fd\u591f\u53cd\u6620\u771f\u5b9e\u60c5\u51b5\uff0c\u4f46\u4e5f\u5b58\u5728\u8f83\u5927\u7684\u5c40\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u96be\u4ee5\u6392\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5e72\u6270\u56e0\u7d20\u3002\u786c\u4ef6\u914d\u7f6e\u4f1a\u5f71\u54cd\u7b97\u6cd5\u7684\u6027\u80fd\u8868\u73b0\u3002\u6bd4\u5982\u4e00\u4e2a\u7b97\u6cd5\u7684\u5e76\u884c\u5ea6\u8f83\u9ad8\uff0c\u90a3\u4e48\u5b83\u5c31\u66f4\u9002\u5408\u5728\u591a\u6838 CPU \u4e0a\u8fd0\u884c\uff0c\u4e00\u4e2a\u7b97\u6cd5\u7684\u5185\u5b58\u64cd\u4f5c\u5bc6\u96c6\uff0c\u90a3\u4e48\u5b83\u5728\u9ad8\u6027\u80fd\u5185\u5b58\u4e0a\u7684\u8868\u73b0\u5c31\u4f1a\u66f4\u597d\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u7b97\u6cd5\u5728\u4e0d\u540c\u7684\u673a\u5668\u4e0a\u7684\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\u662f\u4e0d\u4e00\u81f4\u7684\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u9700\u8981\u5728\u5404\u79cd\u673a\u5668\u4e0a\u8fdb\u884c\u6d4b\u8bd5\uff0c\u7edf\u8ba1\u5e73\u5747\u6548\u7387\uff0c\u800c\u8fd9\u662f\u4e0d\u73b0\u5b9e\u7684\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u5f00\u5b8c\u6574\u6d4b\u8bd5\u975e\u5e38\u8017\u8d39\u8d44\u6e90\u3002\u968f\u7740\u8f93\u5165\u6570\u636e\u91cf\u7684\u53d8\u5316\uff0c\u7b97\u6cd5\u4f1a\u8868\u73b0\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f93\u5165\u6570\u636e\u91cf\u8f83\u5927\u65f6\uff0c\u6d4b\u8bd5\u7ed3\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u4e3a\u4e86\u5f97\u5230\u6709\u8bf4\u670d\u529b\u7684\u7ed3\u8bba\uff0c\u6211\u4eec\u9700\u8981\u6d4b\u8bd5\u5404\u79cd\u89c4\u6a21\u7684\u8f93\u5165\u6570\u636e\uff0c\u800c\u8fd9\u9700\u8981\u8017\u8d39\u5927\u91cf\u7684\u8ba1\u7b97\u8d44\u6e90\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2 \u00a0 \u7406\u8bba\u4f30\u7b97","text":"

    \u7531\u4e8e\u5b9e\u9645\u6d4b\u8bd5\u5177\u6709\u8f83\u5927\u7684\u5c40\u9650\u6027\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u4ec5\u901a\u8fc7\u4e00\u4e9b\u8ba1\u7b97\u6765\u8bc4\u4f30\u7b97\u6cd5\u7684\u6548\u7387\u3002\u8fd9\u79cd\u4f30\u7b97\u65b9\u6cd5\u88ab\u79f0\u4e3a\u6e10\u8fd1\u590d\u6742\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7b80\u79f0\u590d\u6742\u5ea6\u5206\u6790\u3002

    \u590d\u6742\u5ea6\u5206\u6790\u80fd\u591f\u4f53\u73b0\u7b97\u6cd5\u8fd0\u884c\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e4b\u95f4\u7684\u5173\u7cfb\u3002\u5b83\u63cf\u8ff0\u4e86\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u7b97\u6cd5\u6267\u884c\u6240\u9700\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u5b9a\u4e49\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u5206\u4e3a\u4e09\u4e2a\u91cd\u70b9\u6765\u7406\u89e3\u3002

    • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\u201d\u5206\u522b\u5bf9\u5e94\u65f6\u95f4\u590d\u6742\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u3002
    • \u201c\u968f\u7740\u8f93\u5165\u6570\u636e\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u7740\u590d\u6742\u5ea6\u53cd\u6620\u4e86\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u4e0e\u8f93\u5165\u6570\u636e\u4f53\u91cf\u4e4b\u95f4\u7684\u5173\u7cfb\u3002
    • \u201c\u65f6\u95f4\u548c\u7a7a\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u201d\u8868\u793a\u590d\u6742\u5ea6\u5206\u6790\u5173\u6ce8\u7684\u4e0d\u662f\u8fd0\u884c\u65f6\u95f4\u6216\u5360\u7528\u7a7a\u95f4\u7684\u5177\u4f53\u503c\uff0c\u800c\u662f\u65f6\u95f4\u6216\u7a7a\u95f4\u589e\u957f\u7684\u201c\u5feb\u6162\u201d\u3002

    \u590d\u6742\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5b9e\u9645\u6d4b\u8bd5\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u4f53\u73b0\u5728\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u3002

    • \u5b83\u65e0\u9700\u5b9e\u9645\u8fd0\u884c\u4ee3\u7801\uff0c\u66f4\u52a0\u7eff\u8272\u8282\u80fd\u3002
    • \u5b83\u72ec\u7acb\u4e8e\u6d4b\u8bd5\u73af\u5883\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\u3002
    • \u5b83\u53ef\u4ee5\u4f53\u73b0\u4e0d\u540c\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u6570\u636e\u91cf\u4e0b\u7684\u7b97\u6cd5\u6027\u80fd\u3002

    Tip

    \u5982\u679c\u4f60\u4ecd\u5bf9\u590d\u6742\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u65e0\u987b\u62c5\u5fc3\uff0c\u6211\u4eec\u4f1a\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\u3002

    \u590d\u6742\u5ea6\u5206\u6790\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u628a\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6807\u5c3a\u201d\uff0c\u4f7f\u6211\u4eec\u53ef\u4ee5\u8861\u91cf\u6267\u884c\u67d0\u4e2a\u7b97\u6cd5\u6240\u9700\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u8d44\u6e90\uff0c\u5bf9\u6bd4\u4e0d\u540c\u7b97\u6cd5\u4e4b\u95f4\u7684\u6548\u7387\u3002

    \u590d\u6742\u5ea6\u662f\u4e2a\u6570\u5b66\u6982\u5ff5\uff0c\u5bf9\u4e8e\u521d\u5b66\u8005\u53ef\u80fd\u6bd4\u8f83\u62bd\u8c61\uff0c\u5b66\u4e60\u96be\u5ea6\u76f8\u5bf9\u8f83\u9ad8\u3002\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u770b\uff0c\u590d\u6742\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9002\u5408\u4f5c\u4e3a\u6700\u5148\u4ecb\u7ecd\u7684\u5185\u5bb9\u3002\u7136\u800c\uff0c\u5f53\u6211\u4eec\u8ba8\u8bba\u67d0\u4e2a\u6570\u636e\u7ed3\u6784\u6216\u7b97\u6cd5\u7684\u7279\u70b9\u65f6\uff0c\u96be\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u8fd0\u884c\u901f\u5ea6\u548c\u7a7a\u95f4\u4f7f\u7528\u60c5\u51b5\u3002

    \u7efc\u4e0a\u6240\u8ff0\uff0c\u5efa\u8bae\u4f60\u5728\u6df1\u5165\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5bf9\u590d\u6742\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u4e86\u89e3\uff0c\u4ee5\u4fbf\u80fd\u591f\u5b8c\u6210\u7b80\u5355\u7b97\u6cd5\u7684\u590d\u6742\u5ea6\u5206\u6790\u3002

    "},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u95f4\u590d\u6742\u5ea6","text":"

    \u7a7a\u95f4\u590d\u6742\u5ea6\uff08space complexity\uff09\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002\u8fd9\u4e2a\u6982\u5ff5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u5e38\u7c7b\u4f3c\uff0c\u53ea\u9700\u5c06\u201c\u8fd0\u884c\u65f6\u95f4\u201d\u66ff\u6362\u4e3a\u201c\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u201d\u3002

    "},{"location":"chapter_computational_complexity/space_complexity/#241","title":"2.4.1 \u00a0 \u7b97\u6cd5\u76f8\u5173\u7a7a\u95f4","text":"

    \u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

    • \u8f93\u5165\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u5165\u6570\u636e\u3002
    • \u6682\u5b58\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u53d8\u91cf\u3001\u5bf9\u8c61\u3001\u51fd\u6570\u4e0a\u4e0b\u6587\u7b49\u6570\u636e\u3002
    • \u8f93\u51fa\u7a7a\u95f4\uff1a\u7528\u4e8e\u5b58\u50a8\u7b97\u6cd5\u7684\u8f93\u51fa\u6570\u636e\u3002

    \u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u7edf\u8ba1\u8303\u56f4\u662f\u201c\u6682\u5b58\u7a7a\u95f4\u201d\u52a0\u4e0a\u201c\u8f93\u51fa\u7a7a\u95f4\u201d\u3002

    \u6682\u5b58\u7a7a\u95f4\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

    • \u6682\u5b58\u6570\u636e\uff1a\u7528\u4e8e\u4fdd\u5b58\u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u5404\u79cd\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u7b49\u3002
    • \u6808\u5e27\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u8c03\u7528\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u6570\u636e\u3002\u7cfb\u7edf\u5728\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\u90fd\u4f1a\u5728\u6808\u9876\u90e8\u521b\u5efa\u4e00\u4e2a\u6808\u5e27\uff0c\u51fd\u6570\u8fd4\u56de\u540e\uff0c\u6808\u5e27\u7a7a\u95f4\u4f1a\u88ab\u91ca\u653e\u3002
    • \u6307\u4ee4\u7a7a\u95f4\uff1a\u7528\u4e8e\u4fdd\u5b58\u7f16\u8bd1\u540e\u7684\u7a0b\u5e8f\u6307\u4ee4\uff0c\u5728\u5b9e\u9645\u7edf\u8ba1\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8ba1\u3002

    \u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5e8f\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u7edf\u8ba1\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u8f93\u51fa\u6570\u636e\u4e09\u90e8\u5206\uff0c\u5982\u56fe 2-15 \u6240\u793a\u3002

    \u56fe 2-15 \u00a0 \u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u5173\u7a7a\u95f4

    \u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class Node:\n    \"\"\"\u7c7b\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u8282\u70b9\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f93\u5165\u6570\u636e\n    A = 0                 # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff0c\u4e00\u822c\u7528\u5927\u5199\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node(0)        # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function()        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return A + b + c      # \u8f93\u51fa\u6570\u636e\n
    /* \u7ed3\u6784\u4f53 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node* node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = func();           // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    final int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f93\u5165\u6570\u636e\n    const int a = 0;          // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    Node node = new(0);       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    int c = Function();       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7ed3\u6784\u4f53 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u521b\u5efa node \u7ed3\u6784\u4f53  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f93\u5165\u6570\u636e\n    const a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b := 0                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    newNode(0)              // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c := function()         // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c        // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u6570 */\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f93\u5165\u6570\u636e\n    let a = 0             // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0             // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node(x: 0) // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function()    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c      // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f93\u5165\u6570\u636e\n    const a = 0;              // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0); // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;         // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f93\u5165\u6570\u636e\n    const a = 0;                        // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let b = 0;                          // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    const node = new Node(0);           // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    const c = constFunc();              // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;                   // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f93\u5165\u6570\u636e\n  const int a = 0;      // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n  int b = 0;            // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n  Node node = Node(0);  // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n  int c = function();   // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n  return a + b + c;     // \u8f93\u51fa\u6570\u636e\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7ed3\u6784\u4f53 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u521b\u5efa Node \u7ed3\u6784\u4f53 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u6570 */\nfn function() -> i32 {      \n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f93\u5165\u6570\u636e\n    const a: i32 = 0;               // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    let mut b = 0;                  // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    let node = Node::new(0);        // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    let c = function();             // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;               // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f93\u5165\u6570\u636e\n    const int a = 0;   // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    int b = 0;         // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    int c = func();    // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c;  // \u8f93\u51fa\u6570\u636e\n}\n
    /* \u7c7b */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f93\u5165\u6570\u636e\n    val a = 0                // \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    var b = 0                // \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    val node = Node(0)       // \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    val c = function()       // \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    return a + b + c         // \u8f93\u51fa\u6570\u636e\n}\n
    ### \u7c7b ###\nclass Node\n    attr_accessor :val      # \u8282\u70b9\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u8282\u70b9\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u6570 ###\ndef function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f93\u5165\u6570\u636e\n    a = 0               # \u6682\u5b58\u6570\u636e\uff08\u5e38\u91cf\uff09\n    b = 0               # \u6682\u5b58\u6570\u636e\uff08\u53d8\u91cf\uff09\n    node = Node.new(0)  # \u6682\u5b58\u6570\u636e\uff08\u5bf9\u8c61\uff09\n    c = function        # \u6808\u5e27\u7a7a\u95f4\uff08\u8c03\u7528\u51fd\u6570\uff09\n    a + b + c           # \u8f93\u51fa\u6570\u636e\nend\n
    \n
    "},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

    \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c06\u7edf\u8ba1\u5bf9\u8c61\u4ece\u201c\u64cd\u4f5c\u6570\u91cf\u201d\u8f6c\u4e3a\u201c\u4f7f\u7528\u7a7a\u95f4\u5927\u5c0f\u201d\u3002

    \u800c\u4e0e\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u3002\u8fd9\u662f\u56e0\u4e3a\u5185\u5b58\u7a7a\u95f4\u662f\u4e00\u9879\u786c\u6027\u8981\u6c42\uff0c\u6211\u4eec\u5fc5\u987b\u786e\u4fdd\u5728\u6240\u6709\u8f93\u5165\u6570\u636e\u4e0b\u90fd\u6709\u8db3\u591f\u7684\u5185\u5b58\u7a7a\u95f4\u9884\u7559\u3002

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u4e24\u5c42\u542b\u4e49\u3002

    1. \u4ee5\u6700\u5dee\u8f93\u5165\u6570\u636e\u4e3a\u51c6\uff1a\u5f53 \\(n < 10\\) \u65f6\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1b\u4f46\u5f53 \\(n > 10\\) \u65f6\uff0c\u521d\u59cb\u5316\u7684\u6570\u7ec4 nums \u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
    2. \u4ee5\u7b97\u6cd5\u8fd0\u884c\u4e2d\u7684\u5cf0\u503c\u5185\u5b58\u4e3a\u51c6\uff1a\u4f8b\u5982\uff0c\u7a0b\u5e8f\u5728\u6267\u884c\u6700\u540e\u4e00\u884c\u4e4b\u524d\uff0c\u5360\u7528 \\(O(1)\\) \u7a7a\u95f4\uff1b\u5f53\u521d\u59cb\u5316\u6570\u7ec4 nums \u65f6\uff0c\u7a0b\u5e8f\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
    void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
    void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
    void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
    func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
    func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
    function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
    function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
    void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
    fn algorithm(n: i32) {\n    let a = 0;                              // O(1)\n    let b = [0; 10000];                     // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];     // O(n)\n    }\n}\n
    void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
    fun algorithm(n: Int) {\n    val a = 0                    // O(1)\n    val b = IntArray(10000)      // O(1)\n    if (n > 10) {\n        val nums = IntArray(n)   // O(n)\n    }\n}\n
    def algorithm(n)\n    a = 0                           # O(1)\n    b = Array.new(10000)            # O(1)\n    nums = Array.new(n) if n > 10   # O(n)\nend\n
    \n

    \u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7edf\u8ba1\u6808\u5e27\u7a7a\u95f4\u3002\u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def function() -> int:\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
    int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
    func function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
    @discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
    function constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    function constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
    fn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
    int func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    fun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
    def function\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u5faa\u73af\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
    \n

    \u51fd\u6570 loop() \u548c recur() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u4f46\u7a7a\u95f4\u590d\u6742\u5ea6\u4e0d\u540c\u3002

    • \u51fd\u6570 loop() \u5728\u5faa\u73af\u4e2d\u8c03\u7528\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f6e\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u5e76\u91ca\u653e\u4e86\u6808\u5e27\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \u3002
    • \u9012\u5f52\u51fd\u6570 recur() \u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u4f1a\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 recur() \uff0c\u4ece\u800c\u5360\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002
    "},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

    \u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u56fe 2-16 \u5c55\u793a\u4e86\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\uff08\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\uff09\u3002

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} \\end{aligned} \\]

    \u56fe 2-16 \u00a0 \u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

    "},{"location":"chapter_computational_complexity/space_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

    \u5e38\u6570\u9636\u5e38\u89c1\u4e8e\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u7684\u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u5faa\u73af\u4e2d\u521d\u59cb\u5316\u53d8\u91cf\u6216\u8c03\u7528\u51fd\u6570\u800c\u5360\u7528\u7684\u5185\u5b58\uff0c\u5728\u8fdb\u5165\u4e0b\u4e00\u5faa\u73af\u540e\u5c31\u4f1a\u88ab\u91ca\u653e\uff0c\u56e0\u6b64\u4e0d\u4f1a\u7d2f\u79ef\u5360\u7528\u7a7a\u95f4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def function() -> int:\n    \"\"\"\u51fd\u6570\"\"\"\n    # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        c = 0\n    # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in range(n):\n        function()\n
    space_complexity.cpp
    /* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.java
    /* \u51fd\u6570 */\nint function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
    space_complexity.cs
    /* \u51fd\u6570 */\nint Function() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid Constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
    space_complexity.go
    /* \u51fd\u6570 */\nfunc function() int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc spaceConstant(n int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
    space_complexity.swift
    /* \u51fd\u6570 */\n@discardableResult\nfunc function() -> Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfunc constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
    space_complexity.js
    /* \u51fd\u6570 */\nfunction constFunc() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.ts
    /* \u51fd\u6570 */\nfunction constFunc(): number {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nfunction constant(n: number): void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.dart
    /* \u51fd\u6570 */\nint function() {\n  // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n  // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
    space_complexity.rs
    /* \u51fd\u6570 */\nfn function() -> i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for i in 0..n {\n        function();\n    }\n}\n
    space_complexity.c
    /* \u51fd\u6570 */\nint func() {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6570\u9636 */\nvoid constant(int n) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.kt
    /* \u51fd\u6570 */\nfun function(): Int {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6570\u9636 */\nfun constant(n: Int) {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    for (i in 0..<n) {\n        function()\n    }\n}\n
    space_complexity.rb
    ### \u51fd\u6570 ###\ndef function\n  # \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6570\u9636 ###\ndef constant(n)\n  # \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { c = 0 }\n  # \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n  (0...n).each { function }\nend\n
    space_complexity.zig
    // \u51fd\u6570\nfn function() i32 {\n    // \u6267\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6570\u9636\nfn constant(n: i32) void {\n    // \u5e38\u91cf\u3001\u53d8\u91cf\u3001\u5bf9\u8c61\u5360\u7528 O(1) \u7a7a\u95f4\n    const a: i32 = 0;\n    var b: i32 = 0;\n    var nums = [_]i32{0}**10000;\n    var node = inc.ListNode(i32){.val = 0};\n    var i: i32 = 0;\n    // \u5faa\u73af\u4e2d\u7684\u53d8\u91cf\u5360\u7528 O(1) \u7a7a\u95f4\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u5faa\u73af\u4e2d\u7684\u51fd\u6570\u5360\u7528 O(1) \u7a7a\u95f4\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_computational_complexity/space_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

    \u7ebf\u6027\u9636\u5e38\u89c1\u4e8e\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u6b63\u6bd4\u7684\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u7b49\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def linear(n: int):\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    nums = [0] * n\n    # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
    space_complexity.cpp
    /* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<int> nums(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
    space_complexity.java
    /* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
    space_complexity.cs
    /* \u7ebf\u6027\u9636 */\nvoid Linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int[] nums = new int[n];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
    space_complexity.go
    /* \u7ebf\u6027\u9636 */\nfunc spaceLinear(n int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    _ = make([]int, n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
    space_complexity.swift
    /* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let nums = Array(repeating: 0, count: n)\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
    space_complexity.js
    /* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
    space_complexity.ts
    /* \u7ebf\u6027\u9636 */\nfunction linear(n: number): void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    const nums = new Array(n);\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
    space_complexity.dart
    /* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n  // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n  List<int> nums = List.filled(n, 0);\n  // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
    space_complexity.rs
    /* \u7ebf\u6027\u9636 */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nums = vec![0; n as usize];\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
    space_complexity.c
    /* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u7ebf\u6027\u9636 */\nvoid linear(int n) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
    space_complexity.kt
    /* \u7ebf\u6027\u9636 */\nfun linear(n: Int) {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    val nums = Array(n) { 0 }\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
    space_complexity.rb
    ### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  # \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  nums = Array.new(n, 0)\n\n  # \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
    space_complexity.zig
    // \u7ebf\u6027\u9636\nfn linear(comptime n: i32) !void {\n    // \u957f\u5ea6\u4e3a n \u7684\u6570\u7ec4\u5360\u7528 O(n) \u7a7a\u95f4\n    var nums = [_]i32{0}**n;\n    // \u957f\u5ea6\u4e3a n \u7684\u5217\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var nodes = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        try nodes.append(i);\n    }\n    // \u957f\u5ea6\u4e3a n \u7684\u54c8\u5e0c\u8868\u5360\u7528 O(n) \u7a7a\u95f4\n    var map = std.AutoArrayHashMap(i32, []const u8).init(std.heap.page_allocator);\n    defer map.deinit();\n    var j: i32 = 0;\n    while (j < n) : (j += 1) {\n        const string = try std.fmt.allocPrint(std.heap.page_allocator, \"{d}\", .{j});\n        defer std.heap.page_allocator.free(string);\n        try map.put(i, string);\n    }\n    _ = nums;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5373\u540c\u65f6\u5b58\u5728 \\(n\\) \u4e2a\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u6570\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def linear_recur(n: int):\n    \"\"\"\u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    print(\"\u9012\u5f52 n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
    space_complexity.cpp
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    cout << \"\u9012\u5f52 n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.java
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    System.out.println(\"\u9012\u5f52 n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
    space_complexity.go
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u9012\u5f52 n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc linearRecur(n: Int) {\n    print(\"\u9012\u5f52 n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n) {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction linearRecur(n: number): void {\n    console.log(`\u9012\u5f52 n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n  print('\u9012\u5f52 n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn linear_recur(n: i32) {\n    println!(\"\u9012\u5f52 n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
    space_complexity.c
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nvoid linearRecur(int n) {\n    printf(\"\u9012\u5f52 n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.kt
    /* \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun linearRecur(n: Int) {\n    println(\"\u9012\u5f52 n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
    space_complexity.rb
    ### \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef linear_recur(n)\n  puts \"\u9012\u5f52 n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
    space_complexity.zig
    // \u7ebf\u6027\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn linearRecur(comptime n: i32) void {\n    std.debug.print(\"\u9012\u5f52 n = {}\\n\", .{n});\n    if (n == 1) return;\n    linearRecur(n - 1);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-17 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u7ebf\u6027\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

    \u5e73\u65b9\u9636\u5e38\u89c1\u4e8e\u77e9\u9635\u548c\u56fe\uff0c\u5143\u7d20\u6570\u91cf\u4e0e \\(n\\) \u6210\u5e73\u65b9\u5173\u7cfb\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    num_matrix = [[0] * n for _ in range(n)]\n
    space_complexity.cpp
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
    space_complexity.java
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
    space_complexity.cs
    /* \u5e73\u65b9\u9636 */\nvoid Quadratic(int n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
    space_complexity.go
    /* \u5e73\u65b9\u9636 */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
    space_complexity.swift
    /* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
    space_complexity.ts
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): void {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
    space_complexity.dart
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n  // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
    space_complexity.rs
    /* \u5e73\u65b9\u9636 */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
    space_complexity.c
    /* \u5e73\u65b9\u9636 */\nvoid quadratic(int n) {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u5185\u5b58\u91ca\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
    space_complexity.kt
    /* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int) {\n    // \u77e9\u9635\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
    space_complexity.rb
    ### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  # \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n  Array.new(n) { Array.new(n, 0) }\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u9636\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7ef4\u5217\u8868\u5360\u7528 O(n^2) \u7a7a\u95f4\n    var nodes = std.ArrayList(std.ArrayList(i32)).init(std.heap.page_allocator);\n    defer nodes.deinit();\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        var tmp = std.ArrayList(i32).init(std.heap.page_allocator);\n        defer tmp.deinit();\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            try tmp.append(0);\n        }\n        try nodes.append(tmp);\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 2-18 \u6240\u793a\uff0c\u8be5\u51fd\u6570\u7684\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u5728\u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u4e2a\u6570\u7ec4\uff0c\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u957f\u5ea6\u4e3a \\(n / 2\\) \uff0c\u56e0\u6b64\u603b\u4f53\u5360\u7528 \\(O(n^2)\\) \u7a7a\u95f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
    space_complexity.cpp
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u9012\u5f52 n = \" << n << \" \u4e2d\u7684 nums \u957f\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.java
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u9012\u5f52 n = \" + n + \" \u4e2d\u7684 nums \u957f\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
    space_complexity.go
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u9012\u5f52 n = \\(n) \u4e2d\u7684 nums \u957f\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u9012\u5f52 n = ${n} \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
    space_complexity.c
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u9012\u5f52 n = %d \u4e2d\u7684 nums \u957f\u5ea6 = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
    space_complexity.kt
    /* \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u9012\u5f52 n = $n \u4e2d\u7684 nums \u957f\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
    space_complexity.rb
    ### \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u6570\u7ec4 nums \u957f\u5ea6\u4e3a n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u9012\u5f52 n = {} \u4e2d\u7684 nums \u957f\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-18 \u00a0 \u9012\u5f52\u51fd\u6570\u4ea7\u751f\u7684\u5e73\u65b9\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

    \u6307\u6570\u9636\u5e38\u89c1\u4e8e\u4e8c\u53c9\u6811\u3002\u89c2\u5bdf\u56fe 2-19 \uff0c\u5c42\u6570\u4e3a \\(n\\) \u7684\u201c\u6ee1\u4e8c\u53c9\u6811\u201d\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(2^n - 1\\) \uff0c\u5360\u7528 \\(O(2^n)\\) \u7a7a\u95f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
    space_complexity.cpp
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.java
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.cs
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
    space_complexity.go
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
    space_complexity.swift
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
    space_complexity.js
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.ts
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.dart
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
    space_complexity.rs
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
    space_complexity.c
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.kt
    /* \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09 */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
    space_complexity.rb
    ### \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
    space_complexity.zig
    // \u6307\u6570\u9636\uff08\u5efa\u7acb\u6ee1\u4e8c\u53c9\u6811\uff09\nfn buildTree(mem_allocator: std.mem.Allocator, n: i32) !?*inc.TreeNode(i32) {\n    if (n == 0) return null;\n    const root = try mem_allocator.create(inc.TreeNode(i32));\n    root.init(0);\n    root.left = try buildTree(mem_allocator, n - 1);\n    root.right = try buildTree(mem_allocator, n - 1);\n    return root;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-19 \u00a0 \u6ee1\u4e8c\u53c9\u6811\u4ea7\u751f\u7684\u6307\u6570\u9636\u7a7a\u95f4\u590d\u6742\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

    \u5bf9\u6570\u9636\u5e38\u89c1\u4e8e\u5206\u6cbb\u7b97\u6cd5\u3002\u4f8b\u5982\u5f52\u5e76\u6392\u5e8f\uff0c\u8f93\u5165\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u6bcf\u8f6e\u9012\u5f52\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6808\u5e27\u7a7a\u95f4\u3002

    \u518d\u4f8b\u5982\u5c06\u6570\u5b57\u8f6c\u5316\u4e3a\u5b57\u7b26\u4e32\uff0c\u8f93\u5165\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6570\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5bf9\u5e94\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6743\u8861\u65f6\u95f4\u4e0e\u7a7a\u95f4","text":"

    \u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u80fd\u8fbe\u5230\u6700\u4f18\u3002\u7136\u800c\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u540c\u65f6\u4f18\u5316\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96be\u3002

    \u964d\u4f4e\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a\u4ee3\u4ef7\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u4eec\u5c06\u727a\u7272\u5185\u5b58\u7a7a\u95f4\u6765\u63d0\u5347\u7b97\u6cd5\u8fd0\u884c\u901f\u5ea6\u7684\u601d\u8def\u79f0\u4e3a\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff1b\u53cd\u4e4b\uff0c\u5219\u79f0\u4e3a\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002

    \u9009\u62e9\u54ea\u79cd\u601d\u8def\u53d6\u51b3\u4e8e\u6211\u4eec\u66f4\u770b\u91cd\u54ea\u4e2a\u65b9\u9762\u3002\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u65f6\u95f4\u6bd4\u7a7a\u95f4\u66f4\u5b9d\u8d35\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u5f53\u7136\uff0c\u5728\u6570\u636e\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u4e0b\uff0c\u63a7\u5236\u7a7a\u95f4\u590d\u6742\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

    "},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"

    \u7b97\u6cd5\u6548\u7387\u8bc4\u4f30

    • \u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u662f\u8861\u91cf\u7b97\u6cd5\u4f18\u52a3\u7684\u4e24\u4e2a\u4e3b\u8981\u8bc4\u4ef7\u6307\u6807\u3002
    • \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5b9e\u9645\u6d4b\u8bd5\u6765\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96be\u4ee5\u6d88\u9664\u6d4b\u8bd5\u73af\u5883\u7684\u5f71\u54cd\uff0c\u4e14\u4f1a\u8017\u8d39\u5927\u91cf\u8ba1\u7b97\u8d44\u6e90\u3002
    • \u590d\u6742\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5b9e\u9645\u6d4b\u8bd5\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7ed3\u679c\u9002\u7528\u4e8e\u6240\u6709\u8fd0\u884c\u5e73\u53f0\uff0c\u5e76\u4e14\u80fd\u591f\u63ed\u793a\u7b97\u6cd5\u5728\u4e0d\u540c\u6570\u636e\u89c4\u6a21\u4e0b\u7684\u6548\u7387\u3002

    \u65f6\u95f4\u590d\u6742\u5ea6

    • \u65f6\u95f4\u590d\u6742\u5ea6\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\uff0c\u53ef\u4ee5\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f93\u5165\u7684\u6570\u636e\u91cf\u8f83\u5c0f\u6216\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\u65f6\uff0c\u65e0\u6cd5\u7cbe\u786e\u5bf9\u6bd4\u7b97\u6cd5\u6548\u7387\u7684\u4f18\u52a3\u3002
    • \u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u53f7\u8868\u793a\uff0c\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u5f53 \\(n\\) \u8d8b\u5411\u6b63\u65e0\u7a77\u65f6\uff0c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u7684\u589e\u957f\u7ea7\u522b\u3002
    • \u63a8\u7b97\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u4e24\u6b65\uff0c\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002
    • \u5e38\u89c1\u65f6\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n \\log n)\\)\u3001\\(O(n^2)\\)\u3001\\(O(2^n)\\) \u548c \\(O(n!)\\) \u7b49\u3002
    • \u67d0\u4e9b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u4e3a\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u51e0\u4e4e\u4e0d\u7528\uff0c\u56e0\u4e3a\u8f93\u5165\u6570\u636e\u4e00\u822c\u9700\u8981\u6ee1\u8db3\u4e25\u683c\u6761\u4ef6\u624d\u80fd\u8fbe\u5230\u6700\u4f73\u60c5\u51b5\u3002
    • \u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53cd\u6620\u7b97\u6cd5\u5728\u968f\u673a\u6570\u636e\u8f93\u5165\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5b9e\u9645\u5e94\u7528\u4e2d\u7684\u7b97\u6cd5\u6027\u80fd\u3002\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u9700\u8981\u7edf\u8ba1\u8f93\u5165\u6570\u636e\u5206\u5e03\u4ee5\u53ca\u7efc\u5408\u540e\u7684\u6570\u5b66\u671f\u671b\u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6

    • \u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u4f5c\u7528\u7c7b\u4f3c\u4e8e\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u7528\u4e8e\u8861\u91cf\u7b97\u6cd5\u5360\u7528\u5185\u5b58\u7a7a\u95f4\u968f\u6570\u636e\u91cf\u589e\u957f\u7684\u8d8b\u52bf\u3002
    • \u7b97\u6cd5\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u7684\u76f8\u5173\u5185\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u8f93\u5165\u7a7a\u95f4\u3001\u6682\u5b58\u7a7a\u95f4\u3001\u8f93\u51fa\u7a7a\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u8f93\u5165\u7a7a\u95f4\u4e0d\u7eb3\u5165\u7a7a\u95f4\u590d\u6742\u5ea6\u8ba1\u7b97\u3002\u6682\u5b58\u7a7a\u95f4\u53ef\u5206\u4e3a\u6682\u5b58\u6570\u636e\u3001\u6808\u5e27\u7a7a\u95f4\u548c\u6307\u4ee4\u7a7a\u95f4\uff0c\u5176\u4e2d\u6808\u5e27\u7a7a\u95f4\u901a\u5e38\u4ec5\u5728\u9012\u5f52\u51fd\u6570\u4e2d\u5f71\u54cd\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
    • \u6211\u4eec\u901a\u5e38\u53ea\u5173\u6ce8\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5373\u7edf\u8ba1\u7b97\u6cd5\u5728\u6700\u5dee\u8f93\u5165\u6570\u636e\u548c\u6700\u5dee\u8fd0\u884c\u65f6\u523b\u4e0b\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
    • \u5e38\u89c1\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece\u4f4e\u5230\u9ad8\u6392\u5217\u6709 \\(O(1)\\)\u3001\\(O(\\log n)\\)\u3001\\(O(n)\\)\u3001\\(O(n^2)\\) \u548c \\(O(2^n)\\) \u7b49\u3002
    "},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u5c3e\u9012\u5f52\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u5417\uff1f

    \u7406\u8bba\u4e0a\uff0c\u5c3e\u9012\u5f52\u51fd\u6570\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u8fc7\u7edd\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52a8\u4f18\u5316\u5c3e\u9012\u5f52\uff0c\u56e0\u6b64\u901a\u5e38\u8ba4\u4e3a\u7a7a\u95f4\u590d\u6742\u5ea6\u662f \\(O(n)\\) \u3002

    Q\uff1a\u51fd\u6570\u548c\u65b9\u6cd5\u8fd9\u4e24\u4e2a\u672f\u8bed\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f

    \u51fd\u6570\uff08function\uff09\u53ef\u4ee5\u88ab\u72ec\u7acb\u6267\u884c\uff0c\u6240\u6709\u53c2\u6570\u90fd\u4ee5\u663e\u5f0f\u4f20\u9012\u3002\u65b9\u6cd5\uff08method\uff09\u4e0e\u4e00\u4e2a\u5bf9\u8c61\u5173\u8054\uff0c\u88ab\u9690\u5f0f\u4f20\u9012\u7ed9\u8c03\u7528\u5b83\u7684\u5bf9\u8c61\uff0c\u80fd\u591f\u5bf9\u7c7b\u7684\u5b9e\u4f8b\u4e2d\u5305\u542b\u7684\u6570\u636e\u8fdb\u884c\u64cd\u4f5c\u3002

    \u4e0b\u9762\u4ee5\u51e0\u79cd\u5e38\u89c1\u7684\u7f16\u7a0b\u8bed\u8a00\u4e3a\u4f8b\u6765\u8bf4\u660e\u3002

    • C \u8bed\u8a00\u662f\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u6ca1\u6709\u9762\u5411\u5bf9\u8c61\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u6570\u3002\u4f46\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u521b\u5efa\u7ed3\u6784\u4f53\uff08struct\uff09\u6765\u6a21\u62df\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff0c\u4e0e\u7ed3\u6784\u4f53\u76f8\u5173\u8054\u7684\u51fd\u6570\u5c31\u76f8\u5f53\u4e8e\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
    • Java \u548c C# \u662f\u9762\u5411\u5bf9\u8c61\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u4ee3\u7801\u5757\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u4e3a\u67d0\u4e2a\u7c7b\u7684\u4e00\u90e8\u5206\u3002\u9759\u6001\u65b9\u6cd5\u7684\u884c\u4e3a\u7c7b\u4f3c\u4e8e\u51fd\u6570\uff0c\u56e0\u4e3a\u5b83\u88ab\u7ed1\u5b9a\u5728\u7c7b\u4e0a\uff0c\u4e0d\u80fd\u8bbf\u95ee\u7279\u5b9a\u7684\u5b9e\u4f8b\u53d8\u91cf\u3002
    • C++ \u548c Python \u65e2\u652f\u6301\u8fc7\u7a0b\u5f0f\u7f16\u7a0b\uff08\u51fd\u6570\uff09\uff0c\u4e5f\u652f\u6301\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\uff08\u65b9\u6cd5\uff09\u3002

    Q\uff1a\u56fe\u89e3\u201c\u5e38\u89c1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\uff1f

    \u4e0d\u662f\uff0c\u8be5\u56fe\u5c55\u793a\u7684\u662f\u7a7a\u95f4\u590d\u6742\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u957f\u8d8b\u52bf\uff0c\u800c\u4e0d\u662f\u5360\u7528\u7a7a\u95f4\u7684\u7edd\u5bf9\u5927\u5c0f\u3002

    \u5047\u8bbe\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u6bcf\u6761\u66f2\u7ebf\u7684\u503c\u4e0e\u51fd\u6570\u5bf9\u5e94\u4e0d\u4e0a\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6761\u66f2\u7ebf\u90fd\u5305\u542b\u4e00\u4e2a\u5e38\u6570\u9879\uff0c\u7528\u4e8e\u5c06\u53d6\u503c\u8303\u56f4\u538b\u7f29\u5230\u4e00\u4e2a\u89c6\u89c9\u8212\u9002\u7684\u8303\u56f4\u5185\u3002

    \u5728\u5b9e\u9645\u4e2d\uff0c\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u4e2a\u65b9\u6cd5\u7684\u201c\u5e38\u6570\u9879\u201d\u590d\u6742\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u65e0\u6cd5\u4ec5\u51ed\u590d\u6742\u5ea6\u6765\u9009\u62e9 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u4f18\u89e3\u6cd5\u3002\u4f46\u5bf9\u4e8e \\(n = 8^5\\) \u5c31\u5f88\u597d\u9009\u4e86\uff0c\u8fd9\u65f6\u589e\u957f\u8d8b\u52bf\u5df2\u7ecf\u5360\u4e3b\u5bfc\u4e86\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u65f6\u95f4\u590d\u6742\u5ea6","text":"

    \u8fd0\u884c\u65f6\u95f4\u53ef\u4ee5\u76f4\u89c2\u4e14\u51c6\u786e\u5730\u53cd\u6620\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u4eec\u60f3\u51c6\u786e\u9884\u4f30\u4e00\u6bb5\u4ee3\u7801\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u5e94\u8be5\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

    1. \u786e\u5b9a\u8fd0\u884c\u5e73\u53f0\uff0c\u5305\u62ec\u786c\u4ef6\u914d\u7f6e\u3001\u7f16\u7a0b\u8bed\u8a00\u3001\u7cfb\u7edf\u73af\u5883\u7b49\uff0c\u8fd9\u4e9b\u56e0\u7d20\u90fd\u4f1a\u5f71\u54cd\u4ee3\u7801\u7684\u8fd0\u884c\u6548\u7387\u3002
    2. \u8bc4\u4f30\u5404\u79cd\u8ba1\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u6253\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
    3. \u7edf\u8ba1\u4ee3\u7801\u4e2d\u6240\u6709\u7684\u8ba1\u7b97\u64cd\u4f5c\uff0c\u5e76\u5c06\u6240\u6709\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u6c42\u548c\uff0c\u4ece\u800c\u5f97\u5230\u8fd0\u884c\u65f6\u95f4\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # \u5faa\u73af n \u6b21\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        System.out.println(0);     // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        console.log(0); // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n    print(0); // 5 ns\n  }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n {     // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfun algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) {  // 1 ns \uff0c\u6bcf\u8f6e\u90fd\u8981\u6267\u884c i++\n        println(0)      // 5 ns\n    }\n}\n
    # \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\ndef algorithm(n)\n    a = 2       # 1 ns\n    a = a + 1   # 1 ns\n    a = a * 2   # 10 ns\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # 1 ns\n        puts 0      # 5 ns\n    end\nend\n
    // \u5728\u67d0\u8fd0\u884c\u5e73\u53f0\u4e0b\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

    \u6839\u636e\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u4e3a \\((6n + 12)\\) ns \uff1a

    \\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

    \u4f46\u5b9e\u9645\u4e0a\uff0c\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73b0\u5b9e\u3002\u9996\u5148\uff0c\u6211\u4eec\u4e0d\u5e0c\u671b\u5c06\u9884\u4f30\u65f6\u95f4\u548c\u8fd0\u884c\u5e73\u53f0\u7ed1\u5b9a\uff0c\u56e0\u4e3a\u7b97\u6cd5\u9700\u8981\u5728\u5404\u79cd\u4e0d\u540c\u7684\u5e73\u53f0\u4e0a\u8fd0\u884c\u3002\u5176\u6b21\uff0c\u6211\u4eec\u5f88\u96be\u83b7\u77e5\u6bcf\u79cd\u64cd\u4f5c\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u8fd9\u7ed9\u9884\u4f30\u8fc7\u7a0b\u5e26\u6765\u4e86\u6781\u5927\u7684\u96be\u5ea6\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7edf\u8ba1\u65f6\u95f4\u589e\u957f\u8d8b\u52bf","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u7edf\u8ba1\u7684\u4e0d\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\uff0c\u800c\u662f\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740\u6570\u636e\u91cf\u53d8\u5927\u65f6\u7684\u589e\u957f\u8d8b\u52bf\u3002

    \u201c\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u201d\u8fd9\u4e2a\u6982\u5ff5\u6bd4\u8f83\u62bd\u8c61\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7ed9\u5b9a\u4e09\u4e2a\u7b97\u6cd5 A\u3001B \u548c C \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n: int):\n    print(0)\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmA(int n) {\n  print(0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algoritm_A(n: Int) {\n    println(0)\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfun algorithm_B(n: Int) {\n    for (i in 0..<n){\n        println(0)\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfun algorithm_C(n: Int) {\n    for (i in 0..<1000000) {\n        println(0)\n    }\n}\n
    # \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_A(n)\n    puts 0\nend\n\n# \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\ndef algorithm_B(n)\n    (0...n).each { puts 0 }\nend\n\n# \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\ndef algorithm_C(n)\n    (0...1_000_000).each { puts 0 }\nend\n
    // \u7b97\u6cd5 A \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// \u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u7ebf\u6027\u9636\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// \u7b97\u6cd5 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u5e38\u6570\u9636\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

    \u56fe 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u4e2a\u7b97\u6cd5\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    • \u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u4e2a\u6253\u5370\u64cd\u4f5c\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u4e0d\u968f\u7740 \\(n\\) \u589e\u5927\u800c\u589e\u957f\u3002\u6211\u4eec\u79f0\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002
    • \u7b97\u6cd5 B \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(n\\) \u6b21\uff0c\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u968f\u7740 \\(n\\) \u589e\u5927\u5448\u7ebf\u6027\u589e\u957f\u3002\u6b64\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u88ab\u79f0\u4e3a\u201c\u7ebf\u6027\u9636\u201d\u3002
    • \u7b97\u6cd5 C \u4e2d\u7684\u6253\u5370\u64cd\u4f5c\u9700\u8981\u5faa\u73af \\(1000000\\) \u6b21\uff0c\u867d\u7136\u8fd0\u884c\u65f6\u95f4\u5f88\u957f\uff0c\u4f46\u5b83\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\u3002\u56e0\u6b64 C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u4e3a\u201c\u5e38\u6570\u9636\u201d\u3002

    \u56fe 2-7 \u00a0 \u7b97\u6cd5 A\u3001B \u548c C \u7684\u65f6\u95f4\u589e\u957f\u8d8b\u52bf

    \u76f8\u8f83\u4e8e\u76f4\u63a5\u7edf\u8ba1\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u70b9\u5462\uff1f

    • \u65f6\u95f4\u590d\u6742\u5ea6\u80fd\u591f\u6709\u6548\u8bc4\u4f30\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u7b97\u6cd5 B \u7684\u8fd0\u884c\u65f6\u95f4\u5448\u7ebf\u6027\u589e\u957f\uff0c\u5728 \\(n > 1\\) \u65f6\u6bd4\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u65f6\u6bd4\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5b9e\u4e0a\uff0c\u53ea\u8981\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8db3\u591f\u5927\uff0c\u590d\u6742\u5ea6\u4e3a\u201c\u5e38\u6570\u9636\u201d\u7684\u7b97\u6cd5\u4e00\u5b9a\u4f18\u4e8e\u201c\u7ebf\u6027\u9636\u201d\u7684\u7b97\u6cd5\uff0c\u8fd9\u6b63\u662f\u65f6\u95f4\u589e\u957f\u8d8b\u52bf\u7684\u542b\u4e49\u3002
    • \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7b80\u4fbf\u3002\u663e\u7136\uff0c\u8fd0\u884c\u5e73\u53f0\u548c\u8ba1\u7b97\u64cd\u4f5c\u7c7b\u578b\u90fd\u4e0e\u7b97\u6cd5\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u65e0\u5173\u3002\u56e0\u6b64\u5728\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u5c06\u6240\u6709\u8ba1\u7b97\u64cd\u4f5c\u7684\u6267\u884c\u65f6\u95f4\u89c6\u4e3a\u76f8\u540c\u7684\u201c\u5355\u4f4d\u65f6\u95f4\u201d\uff0c\u4ece\u800c\u5c06\u201c\u8ba1\u7b97\u64cd\u4f5c\u8fd0\u884c\u65f6\u95f4\u7edf\u8ba1\u201d\u7b80\u5316\u4e3a\u201c\u8ba1\u7b97\u64cd\u4f5c\u6570\u91cf\u7edf\u8ba1\u201d\uff0c\u8fd9\u6837\u4e00\u6765\u4f30\u7b97\u96be\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u5c40\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5c3d\u7ba1\u7b97\u6cd5 A \u548c C \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u76f8\u540c\uff0c\u4f46\u5b9e\u9645\u8fd0\u884c\u65f6\u95f4\u5dee\u522b\u5f88\u5927\u3002\u540c\u6837\uff0c\u5c3d\u7ba1\u7b97\u6cd5 B \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7b97\u6cd5 B \u660e\u663e\u4f18\u4e8e\u7b97\u6cd5 C \u3002\u5bf9\u4e8e\u6b64\u7c7b\u60c5\u51b5\uff0c\u6211\u4eec\u65f6\u5e38\u96be\u4ee5\u4ec5\u51ed\u65f6\u95f4\u590d\u6742\u5ea6\u5224\u65ad\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u5f53\u7136\uff0c\u5c3d\u7ba1\u5b58\u5728\u4e0a\u8ff0\u95ee\u9898\uff0c\u590d\u6742\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8bc4\u5224\u7b97\u6cd5\u6548\u7387\u6700\u6709\u6548\u4e14\u5e38\u7528\u7684\u65b9\u6cd5\u3002
    "},{"location":"chapter_computational_complexity/time_complexity/#232","title":"2.3.2 \u00a0 \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u8f93\u5165\u5927\u5c0f\u4e3a \\(n\\) \u7684\u51fd\u6570\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u5faa\u73af n \u6b21\n    for i in range(n):  # +1\n        print(0)        # +1\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        cout << 0 << endl;    // +1\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        System.out.println(0);    // +1\n    }\n}\n
    void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        Console.WriteLine(0);   // +1\n    }\n}\n
    func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // \u5faa\u73af n \u6b21\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
    func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
    function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
    function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        console.log(0); // +1\n    }\n}\n
    void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // \u5faa\u73af n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n    print(0); // +1\n  }\n}\n
    fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // \u5faa\u73af n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println!(\"{}\", 0); // +1\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u5faa\u73af n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        printf(\"%d\", 0);            // +1\n    }\n}\n
    fun algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u5faa\u73af n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        println(0) // +1\n    }\n}\n
    def algorithm(n)\n    a = 1       # +1\n    a = a + 1   # +1\n    a = a * 2   # +1\n    # \u5faa\u73af n \u6b21\n    (0...n).each do # +1\n        puts 0      # +1\n    end\nend\n
    fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u5faa\u73af n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f6e\u90fd\u6267\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

    \u8bbe\u7b97\u6cd5\u7684\u64cd\u4f5c\u6570\u91cf\u662f\u4e00\u4e2a\u5173\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u7684\u51fd\u6570\uff0c\u8bb0\u4e3a \\(T(n)\\) \uff0c\u5219\u4ee5\u4e0a\u51fd\u6570\u7684\u64cd\u4f5c\u6570\u91cf\u4e3a\uff1a

    \\[ T(n) = 3 + 2n \\]

    \\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u6570\uff0c\u8bf4\u660e\u5176\u8fd0\u884c\u65f6\u95f4\u7684\u589e\u957f\u8d8b\u52bf\u662f\u7ebf\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u7ebf\u6027\u9636\u3002

    \u6211\u4eec\u5c06\u7ebf\u6027\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u8bb0\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e2a\u6570\u5b66\u7b26\u53f7\u79f0\u4e3a\u5927 \\(O\\) \u8bb0\u53f7\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u6570 \\(T(n)\\) \u7684\u6e10\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

    \u65f6\u95f4\u590d\u6742\u5ea6\u5206\u6790\u672c\u8d28\u4e0a\u662f\u8ba1\u7b97\u201c\u64cd\u4f5c\u6570\u91cf \\(T(n)\\)\u201d\u7684\u6e10\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u786e\u7684\u6570\u5b66\u5b9a\u4e49\u3002

    \u51fd\u6570\u6e10\u8fd1\u4e0a\u754c

    \u82e5\u5b58\u5728\u6b63\u5b9e\u6570 \\(c\\) \u548c\u5b9e\u6570 \\(n_0\\) \uff0c\u4f7f\u5f97\u5bf9\u4e8e\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5219\u53ef\u8ba4\u4e3a \\(f(n)\\) \u7ed9\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u4e2a\u6e10\u8fd1\u4e0a\u754c\uff0c\u8bb0\u4e3a \\(T(n) = O(f(n))\\) \u3002

    \u5982\u56fe 2-8 \u6240\u793a\uff0c\u8ba1\u7b97\u6e10\u8fd1\u4e0a\u754c\u5c31\u662f\u5bfb\u627e\u4e00\u4e2a\u51fd\u6570 \\(f(n)\\) \uff0c\u4f7f\u5f97\u5f53 \\(n\\) \u8d8b\u5411\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u5904\u4e8e\u76f8\u540c\u7684\u589e\u957f\u7ea7\u522b\uff0c\u4ec5\u76f8\u5dee\u4e00\u4e2a\u5e38\u6570\u9879 \\(c\\) \u7684\u500d\u6570\u3002

    \u56fe 2-8 \u00a0 \u51fd\u6570\u7684\u6e10\u8fd1\u4e0a\u754c

    "},{"location":"chapter_computational_complexity/time_complexity/#233","title":"2.3.3 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

    \u6e10\u8fd1\u4e0a\u754c\u7684\u6570\u5b66\u5473\u513f\u6709\u70b9\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89c9\u6ca1\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u65e0\u987b\u62c5\u5fc3\u3002\u6211\u4eec\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65ad\u7684\u5b9e\u8df5\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6e10\u9886\u609f\u5176\u6570\u5b66\u610f\u4e49\u3002

    \u6839\u636e\u5b9a\u4e49\uff0c\u786e\u5b9a \\(f(n)\\) \u4e4b\u540e\uff0c\u6211\u4eec\u4fbf\u53ef\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u4e48\u5982\u4f55\u786e\u5b9a\u6e10\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u603b\u4f53\u5206\u4e3a\u4e24\u6b65\uff1a\u9996\u5148\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff0c\u7136\u540e\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf","text":"

    \u9488\u5bf9\u4ee3\u7801\uff0c\u9010\u884c\u4ece\u4e0a\u5230\u4e0b\u8ba1\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u4e8e\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6570\u9879 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u79cd\u7cfb\u6570\u3001\u5e38\u6570\u9879\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u636e\u6b64\u539f\u5219\uff0c\u53ef\u4ee5\u603b\u7ed3\u51fa\u4ee5\u4e0b\u8ba1\u6570\u7b80\u5316\u6280\u5de7\u3002

    1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6570\u9879\u3002\u56e0\u4e3a\u5b83\u4eec\u90fd\u4e0e \\(n\\) \u65e0\u5173\uff0c\u6240\u4ee5\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4ea7\u751f\u5f71\u54cd\u3002
    2. \u7701\u7565\u6240\u6709\u7cfb\u6570\u3002\u4f8b\u5982\uff0c\u5faa\u73af \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7b80\u5316\u8bb0\u4e3a \\(n\\) \u6b21\uff0c\u56e0\u4e3a \\(n\\) \u524d\u9762\u7684\u7cfb\u6570\u5bf9\u65f6\u95f4\u590d\u6742\u5ea6\u6ca1\u6709\u5f71\u54cd\u3002
    3. \u5faa\u73af\u5d4c\u5957\u65f6\u4f7f\u7528\u4e58\u6cd5\u3002\u603b\u64cd\u4f5c\u6570\u91cf\u7b49\u4e8e\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u64cd\u4f5c\u6570\u91cf\u4e4b\u79ef\uff0c\u6bcf\u4e00\u5c42\u5faa\u73af\u4f9d\u7136\u53ef\u4ee5\u5206\u522b\u5957\u7528\u7b2c 1. \u70b9\u548c\u7b2c 2. \u70b9\u7684\u6280\u5de7\u3002

    \u7ed9\u5b9a\u4e00\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u6765\u7edf\u8ba1\u64cd\u4f5c\u6570\u91cf\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 1      # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
    void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
    void Algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
    func algorithm(n int) {\n    a := 1     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
    func algorithm(n: Int) {\n    var a = 1 // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
    function algorithm(n) {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
    function algorithm(n: number): void {\n    let a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
    void algorithm(int n) {\n  int a = 1; // +0\uff08\u6280\u5de7 1\uff09\n  a = a + n; // +0\uff08\u6280\u5de7 1\uff09\n  // +n\uff08\u6280\u5de7 2\uff09\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n\uff08\u6280\u5de7 3\uff09\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
    fn algorithm(n: i32) {\n    let mut a = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n;  // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
    fun algorithm(n: Int) {\n    var a = 1   // +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   // +0\uff08\u6280\u5de7 1\uff09\n    // +n\uff08\u6280\u5de7 2\uff09\n    for (i in 0..<5 * n + 1) {\n        println(0)\n    }\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for (i in 0..<2 * n) {\n        for (j in 0..<n + 1) {\n            println(0)\n        }\n    }\n}\n
    def algorithm(n)\n    a = 1       # +0\uff08\u6280\u5de7 1\uff09\n    a = a + n   # +0\uff08\u6280\u5de7 1\uff09\n    # +n\uff08\u6280\u5de7 2\uff09\n    (0...(5 * n + 1)).each do { puts 0 }\n    # +n*n\uff08\u6280\u5de7 3\uff09\n    (0...(2 * n)).each do\n        (0...(n + 1)).each do { puts 0 }\n    end\nend\n
    fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0\uff08\u6280\u5de7 1\uff09\n    a = a + @as(i32, @intCast(n));        // +0\uff08\u6280\u5de7 1\uff09\n\n    // +n\uff08\u6280\u5de7 2\uff09\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n\uff08\u6280\u5de7 3\uff09\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

    \u4ee5\u4e0b\u516c\u5f0f\u5c55\u793a\u4e86\u4f7f\u7528\u4e0a\u8ff0\u6280\u5de7\u524d\u540e\u7684\u7edf\u8ba1\u7ed3\u679c\uff0c\u4e24\u8005\u63a8\u7b97\u51fa\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002

    \\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{\u5b8c\u6574\u7edf\u8ba1 (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{\u5077\u61d2\u7edf\u8ba1 (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2","title":"2. \u00a0 \u7b2c\u4e8c\u6b65\uff1a\u5224\u65ad\u6e10\u8fd1\u4e0a\u754c","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u9636\u7684\u9879\u6765\u51b3\u5b9a\u3002\u8fd9\u662f\u56e0\u4e3a\u5728 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u6700\u9ad8\u9636\u7684\u9879\u5c06\u53d1\u6325\u4e3b\u5bfc\u4f5c\u7528\uff0c\u5176\u4ed6\u9879\u7684\u5f71\u54cd\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

    \u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u5938\u5f20\u7684\u503c\u662f\u4e3a\u4e86\u5f3a\u8c03\u201c\u7cfb\u6570\u65e0\u6cd5\u64bc\u52a8\u9636\u6570\u201d\u8fd9\u4e00\u7ed3\u8bba\u3002\u5f53 \\(n\\) \u8d8b\u4e8e\u65e0\u7a77\u5927\u65f6\uff0c\u8fd9\u4e9b\u5e38\u6570\u53d8\u5f97\u65e0\u8db3\u8f7b\u91cd\u3002

    \u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6570\u91cf\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u64cd\u4f5c\u6570\u91cf \\(T(n)\\) \u65f6\u95f4\u590d\u6742\u5ea6 \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234","title":"2.3.4 \u00a0 \u5e38\u89c1\u7c7b\u578b","text":"

    \u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b\u5982\u56fe 2-9 \u6240\u793a\uff08\u6309\u7167\u4ece\u4f4e\u5230\u9ad8\u7684\u987a\u5e8f\u6392\u5217\uff09\u3002

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{\u5e38\u6570\u9636} < \\text{\u5bf9\u6570\u9636} < \\text{\u7ebf\u6027\u9636} < \\text{\u7ebf\u6027\u5bf9\u6570\u9636} < \\text{\u5e73\u65b9\u9636} < \\text{\u6307\u6570\u9636} < \\text{\u9636\u4e58\u9636} \\end{aligned} \\]

    \u56fe 2-9 \u00a0 \u5e38\u89c1\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7c7b\u578b

    "},{"location":"chapter_computational_complexity/time_complexity/#1-o1","title":"1. \u00a0 \u5e38\u6570\u9636 \\(O(1)\\)","text":"

    \u5e38\u6570\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u5373\u4e0d\u968f\u7740 \\(n\\) \u7684\u53d8\u5316\u800c\u53d8\u5316\u3002

    \u5728\u4ee5\u4e0b\u51fd\u6570\u4e2d\uff0c\u5c3d\u7ba1\u64cd\u4f5c\u6570\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u4e8e\u5176\u4e0e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u65e0\u5173\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def constant(n: int) -> int:\n    \"\"\"\u5e38\u6570\u9636\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.java
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.cs
    /* \u5e38\u6570\u9636 */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.go
    /* \u5e38\u6570\u9636 */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e38\u6570\u9636 */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e38\u6570\u9636 */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u5e38\u6570\u9636 */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
    time_complexity.dart
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e38\u6570\u9636 */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e38\u6570\u9636 */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e38\u6570\u9636 */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
    time_complexity.rb
    ### \u5e38\u6570\u9636 ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
    time_complexity.zig
    // \u5e38\u6570\u9636\nfn constant(n: i32) i32 {\n    _ = n;\n    var count: i32 = 0;\n    const size: i32 = 100_000;\n    var i: i32 = 0;\n    while(i<size) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_computational_complexity/time_complexity/#2-on","title":"2. \u00a0 \u7ebf\u6027\u9636 \\(O(n)\\)","text":"

    \u7ebf\u6027\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u7ebf\u6027\u7ea7\u522b\u589e\u957f\u3002\u7ebf\u6027\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5355\u5c42\u5faa\u73af\u4e2d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u9636\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.java
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.cs
    /* \u7ebf\u6027\u9636 */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.go
    /* \u7ebf\u6027\u9636 */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7ebf\u6027\u9636 */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7ebf\u6027\u9636 */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u7ebf\u6027\u9636 */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.dart
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7ebf\u6027\u9636 */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u7ebf\u6027\u9636 */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7ebf\u6027\u9636 */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
    time_complexity.rb
    ### \u7ebf\u6027\u9636 ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
    time_complexity.zig
    // \u7ebf\u6027\u9636\nfn linear(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u904d\u5386\u6570\u7ec4\u548c\u904d\u5386\u94fe\u8868\u7b49\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u6570\u7ec4\u6216\u94fe\u8868\u7684\u957f\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u7ebf\u6027\u9636\uff08\u904d\u5386\u6570\u7ec4\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u7ec4\u957f\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u9700\u6839\u636e\u8f93\u5165\u6570\u636e\u7684\u7c7b\u578b\u6765\u5177\u4f53\u786e\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u4e2a\u793a\u4f8b\u4e2d\uff0c\u53d8\u91cf \\(n\\) \u4e3a\u8f93\u5165\u6570\u636e\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u4e3a\u6570\u636e\u5927\u5c0f\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#3-on2","title":"3. \u00a0 \u5e73\u65b9\u9636 \\(O(n^2)\\)","text":"

    \u5e73\u65b9\u9636\u7684\u64cd\u4f5c\u6570\u91cf\u76f8\u5bf9\u4e8e\u8f93\u5165\u6570\u636e\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7ea7\u522b\u589e\u957f\u3002\u5e73\u65b9\u9636\u901a\u5e38\u51fa\u73b0\u5728\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u5916\u5c42\u5faa\u73af\u548c\u5185\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n)\\) \uff0c\u56e0\u6b64\u603b\u4f53\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u9636\"\"\"\n    count = 0\n    # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5e73\u65b9\u9636 */\nint Quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5e73\u65b9\u9636 */\nfunc quadratic(n int) int {\n    count := 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e73\u65b9\u9636 */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n) {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5e73\u65b9\u9636 */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n  int count = 0;\n  // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e73\u65b9\u9636 */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u9636 */\nint quadratic(int n) {\n    int count = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e73\u65b9\u9636 */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5e73\u65b9\u9636 ###\ndef quadratic(n)\n  count = 0\n\n  # \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5e73\u65b9\u9636\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5faa\u73af\u6b21\u6570\u4e0e\u6570\u636e\u5927\u5c0f n \u6210\u5e73\u65b9\u5173\u7cfb\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < n) : (j += 1) {\n            count += 1;\n        }\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-10 \u5bf9\u6bd4\u4e86\u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u4e09\u79cd\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    \u56fe 2-10 \u00a0 \u5e38\u6570\u9636\u3001\u7ebf\u6027\u9636\u548c\u5e73\u65b9\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u4ee5\u5192\u6ce1\u6392\u5e8f\u4e3a\u4f8b\uff0c\u5916\u5c42\u5faa\u73af\u6267\u884c \\(n - 1\\) \u6b21\uff0c\u5185\u5c42\u5faa\u73af\u6267\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u4e3a \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O((n - 1) n / 2) = O(n^2)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8ba1\u6570\u5668\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8ba1\u6570\u5668\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8ba1\u6570\u5668\n\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8ba1\u6570\u5668\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8ba1\u6570\u5668\n\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5e73\u65b9\u9636\uff08\u5192\u6ce1\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8ba1\u6570\u5668 \n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3;  // \u5143\u7d20\u4ea4\u6362\u5305\u542b 3 \u4e2a\u5355\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_computational_complexity/time_complexity/#4-o2n","title":"4. \u00a0 \u6307\u6570\u9636 \\(O(2^n)\\)","text":"

    \u751f\u7269\u5b66\u7684\u201c\u7ec6\u80de\u5206\u88c2\u201d\u662f\u6307\u6570\u9636\u589e\u957f\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72b6\u6001\u4e3a \\(1\\) \u4e2a\u7ec6\u80de\uff0c\u5206\u88c2\u4e00\u8f6e\u540e\u53d8\u4e3a \\(2\\) \u4e2a\uff0c\u5206\u88c2\u4e24\u8f6e\u540e\u53d8\u4e3a \\(4\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f6e\u540e\u6709 \\(2^n\\) \u4e2a\u7ec6\u80de\u3002

    \u56fe 2-11 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u7ec6\u80de\u5206\u88c2\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exponential(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
    time_complexity.cpp
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.java
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.cs
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.go
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.swift
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.js
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.ts
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.dart
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
    time_complexity.rs
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
    time_complexity.c
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.kt
    /* \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.rb
    ### \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
    time_complexity.zig
    // \u6307\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7ec6\u80de\u6bcf\u8f6e\u4e00\u5206\u4e3a\u4e8c\uff0c\u5f62\u6210\u6570\u5217 1, 2, 4, 8, ..., 2^(n-1)\n    while (i < n) : (i += 1) {\n        var j: i32 = 0;\n        while (j < bas) : (j += 1) {\n            count += 1;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-11 \u00a0 \u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u5728\u5b9e\u9645\u7b97\u6cd5\u4e2d\uff0c\u6307\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u5176\u9012\u5f52\u5730\u4e00\u5206\u4e3a\u4e8c\uff0c\u7ecf\u8fc7 \\(n\\) \u6b21\u5206\u88c2\u540e\u505c\u6b62\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
    time_complexity.cpp
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.java
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.cs
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
    time_complexity.go
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
    time_complexity.swift
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
    time_complexity.js
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.ts
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.dart
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.rs
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
    time_complexity.c
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.kt
    /* \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
    time_complexity.rb
    ### \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
    time_complexity.zig
    // \u6307\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6307\u6570\u9636\u589e\u957f\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7a77\u4e3e\u6cd5\uff08\u66b4\u529b\u641c\u7d22\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f83\u5e38\u89c1\u3002\u5bf9\u4e8e\u6570\u636e\u89c4\u6a21\u8f83\u5927\u7684\u95ee\u9898\uff0c\u6307\u6570\u9636\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u6216\u8d2a\u5fc3\u7b97\u6cd5\u7b49\u6765\u89e3\u51b3\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5bf9\u6570\u9636 \\(O(\\log n)\\)","text":"

    \u4e0e\u6307\u6570\u9636\u76f8\u53cd\uff0c\u5bf9\u6570\u9636\u53cd\u6620\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u60c5\u51b5\u3002\u8bbe\u8f93\u5165\u6570\u636e\u5927\u5c0f\u4e3a \\(n\\) \uff0c\u7531\u4e8e\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u6570\u3002

    \u56fe 2-12 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6a21\u62df\u4e86\u201c\u6bcf\u8f6e\u7f29\u51cf\u5230\u4e00\u534a\u201d\u7684\u8fc7\u7a0b\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log_2 n)\\) \uff0c\u7b80\u8bb0\u4e3a \\(O(\\log n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def logarithmic(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09*/\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09 */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5bf9\u6570\u9636\uff08\u5faa\u73af\u5b9e\u73b0\uff09\nfn logarithmic(n: i32) i32 {\n    var count: i32 = 0;\n    var n_var = n;\n    while (n_var > 1)\n    {\n        n_var = n_var / 2;\n        count +=1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-12 \u00a0 \u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u4e0e\u6307\u6570\u9636\u7c7b\u4f3c\uff0c\u5bf9\u6570\u9636\u4e5f\u5e38\u51fa\u73b0\u4e8e\u9012\u5f52\u51fd\u6570\u4e2d\u3002\u4ee5\u4e0b\u4ee3\u7801\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(\\log_2 n\\) \u7684\u9012\u5f52\u6811\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def log_recur(n: int) -> int:\n    \"\"\"\u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
    time_complexity.cpp
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.java
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.cs
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
    time_complexity.go
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09*/\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
    time_complexity.swift
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
    time_complexity.js
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.ts
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.dart
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
    time_complexity.rs
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
    time_complexity.c
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.kt
    /* \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
    time_complexity.rb
    ### \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
    time_complexity.zig
    // \u5bf9\u6570\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u7b97\u6cd5\u4e2d\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u591a\u201d\u548c\u201c\u5316\u7e41\u4e3a\u7b80\u201d\u7684\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u957f\u7f13\u6162\uff0c\u662f\u4ec5\u6b21\u4e8e\u5e38\u6570\u9636\u7684\u7406\u60f3\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    \\(O(\\log n)\\) \u7684\u5e95\u6570\u662f\u591a\u5c11\uff1f

    \u51c6\u786e\u6765\u8bf4\uff0c\u201c\u4e00\u5206\u4e3a \\(m\\)\u201d\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u901a\u8fc7\u5bf9\u6570\u6362\u5e95\u516c\u5f0f\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6570\u3001\u76f8\u7b49\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff1a

    \\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5e95\u6570 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u54cd\u590d\u6742\u5ea6\u7684\u524d\u63d0\u4e0b\u8f6c\u6362\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u7701\u7565\u5e95\u6570 \\(m\\) \uff0c\u5c06\u5bf9\u6570\u9636\u76f4\u63a5\u8bb0\u4e3a \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636 \\(O(n \\log n)\\)","text":"

    \u7ebf\u6027\u5bf9\u6570\u9636\u5e38\u51fa\u73b0\u4e8e\u5d4c\u5957\u5faa\u73af\u4e2d\uff0c\u4e24\u5c42\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5206\u522b\u4e3a \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear_log_recur(n: int) -> int:\n    \"\"\"\u7ebf\u6027\u5bf9\u6570\u9636\"\"\"\n    if n <= 1:\n        return 1\n    # \u4e00\u5206\u4e3a\u4e8c\uff0c\u5b50\u95ee\u9898\u7684\u89c4\u6a21\u51cf\u5c0f\u4e00\u534a\n    count = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    # \u5f53\u524d\u5b50\u95ee\u9898\u5305\u542b n \u4e2a\u64cd\u4f5c\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n as i32 {\n        count += 1;\n    }\n    return count;\n}\n
    time_complexity.c
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7ebf\u6027\u5bf9\u6570\u9636 */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u7ebf\u6027\u5bf9\u6570\u9636 ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
    time_complexity.zig
    // \u7ebf\u6027\u5bf9\u6570\u9636\nfn linearLogRecur(n: i32) i32 {\n    if (n <= 1) return 1;\n    var count: i32 = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    var i: i32 = 0;\n    while (i < n) : (i += 1) {\n        count += 1;\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-13 \u5c55\u793a\u4e86\u7ebf\u6027\u5bf9\u6570\u9636\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u53c9\u6811\u7684\u6bcf\u4e00\u5c42\u7684\u64cd\u4f5c\u603b\u6570\u90fd\u4e3a \\(n\\) \uff0c\u6811\u5171\u6709 \\(\\log_2 n + 1\\) \u5c42\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    \u56fe 2-13 \u00a0 \u7ebf\u6027\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u7b49\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#7-on","title":"7. \u00a0 \u9636\u4e58\u9636 \\(O(n!)\\)","text":"

    \u9636\u4e58\u9636\u5bf9\u5e94\u6570\u5b66\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u95ee\u9898\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u4e92\u4e0d\u91cd\u590d\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6570\u91cf\u4e3a\uff1a

    \\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

    \u9636\u4e58\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u5b9e\u73b0\u3002\u5982\u56fe 2-14 \u548c\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u7b2c\u4e00\u5c42\u5206\u88c2\u51fa \\(n\\) \u4e2a\uff0c\u7b2c\u4e8c\u5c42\u5206\u88c2\u51fa \\(n - 1\\) \u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c42\u65f6\u505c\u6b62\u5206\u88c2\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def factorial_recur(n: int) -> int:\n    \"\"\"\u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
    time_complexity.cpp
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
    time_complexity.js
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
    time_complexity.c
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
    time_complexity.zig
    // \u9636\u4e58\u9636\uff08\u9012\u5f52\u5b9e\u73b0\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u4ece 1 \u4e2a\u5206\u88c2\u51fa n \u4e2a\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 2-14 \u00a0 \u9636\u4e58\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6

    \u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u5f53 \\(n \\geq 4\\) \u65f6\u6052\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u9636\u4e58\u9636\u6bd4\u6307\u6570\u9636\u589e\u957f\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f83\u5927\u65f6\u4e5f\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#235","title":"2.3.5 \u00a0 \u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6","text":"

    \u7b97\u6cd5\u7684\u65f6\u95f4\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u4e0e\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u6709\u5173\u3002\u5047\u8bbe\u8f93\u5165\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d nums \u7531\u4ece \\(1\\) \u81f3 \\(n\\) \u7684\u6570\u5b57\u7ec4\u6210\uff0c\u6bcf\u4e2a\u6570\u5b57\u53ea\u51fa\u73b0\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u987a\u5e8f\u662f\u968f\u673a\u6253\u4e71\u7684\uff0c\u4efb\u52a1\u76ee\u6807\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

    • \u5f53 nums = [?, ?, ..., 1] \uff0c\u5373\u5f53\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u65f6\uff0c\u9700\u8981\u5b8c\u6574\u904d\u5386\u6570\u7ec4\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
    • \u5f53 nums = [1, ?, ?, ...] \uff0c\u5373\u5f53\u9996\u4e2a\u5143\u7d20\u4e3a \\(1\\) \u65f6\uff0c\u65e0\u8bba\u6570\u7ec4\u591a\u957f\u90fd\u4e0d\u9700\u8981\u7ee7\u7eed\u904d\u5386\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(\\Omega(1)\\) \u3002

    \u201c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8bb0\u53f7\u8868\u793a\u3002\u76f8\u5e94\u5730\uff0c\u201c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u201d\u5bf9\u5e94\u51fd\u6570\u6e10\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8bb0\u53f7\u8868\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
    def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71\"\"\"\n    # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
    worst_best_time_complexity.cpp
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7edf\u65f6\u95f4\u751f\u6210\u968f\u673a\u79cd\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.java
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.cs
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.go
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
    worst_best_time_complexity.swift
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
    worst_best_time_complexity.js
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    worst_best_time_complexity.ts
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    worst_best_time_complexity.dart
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
    worst_best_time_complexity.rs
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
    worst_best_time_complexity.c
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u533a\u5185\u5b58\uff08\u521b\u5efa\u4e00\u7ef4\u53ef\u53d8\u957f\u6570\u7ec4\uff1a\u6570\u7ec4\u4e2d\u5143\u7d20\u6570\u91cf\u4e3a n \uff0c\u5143\u7d20\u7c7b\u578b\u4e3a int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.kt
    /* \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
    worst_best_time_complexity.rb
    ### \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a: 1, 2, ..., n \uff0c\u987a\u5e8f\u88ab\u6253\u4e71 ###\ndef random_numbers(n)\n  # \u751f\u6210\u6570\u7ec4 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n    # \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
    worst_best_time_complexity.zig
    // \u751f\u6210\u4e00\u4e2a\u6570\u7ec4\uff0c\u5143\u7d20\u4e3a { 1, 2, ..., n }\uff0c\u987a\u5e8f\u88ab\u6253\u4e71\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u6570\u7ec4 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u968f\u673a\u6253\u4e71\u6570\u7ec4\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u627e\u6570\u7ec4 nums \u4e2d\u6570\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5934\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 O(1)\n        // \u5f53\u5143\u7d20 1 \u5728\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u8fbe\u5230\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6211\u4eec\u5728\u5b9e\u9645\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u56e0\u4e3a\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6982\u7387\u4e0b\u624d\u80fd\u8fbe\u5230\uff0c\u53ef\u80fd\u4f1a\u5e26\u6765\u4e00\u5b9a\u7684\u8bef\u5bfc\u6027\u3002\u800c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u4e3a\u5b9e\u7528\uff0c\u56e0\u4e3a\u5b83\u7ed9\u51fa\u4e86\u4e00\u4e2a\u6548\u7387\u5b89\u5168\u503c\uff0c\u8ba9\u6211\u4eec\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u7b97\u6cd5\u3002

    \u4ece\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ea\u51fa\u73b0\u4e8e\u201c\u7279\u6b8a\u7684\u6570\u636e\u5206\u5e03\u201d\uff0c\u8fd9\u4e9b\u60c5\u51b5\u7684\u51fa\u73b0\u6982\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u5e76\u4e0d\u80fd\u771f\u5b9e\u5730\u53cd\u6620\u7b97\u6cd5\u8fd0\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f53\u73b0\u7b97\u6cd5\u5728\u968f\u673a\u8f93\u5165\u6570\u636e\u4e0b\u7684\u8fd0\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8bb0\u53f7\u6765\u8868\u793a\u3002

    \u5bf9\u4e8e\u90e8\u5206\u7b97\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u5730\u63a8\u7b97\u51fa\u968f\u673a\u6570\u636e\u5206\u5e03\u4e0b\u7684\u5e73\u5747\u60c5\u51b5\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u4e8e\u8f93\u5165\u6570\u7ec4\u662f\u88ab\u6253\u4e71\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73b0\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6982\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u4e48\u7b97\u6cd5\u7684\u5e73\u5747\u5faa\u73af\u6b21\u6570\u5c31\u662f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

    \u4f46\u5bf9\u4e8e\u8f83\u4e3a\u590d\u6742\u7684\u7b97\u6cd5\uff0c\u8ba1\u7b97\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5f80\u5f80\u6bd4\u8f83\u56f0\u96be\uff0c\u56e0\u4e3a\u5f88\u96be\u5206\u6790\u51fa\u5728\u6570\u636e\u5206\u5e03\u4e0b\u7684\u6574\u4f53\u6570\u5b66\u671f\u671b\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4f5c\u4e3a\u7b97\u6cd5\u6548\u7387\u7684\u8bc4\u5224\u6807\u51c6\u3002

    \u4e3a\u4ec0\u4e48\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u53f7\uff1f

    \u53ef\u80fd\u7531\u4e8e \\(O\\) \u7b26\u53f7\u8fc7\u4e8e\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u4eec\u5e38\u5e38\u4f7f\u7528\u5b83\u6765\u8868\u793a\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u4f46\u4ece\u4e25\u683c\u610f\u4e49\u4e0a\u8bb2\uff0c\u8fd9\u79cd\u505a\u6cd5\u5e76\u4e0d\u89c4\u8303\u3002\u5728\u672c\u4e66\u548c\u5176\u4ed6\u8d44\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u7c7b\u4f3c\u201c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8bf7\u5c06\u5176\u76f4\u63a5\u7406\u89e3\u4e3a \\(\\Theta(n)\\) \u3002

    "},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u6570\u636e\u7ed3\u6784","text":"

    Abstract

    \u6570\u636e\u7ed3\u6784\u5982\u540c\u4e00\u526f\u7a33\u56fa\u800c\u591a\u6837\u7684\u6846\u67b6\u3002

    \u5b83\u4e3a\u6570\u636e\u7684\u6709\u5e8f\u7ec4\u7ec7\u63d0\u4f9b\u4e86\u84dd\u56fe\uff0c\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u7840\u4e0a\u751f\u52a8\u8d77\u6765\u3002

    "},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b
    • 3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b
    • 3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *
    • 3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *
    • 3.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b","text":"

    \u5f53\u8c08\u53ca\u8ba1\u7b97\u673a\u4e2d\u7684\u6570\u636e\u65f6\uff0c\u6211\u4eec\u4f1a\u60f3\u5230\u6587\u672c\u3001\u56fe\u7247\u3001\u89c6\u9891\u3001\u8bed\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u79cd\u5f62\u5f0f\u3002\u5c3d\u7ba1\u8fd9\u4e9b\u6570\u636e\u7684\u7ec4\u7ec7\u5f62\u5f0f\u5404\u5f02\uff0c\u4f46\u5b83\u4eec\u90fd\u7531\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6784\u6210\u3002

    \u57fa\u672c\u6570\u636e\u7c7b\u578b\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u8fdb\u884c\u8fd0\u7b97\u7684\u7c7b\u578b\uff0c\u5728\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u3002

    • \u6574\u6570\u7c7b\u578b byte\u3001short\u3001int\u3001long \u3002
    • \u6d6e\u70b9\u6570\u7c7b\u578b float\u3001double \uff0c\u7528\u4e8e\u8868\u793a\u5c0f\u6570\u3002
    • \u5b57\u7b26\u7c7b\u578b char \uff0c\u7528\u4e8e\u8868\u793a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u6bcd\u3001\u6807\u70b9\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002
    • \u5e03\u5c14\u7c7b\u578b bool \uff0c\u7528\u4e8e\u8868\u793a\u201c\u662f\u201d\u4e0e\u201c\u5426\u201d\u5224\u65ad\u3002

    \u57fa\u672c\u6570\u636e\u7c7b\u578b\u4ee5\u4e8c\u8fdb\u5236\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u3002\u4e00\u4e2a\u4e8c\u8fdb\u5236\u4f4d\u5373\u4e3a \\(1\\) \u6bd4\u7279\u3002\u5728\u7edd\u5927\u591a\u6570\u73b0\u4ee3\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\\(1\\) \u5b57\u8282\uff08byte\uff09\u7531 \\(8\\) \u6bd4\u7279\uff08bit\uff09\u7ec4\u6210\u3002

    \u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5176\u5360\u7528\u7684\u7a7a\u95f4\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u4e3a\u4f8b\u3002

    • \u6574\u6570\u7c7b\u578b byte \u5360\u7528 \\(1\\) \u5b57\u8282 = \\(8\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u4e2a\u6570\u5b57\u3002
    • \u6574\u6570\u7c7b\u578b int \u5360\u7528 \\(4\\) \u5b57\u8282 = \\(32\\) \u6bd4\u7279 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u4e2a\u6570\u5b57\u3002

    \u8868 3-1 \u5217\u4e3e\u4e86 Java \u4e2d\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u3002\u6b64\u8868\u683c\u65e0\u987b\u6b7b\u8bb0\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u65f6\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u6765\u56de\u5fc6\u3002

    \u8868 3-1 \u00a0 \u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5360\u7528\u7a7a\u95f4\u548c\u53d6\u503c\u8303\u56f4

    \u7c7b\u578b \u7b26\u53f7 \u5360\u7528\u7a7a\u95f4 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9ed8\u8ba4\u503c \u6574\u6570 byte 1 \u5b57\u8282 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u5b57\u8282 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u5b57\u8282 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u5b57\u8282 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u70b9\u6570 float 4 \u5b57\u8282 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u5b57\u8282 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u7b26 char 2 \u5b57\u8282 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u5c14 bool 1 \u5b57\u8282 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    \u8bf7\u6ce8\u610f\uff0c\u8868 3-1 \u9488\u5bf9\u7684\u662f Java \u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u60c5\u51b5\u3002\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u6709\u5404\u81ea\u7684\u6570\u636e\u7c7b\u578b\u5b9a\u4e49\uff0c\u5b83\u4eec\u7684\u5360\u7528\u7a7a\u95f4\u3001\u53d6\u503c\u8303\u56f4\u548c\u9ed8\u8ba4\u503c\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002

    • \u5728 Python \u4e2d\uff0c\u6574\u6570\u7c7b\u578b int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u4e8e\u53ef\u7528\u5185\u5b58\uff1b\u6d6e\u70b9\u6570 float \u662f\u53cc\u7cbe\u5ea6 64 \u4f4d\uff1b\u6ca1\u6709 char \u7c7b\u578b\uff0c\u5355\u4e2a\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32 str \u3002
    • C \u548c C++ \u672a\u660e\u786e\u89c4\u5b9a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5b9e\u73b0\u548c\u5e73\u53f0\u5404\u5f02\u3002\u8868 3-1 \u9075\u5faa LP64 \u6570\u636e\u6a21\u578b\uff0c\u5176\u7528\u4e8e\u5305\u62ec Linux \u548c macOS \u5728\u5185\u7684 Unix 64 \u4f4d\u64cd\u4f5c\u7cfb\u7edf\u3002
    • \u5b57\u7b26 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u4e3a 1 \u5b57\u8282\uff0c\u5728\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\u53d6\u51b3\u4e8e\u7279\u5b9a\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\uff0c\u8be6\u89c1\u201c\u5b57\u7b26\u7f16\u7801\u201d\u7ae0\u8282\u3002
    • \u5373\u4f7f\u8868\u793a\u5e03\u5c14\u91cf\u4ec5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u5185\u5b58\u4e2d\u901a\u5e38\u4e5f\u5b58\u50a8\u4e3a 1 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a\u73b0\u4ee3\u8ba1\u7b97\u673a CPU \u901a\u5e38\u5c06 1 \u5b57\u8282\u4f5c\u4e3a\u6700\u5c0f\u5bfb\u5740\u5185\u5b58\u5355\u5143\u3002

    \u90a3\u4e48\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u95f4\u6709\u4ec0\u4e48\u8054\u7cfb\u5462\uff1f\u6211\u4eec\u77e5\u9053\uff0c\u6570\u636e\u7ed3\u6784\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u4e0e\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002\u8fd9\u53e5\u8bdd\u7684\u4e3b\u8bed\u662f\u201c\u7ed3\u6784\u201d\u800c\u975e\u201c\u6570\u636e\u201d\u3002

    \u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6570\u5b57\u201d\uff0c\u6211\u4eec\u81ea\u7136\u4f1a\u60f3\u5230\u4f7f\u7528\u6570\u7ec4\u3002\u8fd9\u662f\u56e0\u4e3a\u6570\u7ec4\u7684\u7ebf\u6027\u7ed3\u6784\u53ef\u4ee5\u8868\u793a\u6570\u5b57\u7684\u76f8\u90bb\u5173\u7cfb\u548c\u987a\u5e8f\u5173\u7cfb\uff0c\u4f46\u81f3\u4e8e\u5b58\u50a8\u7684\u5185\u5bb9\u662f\u6574\u6570 int\u3001\u5c0f\u6570 float \u8fd8\u662f\u5b57\u7b26 char \uff0c\u5219\u4e0e\u201c\u6570\u636e\u7ed3\u6784\u201d\u65e0\u5173\u3002

    \u6362\u53e5\u8bdd\u8bf4\uff0c\u57fa\u672c\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u5185\u5bb9\u7c7b\u578b\u201d\uff0c\u800c\u6570\u636e\u7ed3\u6784\u63d0\u4f9b\u4e86\u6570\u636e\u7684\u201c\u7ec4\u7ec7\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u4ee3\u7801\uff0c\u6211\u4eec\u7528\u76f8\u540c\u7684\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\uff09\u6765\u5b58\u50a8\u4e0e\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u7b26\u5b9e\u9645\u4e0a\u662f\u957f\u5ea6\u4e3a 1 \u7684\u5b57\u7b26\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
    // JavaScript \u7684\u6570\u7ec4\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\nconst array = [0, 0.0, 'a', false];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0; 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
    // \u4f7f\u7528\u591a\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u6765\u521d\u59cb\u5316\u6570\u7ec4\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
    # Ruby \u7684\u5217\u8868\u53ef\u4ee5\u81ea\u7531\u5b58\u50a8\u5404\u79cd\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u5bf9\u8c61\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u7b26\u7f16\u7801 *","text":"

    \u5728\u8ba1\u7b97\u673a\u4e2d\uff0c\u6240\u6709\u6570\u636e\u90fd\u662f\u4ee5\u4e8c\u8fdb\u5236\u6570\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\uff0c\u5b57\u7b26 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u4e3a\u4e86\u8868\u793a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u89c4\u5b9a\u6bcf\u4e2a\u5b57\u7b26\u548c\u4e8c\u8fdb\u5236\u6570\u4e4b\u95f4\u7684\u4e00\u4e00\u5bf9\u5e94\u5173\u7cfb\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u540e\uff0c\u8ba1\u7b97\u673a\u5c31\u53ef\u4ee5\u901a\u8fc7\u67e5\u8868\u5b8c\u6210\u4e8c\u8fdb\u5236\u6570\u5230\u5b57\u7b26\u7684\u8f6c\u6362\u3002

    "},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1 \u00a0 ASCII \u5b57\u7b26\u96c6","text":"

    ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u79f0\u4e3a American Standard Code for Information Interchange\uff08\u7f8e\u56fd\u6807\u51c6\u4fe1\u606f\u4ea4\u6362\u4ee3\u7801\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u8fdb\u5236\u6570\uff08\u4e00\u4e2a\u5b57\u8282\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6700\u591a\u80fd\u591f\u8868\u793a 128 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002\u5982\u56fe 3-6 \u6240\u793a\uff0cASCII \u7801\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5199\u3001\u6570\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6807\u70b9\u7b26\u53f7\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u7b26\uff08\u5982\u6362\u884c\u7b26\u548c\u5236\u8868\u7b26\uff09\u3002

    \u56fe 3-6 \u00a0 ASCII \u7801

    \u7136\u800c\uff0cASCII \u7801\u4ec5\u80fd\u591f\u8868\u793a\u82f1\u6587\u3002\u968f\u7740\u8ba1\u7b97\u673a\u7684\u5168\u7403\u5316\uff0c\u8bde\u751f\u4e86\u4e00\u79cd\u80fd\u591f\u8868\u793a\u66f4\u591a\u8bed\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u7840\u4e0a\u6269\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u591f\u8868\u793a 256 \u4e2a\u4e0d\u540c\u7684\u5b57\u7b26\u3002

    \u5728\u4e16\u754c\u8303\u56f4\u5185\uff0c\u9646\u7eed\u51fa\u73b0\u4e86\u4e00\u6279\u9002\u7528\u4e8e\u4e0d\u540c\u5730\u533a\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u8fd9\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u4e2a\u5b57\u7b26\u7edf\u4e00\u4e3a ASCII \u7801\uff0c\u540e 128 \u4e2a\u5b57\u7b26\u5b9a\u4e49\u4e0d\u540c\uff0c\u4ee5\u9002\u5e94\u4e0d\u540c\u8bed\u8a00\u7684\u9700\u6c42\u3002

    "},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2 \u00a0 GBK \u5b57\u7b26\u96c6","text":"

    \u540e\u6765\u4eba\u4eec\u53d1\u73b0\uff0cEASCII \u7801\u4ecd\u7136\u65e0\u6cd5\u6ee1\u8db3\u8bb8\u591a\u8bed\u8a00\u7684\u5b57\u7b26\u6570\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6c49\u5b57\u6709\u8fd1\u5341\u4e07\u4e2a\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u51e0\u5343\u4e2a\u3002\u4e2d\u56fd\u56fd\u5bb6\u6807\u51c6\u603b\u5c40\u4e8e 1980 \u5e74\u53d1\u5e03\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u5f55\u4e86 6763 \u4e2a\u6c49\u5b57\uff0c\u57fa\u672c\u6ee1\u8db3\u4e86\u6c49\u5b57\u7684\u8ba1\u7b97\u673a\u5904\u7406\u9700\u8981\u3002

    \u7136\u800c\uff0cGB2312 \u65e0\u6cd5\u5904\u7406\u90e8\u5206\u7f55\u89c1\u5b57\u548c\u7e41\u4f53\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u7840\u4e0a\u6269\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u5f55\u4e86 21886 \u4e2a\u6c49\u5b57\u3002\u5728 GBK \u7684\u7f16\u7801\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u7b26\u4f7f\u7528\u4e00\u4e2a\u5b57\u8282\u8868\u793a\uff0c\u6c49\u5b57\u4f7f\u7528\u4e24\u4e2a\u5b57\u8282\u8868\u793a\u3002

    "},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3 \u00a0 Unicode \u5b57\u7b26\u96c6","text":"

    \u968f\u7740\u8ba1\u7b97\u673a\u6280\u672f\u7684\u84ec\u52c3\u53d1\u5c55\uff0c\u5b57\u7b26\u96c6\u4e0e\u7f16\u7801\u6807\u51c6\u767e\u82b1\u9f50\u653e\uff0c\u800c\u8fd9\u5e26\u6765\u4e86\u8bb8\u591a\u95ee\u9898\u3002\u4e00\u65b9\u9762\uff0c\u8fd9\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u4e49\u4e86\u7279\u5b9a\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u65e0\u6cd5\u5728\u591a\u8bed\u8a00\u73af\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u79cd\u8bed\u8a00\u5b58\u5728\u591a\u79cd\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u5982\u679c\u4e24\u53f0\u8ba1\u7b97\u673a\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7f16\u7801\u6807\u51c6\uff0c\u5219\u5728\u4fe1\u606f\u4f20\u9012\u65f6\u5c31\u4f1a\u51fa\u73b0\u4e71\u7801\u3002

    \u90a3\u4e2a\u65f6\u4ee3\u7684\u7814\u7a76\u4eba\u5458\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u4e2a\u8db3\u591f\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c06\u4e16\u754c\u8303\u56f4\u5185\u7684\u6240\u6709\u8bed\u8a00\u548c\u7b26\u53f7\u90fd\u6536\u5f55\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u51b3\u8de8\u8bed\u8a00\u73af\u5883\u548c\u4e71\u7801\u95ee\u9898\u4e86\u5417\uff1f\u5728\u8fd9\u79cd\u60f3\u6cd5\u7684\u9a71\u52a8\u4e0b\uff0c\u4e00\u4e2a\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u5e94\u8fd0\u800c\u751f\u3002

    Unicode \u7684\u4e2d\u6587\u540d\u79f0\u4e3a\u201c\u7edf\u4e00\u7801\u201d\uff0c\u7406\u8bba\u4e0a\u80fd\u5bb9\u7eb3 100 \u591a\u4e07\u4e2a\u5b57\u7b26\u3002\u5b83\u81f4\u529b\u4e8e\u5c06\u5168\u7403\u8303\u56f4\u5185\u7684\u5b57\u7b26\u7eb3\u5165\u7edf\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u79cd\u901a\u7528\u7684\u5b57\u7b26\u96c6\u6765\u5904\u7406\u548c\u663e\u793a\u5404\u79cd\u8bed\u8a00\u6587\u5b57\uff0c\u51cf\u5c11\u56e0\u4e3a\u7f16\u7801\u6807\u51c6\u4e0d\u540c\u800c\u4ea7\u751f\u7684\u4e71\u7801\u95ee\u9898\u3002

    \u81ea 1991 \u5e74\u53d1\u5e03\u4ee5\u6765\uff0cUnicode \u4e0d\u65ad\u6269\u5145\u65b0\u7684\u8bed\u8a00\u4e0e\u5b57\u7b26\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7ecf\u5305\u542b 149186 \u4e2a\u5b57\u7b26\uff0c\u5305\u62ec\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\u3001\u7b26\u53f7\u751a\u81f3\u8868\u60c5\u7b26\u53f7\u7b49\u3002\u5728\u5e9e\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u7b26\u5360\u7528 3 \u5b57\u8282\u751a\u81f3 4 \u5b57\u8282\u3002

    Unicode \u662f\u4e00\u79cd\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8d28\u4e0a\u662f\u7ed9\u6bcf\u4e2a\u5b57\u7b26\u5206\u914d\u4e00\u4e2a\u7f16\u53f7\uff08\u79f0\u4e3a\u201c\u7801\u70b9\u201d\uff09\uff0c\u4f46\u5b83\u5e76\u6ca1\u6709\u89c4\u5b9a\u5728\u8ba1\u7b97\u673a\u4e2d\u5982\u4f55\u5b58\u50a8\u8fd9\u4e9b\u5b57\u7b26\u7801\u70b9\u3002\u6211\u4eec\u4e0d\u7981\u4f1a\u95ee\uff1a\u5f53\u591a\u79cd\u957f\u5ea6\u7684 Unicode \u7801\u70b9\u540c\u65f6\u51fa\u73b0\u5728\u4e00\u4e2a\u6587\u672c\u4e2d\u65f6\uff0c\u7cfb\u7edf\u5982\u4f55\u89e3\u6790\u5b57\u7b26\uff1f\u4f8b\u5982\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u7684\u7f16\u7801\uff0c\u7cfb\u7edf\u5982\u4f55\u786e\u8ba4\u5b83\u662f\u4e00\u4e2a 2 \u5b57\u8282\u7684\u5b57\u7b26\u8fd8\u662f\u4e24\u4e2a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff1f

    \u5bf9\u4e8e\u4ee5\u4e0a\u95ee\u9898\uff0c\u4e00\u79cd\u76f4\u63a5\u7684\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u6240\u6709\u5b57\u7b26\u5b58\u50a8\u4e3a\u7b49\u957f\u7684\u7f16\u7801\u3002\u5982\u56fe 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff0c\u201c\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9ad8\u4f4d\u586b 0 \u5c06\u201cHello \u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u7b26\u90fd\u7f16\u7801\u4e3a 2 \u5b57\u8282\u957f\u5ea6\u3002\u8fd9\u6837\u7cfb\u7edf\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u5b57\u8282\u89e3\u6790\u4e00\u4e2a\u5b57\u7b26\uff0c\u6062\u590d\u8fd9\u4e2a\u77ed\u8bed\u7684\u5185\u5bb9\u4e86\u3002

    \u56fe 3-7 \u00a0 Unicode \u7f16\u7801\u793a\u4f8b

    \u7136\u800c ASCII \u7801\u5df2\u7ecf\u5411\u6211\u4eec\u8bc1\u660e\uff0c\u7f16\u7801\u82f1\u6587\u53ea\u9700 1 \u5b57\u8282\u3002\u82e5\u91c7\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u672c\u5360\u7528\u7a7a\u95f4\u7684\u5927\u5c0f\u5c06\u4f1a\u662f ASCII \u7f16\u7801\u4e0b\u7684\u4e24\u500d\uff0c\u975e\u5e38\u6d6a\u8d39\u5185\u5b58\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002

    "},{"location":"chapter_data_structure/character_encoding/#344-utf-8","title":"3.4.4 \u00a0 UTF-8 \u7f16\u7801","text":"

    \u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u4e3a\u56fd\u9645\u4e0a\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u79cd\u53ef\u53d8\u957f\u5ea6\u7684\u7f16\u7801\uff0c\u4f7f\u7528 1 \u5230 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\uff0c\u6839\u636e\u5b57\u7b26\u7684\u590d\u6742\u6027\u800c\u53d8\u3002ASCII \u5b57\u7b26\u53ea\u9700 1 \u5b57\u8282\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u814a\u5b57\u6bcd\u9700\u8981 2 \u5b57\u8282\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u9700\u8981 3 \u5b57\u8282\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u7b26\u9700\u8981 4 \u5b57\u8282\u3002

    UTF-8 \u7684\u7f16\u7801\u89c4\u5219\u5e76\u4e0d\u590d\u6742\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a 1 \u5b57\u8282\u7684\u5b57\u7b26\uff0c\u5c06\u6700\u9ad8\u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff0c\u5176\u4f59 7 \u4f4d\u8bbe\u7f6e\u4e3a Unicode \u7801\u70b9\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u7b26\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u5360\u636e\u4e86\u524d 128 \u4e2a\u7801\u70b9\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cUTF-8 \u7f16\u7801\u53ef\u4ee5\u5411\u4e0b\u517c\u5bb9 ASCII \u7801\u3002\u8fd9\u610f\u5473\u7740\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u6765\u89e3\u6790\u5e74\u4ee3\u4e45\u8fdc\u7684 ASCII \u7801\u6587\u672c\u3002
    • \u5bf9\u4e8e\u957f\u5ea6\u4e3a \\(n\\) \u5b57\u8282\u7684\u5b57\u7b26\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c06\u9996\u4e2a\u5b57\u8282\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8bbe\u7f6e\u4e3a \\(0\\) \uff1b\u4ece\u7b2c\u4e8c\u4e2a\u5b57\u8282\u5f00\u59cb\uff0c\u5c06\u6bcf\u4e2a\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \uff1b\u5176\u4f59\u6240\u6709\u4f4d\u7528\u4e8e\u586b\u5145\u5b57\u7b26\u7684 Unicode \u7801\u70b9\u3002

    \u56fe 3-8 \u5c55\u793a\u4e86\u201cHello\u7b97\u6cd5\u201d\u5bf9\u5e94\u7684 UTF-8 \u7f16\u7801\u3002\u89c2\u5bdf\u53d1\u73b0\uff0c\u7531\u4e8e\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7edf\u53ef\u4ee5\u901a\u8fc7\u8bfb\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u4e2a\u6570\u6765\u89e3\u6790\u51fa\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(n\\) \u3002

    \u4f46\u4e3a\u4ec0\u4e48\u8981\u5c06\u5176\u4f59\u6240\u6709\u5b57\u8282\u7684\u9ad8 2 \u4f4d\u90fd\u8bbe\u7f6e\u4e3a \\(10\\) \u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u8fd9\u4e2a \\(10\\) \u80fd\u591f\u8d77\u5230\u6821\u9a8c\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8bbe\u7cfb\u7edf\u4ece\u4e00\u4e2a\u9519\u8bef\u7684\u5b57\u8282\u5f00\u59cb\u89e3\u6790\u6587\u672c\uff0c\u5b57\u8282\u5934\u90e8\u7684 \\(10\\) \u80fd\u591f\u5e2e\u52a9\u7cfb\u7edf\u5feb\u901f\u5224\u65ad\u51fa\u5f02\u5e38\u3002

    \u4e4b\u6240\u4ee5\u5c06 \\(10\\) \u5f53\u4f5c\u6821\u9a8c\u7b26\uff0c\u662f\u56e0\u4e3a\u5728 UTF-8 \u7f16\u7801\u89c4\u5219\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \u3002\u8fd9\u4e2a\u7ed3\u8bba\u53ef\u4ee5\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\uff1a\u5047\u8bbe\u4e00\u4e2a\u5b57\u7b26\u7684\u6700\u9ad8\u4e24\u4f4d\u662f \\(10\\) \uff0c\u8bf4\u660e\u8be5\u5b57\u7b26\u7684\u957f\u5ea6\u4e3a \\(1\\) \uff0c\u5bf9\u5e94 ASCII \u7801\u3002\u800c ASCII \u7801\u7684\u6700\u9ad8\u4f4d\u5e94\u8be5\u662f \\(0\\) \uff0c\u4e0e\u5047\u8bbe\u77db\u76fe\u3002

    \u56fe 3-8 \u00a0 UTF-8 \u7f16\u7801\u793a\u4f8b

    \u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u89c1\u7684\u7f16\u7801\u65b9\u5f0f\u8fd8\u5305\u62ec\u4ee5\u4e0b\u4e24\u79cd\u3002

    • UTF-16 \u7f16\u7801\uff1a\u4f7f\u7528 2 \u6216 4 \u5b57\u8282\u6765\u8868\u793a\u4e00\u4e2a\u5b57\u7b26\u3002\u6240\u6709\u7684 ASCII \u5b57\u7b26\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u7b26\uff0c\u90fd\u7528 2 \u5b57\u8282\u8868\u793a\uff1b\u5c11\u6570\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u5b57\u8282\u8868\u793a\u3002\u5bf9\u4e8e 2 \u5b57\u8282\u7684\u5b57\u7b26\uff0cUTF-16 \u7f16\u7801\u4e0e Unicode \u7801\u70b9\u76f8\u7b49\u3002
    • UTF-32 \u7f16\u7801\uff1a\u6bcf\u4e2a\u5b57\u7b26\u90fd\u4f7f\u7528 4 \u5b57\u8282\u3002\u8fd9\u610f\u5473\u7740 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u5360\u7528\u7a7a\u95f4\uff0c\u7279\u522b\u662f\u5bf9\u4e8e ASCII \u5b57\u7b26\u5360\u6bd4\u8f83\u9ad8\u7684\u6587\u672c\u3002

    \u4ece\u5b58\u50a8\u7a7a\u95f4\u5360\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u7b26\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 1 \u5b57\u8282\uff1b\u4f7f\u7528 UTF-16 \u7f16\u7801\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u7b26\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u4f1a\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u4e3a\u5b83\u4ec5\u9700 2 \u5b57\u8282\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u5b57\u8282\u3002

    \u4ece\u517c\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8bb8\u591a\u5de5\u5177\u548c\u5e93\u4f18\u5148\u652f\u6301 UTF-8 \u3002

    "},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801","text":"

    \u5bf9\u4e8e\u4ee5\u5f80\u7684\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\uff0c\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u7684\u5b57\u7b26\u4e32\u90fd\u91c7\u7528 UTF-16 \u6216 UTF-32 \u8fd9\u7c7b\u7b49\u957f\u7f16\u7801\u3002\u5728\u7b49\u957f\u7f16\u7801\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b57\u7b26\u4e32\u770b\u4f5c\u6570\u7ec4\u6765\u5904\u7406\uff0c\u8fd9\u79cd\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

    • \u968f\u673a\u8bbf\u95ee\uff1aUTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u8fdb\u884c\u968f\u673a\u8bbf\u95ee\u3002UTF-8 \u662f\u4e00\u79cd\u53d8\u957f\u7f16\u7801\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u6211\u4eec\u9700\u8981\u4ece\u5b57\u7b26\u4e32\u7684\u5f00\u59cb\u5904\u904d\u5386\u5230\u7b2c \\(i\\) \u4e2a\u5b57\u7b26\uff0c\u8fd9\u9700\u8981 \\(O(n)\\) \u7684\u65f6\u95f4\u3002
    • \u5b57\u7b26\u8ba1\u6570\uff1a\u4e0e\u968f\u673a\u8bbf\u95ee\u7c7b\u4f3c\uff0c\u8ba1\u7b97 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8ba1\u7b97 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\u9700\u8981\u904d\u5386\u6574\u4e2a\u5b57\u7b26\u4e32\u3002
    • \u5b57\u7b26\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u7b26\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u8fde\u63a5\u3001\u63d2\u5165\u3001\u5220\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u8fdb\u884c\u3002\u5728 UTF-8 \u7f16\u7801\u7684\u5b57\u7b26\u4e32\u4e0a\uff0c\u8fdb\u884c\u8fd9\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u989d\u5916\u7684\u8ba1\u7b97\uff0c\u4ee5\u786e\u4fdd\u4e0d\u4f1a\u4ea7\u751f\u65e0\u6548\u7684 UTF-8 \u7f16\u7801\u3002

    \u5b9e\u9645\u4e0a\uff0c\u7f16\u7a0b\u8bed\u8a00\u7684\u5b57\u7b26\u7f16\u7801\u65b9\u6848\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5f88\u6709\u8da3\u7684\u8bdd\u9898\uff0c\u6d89\u53ca\u8bb8\u591a\u56e0\u7d20\u3002

    • Java \u7684 String \u7c7b\u578b\u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\u3002\u8fd9\u662f\u56e0\u4e3a Java \u8bed\u8a00\u8bbe\u8ba1\u4e4b\u521d\uff0c\u4eba\u4eec\u8ba4\u4e3a 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u7b26\u3002\u7136\u800c\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u6b63\u786e\u7684\u5224\u65ad\u3002\u540e\u6765 Unicode \u89c4\u8303\u6269\u5c55\u5230\u4e86\u8d85\u8fc7 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u7b26\u73b0\u5728\u53ef\u80fd\u7531\u4e00\u5bf9 16 \u4f4d\u7684\u503c\uff08\u79f0\u4e3a\u201c\u4ee3\u7406\u5bf9\u201d\uff09\u8868\u793a\u3002
    • JavaScript \u548c TypeScript \u7684\u5b57\u7b26\u4e32\u4f7f\u7528 UTF-16 \u7f16\u7801\u7684\u539f\u56e0\u4e0e Java \u7c7b\u4f3c\u3002\u5f53 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8bed\u8a00\u65f6\uff0cUnicode \u8fd8\u5904\u4e8e\u53d1\u5c55\u65e9\u671f\uff0c\u90a3\u65f6\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7f16\u7801\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u7b26\u4e86\u3002
    • C# \u4f7f\u7528 UTF-16 \u7f16\u7801\uff0c\u4e3b\u8981\u662f\u56e0\u4e3a .NET \u5e73\u53f0\u662f\u7531 Microsoft \u8bbe\u8ba1\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u672f\uff08\u5305\u62ec Windows \u64cd\u4f5c\u7cfb\u7edf\uff09\u90fd\u5e7f\u6cdb\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002

    \u7531\u4e8e\u4ee5\u4e0a\u7f16\u7a0b\u8bed\u8a00\u5bf9\u5b57\u7b26\u6570\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u4eec\u4e0d\u5f97\u4e0d\u91c7\u53d6\u201c\u4ee3\u7406\u5bf9\u201d\u7684\u65b9\u5f0f\u6765\u8868\u793a\u8d85\u8fc7 16 \u4f4d\u957f\u5ea6\u7684 Unicode \u5b57\u7b26\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u5f97\u5df2\u4e3a\u4e4b\u7684\u65e0\u5948\u4e4b\u4e3e\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5bf9\u7684\u5b57\u7b26\u4e32\u4e2d\uff0c\u4e00\u4e2a\u5b57\u7b26\u53ef\u80fd\u5360\u7528 2 \u5b57\u8282\u6216 4 \u5b57\u8282\uff0c\u4ece\u800c\u4e27\u5931\u4e86\u7b49\u957f\u7f16\u7801\u7684\u4f18\u52bf\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u5904\u7406\u4ee3\u7406\u5bf9\u9700\u8981\u989d\u5916\u589e\u52a0\u4ee3\u7801\uff0c\u8fd9\u63d0\u9ad8\u4e86\u7f16\u7a0b\u7684\u590d\u6742\u6027\u548c\u8c03\u8bd5\u96be\u5ea6\u3002

    \u51fa\u4e8e\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7f16\u7a0b\u8bed\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7f16\u7801\u65b9\u6848\u3002

    • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7f16\u7801\uff0c\u5e76\u91c7\u7528\u4e00\u79cd\u7075\u6d3b\u7684\u5b57\u7b26\u4e32\u8868\u793a\uff0c\u5b58\u50a8\u7684\u5b57\u7b26\u957f\u5ea6\u53d6\u51b3\u4e8e\u5b57\u7b26\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u7801\u70b9\u3002\u82e5\u5b57\u7b26\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 1 \u5b57\u8282\uff1b\u5982\u679c\u6709\u5b57\u7b26\u8d85\u51fa\u4e86 ASCII \u8303\u56f4\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8bed\u8a00\u5e73\u9762\uff08BMP\uff09\u5185\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 2 \u5b57\u8282\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u7b26\uff0c\u5219\u6bcf\u4e2a\u5b57\u7b26\u5360\u7528 4 \u5b57\u8282\u3002
    • Go \u8bed\u8a00\u7684 string \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Go \u8bed\u8a00\u8fd8\u63d0\u4f9b\u4e86 rune \u7c7b\u578b\uff0c\u5b83\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002
    • Rust \u8bed\u8a00\u7684 str \u548c String \u7c7b\u578b\u5728\u5185\u90e8\u4f7f\u7528 UTF-8 \u7f16\u7801\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u7c7b\u578b\uff0c\u7528\u4e8e\u8868\u793a\u5355\u4e2a Unicode \u7801\u70b9\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8ba8\u8bba\u7684\u90fd\u662f\u5b57\u7b26\u4e32\u5728\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u8fd9\u548c\u5b57\u7b26\u4e32\u5982\u4f55\u5728\u6587\u4ef6\u4e2d\u5b58\u50a8\u6216\u5728\u7f51\u7edc\u4e2d\u4f20\u8f93\u662f\u4e0d\u540c\u7684\u95ee\u9898\u3002\u5728\u6587\u4ef6\u5b58\u50a8\u6216\u7f51\u7edc\u4f20\u8f93\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u5b57\u7b26\u4e32\u7f16\u7801\u4e3a UTF-8 \u683c\u5f0f\uff0c\u4ee5\u8fbe\u5230\u6700\u4f18\u7684\u517c\u5bb9\u6027\u548c\u7a7a\u95f4\u6548\u7387\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u6570\u636e\u7ed3\u6784\u5206\u7c7b","text":"

    \u5e38\u89c1\u7684\u6570\u636e\u7ed3\u6784\u5305\u62ec\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\uff0c\u5b83\u4eec\u53ef\u4ee5\u4ece\u201c\u903b\u8f91\u7ed3\u6784\u201d\u548c\u201c\u7269\u7406\u7ed3\u6784\u201d\u4e24\u4e2a\u7ef4\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u903b\u8f91\u7ed3\u6784\uff1a\u7ebf\u6027\u4e0e\u975e\u7ebf\u6027","text":"

    \u903b\u8f91\u7ed3\u6784\u63ed\u793a\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\u3002\u5728\u6570\u7ec4\u548c\u94fe\u8868\u4e2d\uff0c\u6570\u636e\u6309\u7167\u4e00\u5b9a\u987a\u5e8f\u6392\u5217\uff0c\u4f53\u73b0\u4e86\u6570\u636e\u4e4b\u95f4\u7684\u7ebf\u6027\u5173\u7cfb\uff1b\u800c\u5728\u6811\u4e2d\uff0c\u6570\u636e\u4ece\u9876\u90e8\u5411\u4e0b\u6309\u5c42\u6b21\u6392\u5217\uff0c\u8868\u73b0\u51fa\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff1b\u56fe\u5219\u7531\u8282\u70b9\u548c\u8fb9\u6784\u6210\uff0c\u53cd\u6620\u4e86\u590d\u6742\u7684\u7f51\u7edc\u5173\u7cfb\u3002

    \u5982\u56fe 3-1 \u6240\u793a\uff0c\u903b\u8f91\u7ed3\u6784\u53ef\u5206\u4e3a\u201c\u7ebf\u6027\u201d\u548c\u201c\u975e\u7ebf\u6027\u201d\u4e24\u5927\u7c7b\u3002\u7ebf\u6027\u7ed3\u6784\u6bd4\u8f83\u76f4\u89c2\uff0c\u6307\u6570\u636e\u5728\u903b\u8f91\u5173\u7cfb\u4e0a\u5448\u7ebf\u6027\u6392\u5217\uff1b\u975e\u7ebf\u6027\u7ed3\u6784\u5219\u76f8\u53cd\uff0c\u5448\u975e\u7ebf\u6027\u6392\u5217\u3002

    • \u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u4e00\u7684\u987a\u5e8f\u5173\u7cfb\u3002
    • \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u56fe\u3001\u54c8\u5e0c\u8868\u3002

    \u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u8fdb\u4e00\u6b65\u5212\u5206\u4e3a\u6811\u5f62\u7ed3\u6784\u548c\u7f51\u72b6\u7ed3\u6784\u3002

    • \u6811\u5f62\u7ed3\u6784\uff1a\u6811\u3001\u5806\u3001\u54c8\u5e0c\u8868\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u4e00\u5bf9\u591a\u7684\u5173\u7cfb\u3002
    • \u7f51\u72b6\u7ed3\u6784\uff1a\u56fe\uff0c\u5143\u7d20\u4e4b\u95f4\u662f\u591a\u5bf9\u591a\u7684\u5173\u7cfb\u3002

    \u56fe 3-1 \u00a0 \u7ebf\u6027\u6570\u636e\u7ed3\u6784\u4e0e\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784

    "},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7ed3\u6784\uff1a\u8fde\u7eed\u4e0e\u5206\u6563","text":"

    \u5f53\u7b97\u6cd5\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6b63\u5728\u5904\u7406\u7684\u6570\u636e\u4e3b\u8981\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\u3002\u56fe 3-2 \u5c55\u793a\u4e86\u4e00\u4e2a\u8ba1\u7b97\u673a\u5185\u5b58\u6761\uff0c\u5176\u4e2d\u6bcf\u4e2a\u9ed1\u8272\u65b9\u5757\u90fd\u5305\u542b\u4e00\u5757\u5185\u5b58\u7a7a\u95f4\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u5185\u5b58\u60f3\u8c61\u6210\u4e00\u4e2a\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5355\u5143\u683c\u90fd\u53ef\u4ee5\u5b58\u50a8\u4e00\u5b9a\u5927\u5c0f\u7684\u6570\u636e\u3002

    \u7cfb\u7edf\u901a\u8fc7\u5185\u5b58\u5730\u5740\u6765\u8bbf\u95ee\u76ee\u6807\u4f4d\u7f6e\u7684\u6570\u636e\u3002\u5982\u56fe 3-2 \u6240\u793a\uff0c\u8ba1\u7b97\u673a\u6839\u636e\u7279\u5b9a\u89c4\u5219\u4e3a\u8868\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5206\u914d\u7f16\u53f7\uff0c\u786e\u4fdd\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u6709\u552f\u4e00\u7684\u5185\u5b58\u5730\u5740\u3002\u6709\u4e86\u8fd9\u4e9b\u5730\u5740\uff0c\u7a0b\u5e8f\u4fbf\u53ef\u4ee5\u8bbf\u95ee\u5185\u5b58\u4e2d\u7684\u6570\u636e\u3002

    \u56fe 3-2 \u00a0 \u5185\u5b58\u6761\u3001\u5185\u5b58\u7a7a\u95f4\u3001\u5185\u5b58\u5730\u5740

    Tip

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5c06\u5185\u5b58\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u4e2a\u7b80\u5316\u7684\u7c7b\u6bd4\uff0c\u5b9e\u9645\u5185\u5b58\u7684\u5de5\u4f5c\u673a\u5236\u6bd4\u8f83\u590d\u6742\uff0c\u6d89\u53ca\u5730\u5740\u7a7a\u95f4\u3001\u5185\u5b58\u7ba1\u7406\u3001\u7f13\u5b58\u673a\u5236\u3001\u865a\u62df\u5185\u5b58\u548c\u7269\u7406\u5185\u5b58\u7b49\u6982\u5ff5\u3002

    \u5185\u5b58\u662f\u6240\u6709\u7a0b\u5e8f\u7684\u5171\u4eab\u8d44\u6e90\uff0c\u5f53\u67d0\u5757\u5185\u5b58\u88ab\u67d0\u4e2a\u7a0b\u5e8f\u5360\u7528\u65f6\uff0c\u5219\u65e0\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5e8f\u540c\u65f6\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8bbe\u8ba1\u4e2d\uff0c\u5185\u5b58\u8d44\u6e90\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u8003\u8651\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u7b97\u6cd5\u6240\u5360\u7528\u7684\u5185\u5b58\u5cf0\u503c\u4e0d\u5e94\u8d85\u8fc7\u7cfb\u7edf\u5269\u4f59\u7a7a\u95f2\u5185\u5b58\uff1b\u5982\u679c\u7f3a\u5c11\u8fde\u7eed\u5927\u5757\u7684\u5185\u5b58\u7a7a\u95f4\uff0c\u90a3\u4e48\u6240\u9009\u7528\u7684\u6570\u636e\u7ed3\u6784\u5fc5\u987b\u80fd\u591f\u5b58\u50a8\u5728\u5206\u6563\u7684\u5185\u5b58\u7a7a\u95f4\u5185\u3002

    \u5982\u56fe 3-3 \u6240\u793a\uff0c\u7269\u7406\u7ed3\u6784\u53cd\u6620\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\uff0c\u53ef\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u7269\u7406\u7ed3\u6784\u4ece\u5e95\u5c42\u51b3\u5b9a\u4e86\u6570\u636e\u7684\u8bbf\u95ee\u3001\u66f4\u65b0\u3001\u589e\u5220\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u4e24\u79cd\u7269\u7406\u7ed3\u6784\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u65b9\u9762\u5448\u73b0\u51fa\u4e92\u8865\u7684\u7279\u70b9\u3002

    \u56fe 3-3 \u00a0 \u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\u4e0e\u5206\u6563\u7a7a\u95f4\u5b58\u50a8

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u57fa\u4e8e\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e8c\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002\u4f8b\u5982\uff0c\u6808\u548c\u961f\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\uff1b\u800c\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u6570\u7ec4\u548c\u94fe\u8868\u3002

    • \u57fa\u4e8e\u6570\u7ec4\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u3001\u77e9\u9635\u3001\u5f20\u91cf\uff08\u7ef4\u5ea6 \\(\\geq 3\\) \u7684\u6570\u7ec4\uff09\u7b49\u3002
    • \u57fa\u4e8e\u94fe\u8868\u53ef\u5b9e\u73b0\uff1a\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u3002

    \u94fe\u8868\u5728\u521d\u59cb\u5316\u540e\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u5bf9\u5176\u957f\u5ea6\u8fdb\u884c\u8c03\u6574\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u52a8\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u6570\u7ec4\u5728\u521d\u59cb\u5316\u540e\u957f\u5ea6\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u7ec4\u53ef\u901a\u8fc7\u91cd\u65b0\u5206\u914d\u5185\u5b58\u5b9e\u73b0\u957f\u5ea6\u53d8\u5316\uff0c\u4ece\u800c\u5177\u5907\u4e00\u5b9a\u7684\u201c\u52a8\u6001\u6027\u201d\u3002

    Tip

    \u5982\u679c\u4f60\u611f\u89c9\u7269\u7406\u7ed3\u6784\u7406\u89e3\u8d77\u6765\u6709\u56f0\u96be\uff0c\u5efa\u8bae\u5148\u9605\u8bfb\u4e0b\u4e00\u7ae0\uff0c\u7136\u540e\u518d\u56de\u987e\u672c\u8282\u5185\u5bb9\u3002

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6570\u5b57\u7f16\u7801 *","text":"

    Tip

    \u5728\u672c\u4e66\u4e2d\uff0c\u6807\u9898\u5e26\u6709 * \u7b26\u53f7\u7684\u662f\u9009\u8bfb\u7ae0\u8282\u3002\u5982\u679c\u4f60\u65f6\u95f4\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96be\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\uff0c\u7b49\u5b66\u5b8c\u5fc5\u8bfb\u7ae0\u8282\u540e\u518d\u5355\u72ec\u653b\u514b\u3002

    "},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801","text":"

    \u5728\u4e0a\u4e00\u8282\u7684\u8868\u683c\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6240\u6709\u6574\u6570\u7c7b\u578b\u80fd\u591f\u8868\u793a\u7684\u8d1f\u6570\u90fd\u6bd4\u6b63\u6570\u591a\u4e00\u4e2a\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \u3002\u8fd9\u4e2a\u73b0\u8c61\u6bd4\u8f83\u53cd\u76f4\u89c9\uff0c\u5b83\u7684\u5185\u5728\u539f\u56e0\u6d89\u53ca\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u76f8\u5173\u77e5\u8bc6\u3002

    \u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6570\u5b57\u662f\u4ee5\u201c\u8865\u7801\u201d\u7684\u5f62\u5f0f\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u4e2d\u7684\u3002\u5728\u5206\u6790\u8fd9\u6837\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7ed9\u51fa\u4e09\u8005\u7684\u5b9a\u4e49\u3002

    • \u539f\u7801\uff1a\u6211\u4eec\u5c06\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u89c6\u4e3a\u7b26\u53f7\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6570\uff0c\\(1\\) \u8868\u793a\u8d1f\u6570\uff0c\u5176\u4f59\u4f4d\u8868\u793a\u6570\u5b57\u7684\u503c\u3002
    • \u53cd\u7801\uff1a\u6b63\u6570\u7684\u53cd\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u53cd\u7801\u662f\u5bf9\u5176\u539f\u7801\u9664\u7b26\u53f7\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
    • \u8865\u7801\uff1a\u6b63\u6570\u7684\u8865\u7801\u4e0e\u5176\u539f\u7801\u76f8\u540c\uff0c\u8d1f\u6570\u7684\u8865\u7801\u662f\u5728\u5176\u53cd\u7801\u7684\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u3002

    \u56fe 3-4 \u5c55\u793a\u4e86\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u4e4b\u95f4\u7684\u8f6c\u6362\u65b9\u6cd5\u3002

    \u56fe 3-4 \u00a0 \u539f\u7801\u3001\u53cd\u7801\u4e0e\u8865\u7801\u4e4b\u95f4\u7684\u76f8\u4e92\u8f6c\u6362

    \u539f\u7801\uff08sign-magnitude\uff09\u867d\u7136\u6700\u76f4\u89c2\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8d1f\u6570\u7684\u539f\u7801\u4e0d\u80fd\u76f4\u63a5\u7528\u4e8e\u8fd0\u7b97\u3002\u4f8b\u5982\u5728\u539f\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7ed3\u679c\u662f \\(-3\\) \uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

    \u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u8ba1\u7b97\u673a\u5f15\u5165\u4e86\u53cd\u7801\uff081's complement\uff09\u3002\u5982\u679c\u6211\u4eec\u5148\u5c06\u539f\u7801\u8f6c\u6362\u4e3a\u53cd\u7801\uff0c\u5e76\u5728\u53cd\u7801\u4e0b\u8ba1\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u540e\u5c06\u7ed3\u679c\u4ece\u53cd\u7801\u8f6c\u6362\u56de\u539f\u7801\uff0c\u5219\u53ef\u5f97\u5230\u6b63\u786e\u7ed3\u679c \\(-1\\) \u3002

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(\u539f\u7801)} + 1000 \\; 0010 \\; \\text{(\u539f\u7801)} \\newline & = 0000 \\; 0001 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1101 \\; \\text{(\u53cd\u7801)} \\newline & = 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & \\rightarrow -1 \\end{aligned} \\]

    \u53e6\u4e00\u65b9\u9762\uff0c\u6570\u5b57\u96f6\u7684\u539f\u7801\u6709 \\(+0\\) \u548c \\(-0\\) \u4e24\u79cd\u8868\u793a\u65b9\u5f0f\u3002\u8fd9\u610f\u5473\u7740\u6570\u5b57\u96f6\u5bf9\u5e94\u4e24\u4e2a\u4e0d\u540c\u7684\u4e8c\u8fdb\u5236\u7f16\u7801\uff0c\u8fd9\u53ef\u80fd\u4f1a\u5e26\u6765\u6b67\u4e49\u3002\u6bd4\u5982\u5728\u6761\u4ef6\u5224\u65ad\u4e2d\uff0c\u5982\u679c\u6ca1\u6709\u533a\u5206\u6b63\u96f6\u548c\u8d1f\u96f6\uff0c\u5219\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5224\u65ad\u7ed3\u679c\u51fa\u9519\u3002\u800c\u5982\u679c\u6211\u4eec\u60f3\u5904\u7406\u6b63\u96f6\u548c\u8d1f\u96f6\u6b67\u4e49\uff0c\u5219\u9700\u8981\u5f15\u5165\u989d\u5916\u7684\u5224\u65ad\u64cd\u4f5c\uff0c\u8fd9\u53ef\u80fd\u4f1a\u964d\u4f4e\u8ba1\u7b97\u673a\u7684\u8fd0\u7b97\u6548\u7387\u3002

    \\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

    \u4e0e\u539f\u7801\u4e00\u6837\uff0c\u53cd\u7801\u4e5f\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u95ee\u9898\uff0c\u56e0\u6b64\u8ba1\u7b97\u673a\u8fdb\u4e00\u6b65\u5f15\u5165\u4e86\u8865\u7801\uff082's complement\uff09\u3002\u6211\u4eec\u5148\u6765\u89c2\u5bdf\u4e00\u4e0b\u8d1f\u96f6\u7684\u539f\u7801\u3001\u53cd\u7801\u3001\u8865\u7801\u7684\u8f6c\u6362\u8fc7\u7a0b\uff1a

    \\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u7801)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u53cd\u7801)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline \\end{aligned} \\]

    \u5728\u8d1f\u96f6\u7684\u53cd\u7801\u57fa\u7840\u4e0a\u52a0 \\(1\\) \u4f1a\u4ea7\u751f\u8fdb\u4f4d\uff0c\u4f46 byte \u7c7b\u578b\u7684\u957f\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u51fa\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u4f1a\u88ab\u820d\u5f03\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8d1f\u96f6\u7684\u8865\u7801\u4e3a \\(0000 \\; 0000\\) \uff0c\u4e0e\u6b63\u96f6\u7684\u8865\u7801\u76f8\u540c\u3002\u8fd9\u610f\u5473\u7740\u5728\u8865\u7801\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u4e2a\u96f6\uff0c\u6b63\u8d1f\u96f6\u6b67\u4e49\u4ece\u800c\u5f97\u5230\u89e3\u51b3\u3002

    \u8fd8\u5269\u6700\u540e\u4e00\u4e2a\u7591\u60d1\uff1abyte \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u6765\u7684\u4e00\u4e2a\u8d1f\u6570 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u4eec\u6ce8\u610f\u5230\uff0c\u533a\u95f4 \\([-127, +127]\\) \u5185\u7684\u6240\u6709\u6574\u6570\u90fd\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\uff0c\u5e76\u4e14\u539f\u7801\u548c\u8865\u7801\u4e4b\u95f4\u53ef\u4ee5\u4e92\u76f8\u8f6c\u6362\u3002

    \u7136\u800c\uff0c\u8865\u7801 \\(1000 \\; 0000\\) \u662f\u4e00\u4e2a\u4f8b\u5916\uff0c\u5b83\u5e76\u6ca1\u6709\u5bf9\u5e94\u7684\u539f\u7801\u3002\u6839\u636e\u8f6c\u6362\u65b9\u6cd5\uff0c\u6211\u4eec\u5f97\u5230\u8be5\u8865\u7801\u7684\u539f\u7801\u4e3a \\(0000 \\; 0000\\) \u3002\u8fd9\u663e\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u4e3a\u8be5\u539f\u7801\u8868\u793a\u6570\u5b57 \\(0\\) \uff0c\u5b83\u7684\u8865\u7801\u5e94\u8be5\u662f\u81ea\u8eab\u3002\u8ba1\u7b97\u673a\u89c4\u5b9a\u8fd9\u4e2a\u7279\u6b8a\u7684\u8865\u7801 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5b9e\u9645\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u8865\u7801\u4e0b\u7684\u8ba1\u7b97\u7ed3\u679c\u5c31\u662f \\(-128\\) \u3002

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u7801)} + 1000 \\; 0001 \\; \\text{(\u539f\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u53cd\u7801)} + 1111 \\; 1110 \\; \\text{(\u53cd\u7801)} \\newline & = 1000 \\; 0001 \\; \\text{(\u8865\u7801)} + 1111 \\; 1111 \\; \\text{(\u8865\u7801)} \\newline & = 1000 \\; 0000 \\; \\text{(\u8865\u7801)} \\newline & \\rightarrow -128 \\end{aligned} \\]

    \u4f60\u53ef\u80fd\u5df2\u7ecf\u53d1\u73b0\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8ba1\u7b97\u90fd\u662f\u52a0\u6cd5\u8fd0\u7b97\u3002\u8fd9\u6697\u793a\u7740\u4e00\u4e2a\u91cd\u8981\u4e8b\u5b9e\uff1a\u8ba1\u7b97\u673a\u5185\u90e8\u7684\u786c\u4ef6\u7535\u8def\u4e3b\u8981\u662f\u57fa\u4e8e\u52a0\u6cd5\u8fd0\u7b97\u8bbe\u8ba1\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u52a0\u6cd5\u8fd0\u7b97\u76f8\u5bf9\u4e8e\u5176\u4ed6\u8fd0\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u51cf\u6cd5\uff09\u6765\u8bf4\uff0c\u786c\u4ef6\u5b9e\u73b0\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u66f4\u5bb9\u6613\u8fdb\u884c\u5e76\u884c\u5316\u5904\u7406\uff0c\u8fd0\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

    \u8bf7\u6ce8\u610f\uff0c\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8ba1\u7b97\u673a\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u901a\u8fc7\u5c06\u52a0\u6cd5\u4e0e\u4e00\u4e9b\u57fa\u672c\u903b\u8f91\u8fd0\u7b97\u7ed3\u5408\uff0c\u8ba1\u7b97\u673a\u80fd\u591f\u5b9e\u73b0\u5404\u79cd\u5176\u4ed6\u7684\u6570\u5b66\u8fd0\u7b97\u3002\u4f8b\u5982\uff0c\u8ba1\u7b97\u51cf\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8ba1\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f6c\u6362\u4e3a\u8ba1\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u51cf\u6cd5\u3002

    \u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u8ba1\u7b97\u673a\u4f7f\u7528\u8865\u7801\u7684\u539f\u56e0\uff1a\u57fa\u4e8e\u8865\u7801\u8868\u793a\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u7528\u540c\u6837\u7684\u7535\u8def\u548c\u64cd\u4f5c\u6765\u5904\u7406\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\u6765\u5904\u7406\u51cf\u6cd5\uff0c\u5e76\u4e14\u65e0\u987b\u7279\u522b\u5904\u7406\u6b63\u8d1f\u96f6\u7684\u6b67\u4e49\u95ee\u9898\u3002\u8fd9\u5927\u5927\u7b80\u5316\u4e86\u786c\u4ef6\u8bbe\u8ba1\uff0c\u63d0\u9ad8\u4e86\u8fd0\u7b97\u6548\u7387\u3002

    \u8865\u7801\u7684\u8bbe\u8ba1\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u5173\u7cfb\u6211\u4eec\u5c31\u5148\u4ecb\u7ecd\u5230\u8fd9\u91cc\uff0c\u5efa\u8bae\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8fdb\u4e00\u6b65\u6df1\u5165\u4e86\u89e3\u3002

    "},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u70b9\u6570\u7f16\u7801","text":"

    \u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\uff1aint \u548c float \u957f\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u5b57\u8282 \uff0c\u4f46\u4e3a\u4ec0\u4e48 float \u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \uff1f\u8fd9\u975e\u5e38\u53cd\u76f4\u89c9\uff0c\u56e0\u4e3a\u6309\u7406\u8bf4 float \u9700\u8981\u8868\u793a\u5c0f\u6570\uff0c\u53d6\u503c\u8303\u56f4\u5e94\u8be5\u53d8\u5c0f\u624d\u5bf9\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8fd9\u662f\u56e0\u4e3a\u6d6e\u70b9\u6570 float \u91c7\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8bb0\u4e00\u4e2a 32 \u6bd4\u7279\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570\u4e3a\uff1a

    \\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

    \u6839\u636e IEEE 754 \u6807\u51c6\uff0c32-bit \u957f\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u4e2a\u90e8\u5206\u6784\u6210\u3002

    • \u7b26\u53f7\u4f4d \\(\\mathrm{S}\\) \uff1a\u5360 1 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{31}\\) \u3002
    • \u6307\u6570\u4f4d \\(\\mathrm{E}\\) \uff1a\u5360 8 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
    • \u5206\u6570\u4f4d \\(\\mathrm{N}\\) \uff1a\u5360 23 \u4f4d \uff0c\u5bf9\u5e94 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

    \u4e8c\u8fdb\u5236\u6570 float \u5bf9\u5e94\u503c\u7684\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff1a

    \\[ \\text {val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2-127} \\times\\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

    \u8f6c\u5316\u5230\u5341\u8fdb\u5236\u4e0b\u7684\u8ba1\u7b97\u516c\u5f0f\u4e3a\uff1a

    \\[ \\text {val}=(-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} -127} \\times (1 + \\mathrm{N}) \\]

    \u5176\u4e2d\u5404\u9879\u7684\u53d6\u503c\u8303\u56f4\u4e3a\uff1a

    \\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

    \u56fe 3-5 \u00a0 IEEE 754 \u6807\u51c6\u4e0b\u7684 float \u7684\u8ba1\u7b97\u793a\u4f8b

    \u89c2\u5bdf\u56fe 3-5 \uff0c\u7ed9\u5b9a\u4e00\u4e2a\u793a\u4f8b\u6570\u636e \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5219\u6709\uff1a

    \\[ \\text { val } = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

    \u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u95ee\u9898\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6570\u4f4d\uff0c\u5bfc\u81f4\u5176\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e int \u3002\u6839\u636e\u4ee5\u4e0a\u8ba1\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6570\u4e3a \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u6362\u7b26\u53f7\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8d1f\u6570\u3002

    \u5c3d\u7ba1\u6d6e\u70b9\u6570 float \u6269\u5c55\u4e86\u53d6\u503c\u8303\u56f4\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6570\u7c7b\u578b int \u5c06\u5168\u90e8 32 \u6bd4\u7279\u7528\u4e8e\u8868\u793a\u6570\u5b57\uff0c\u6570\u5b57\u662f\u5747\u5300\u5206\u5e03\u7684\uff1b\u800c\u7531\u4e8e\u6307\u6570\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u70b9\u6570 float \u7684\u6570\u503c\u8d8a\u5927\uff0c\u76f8\u90bb\u4e24\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u5dee\u503c\u5c31\u4f1a\u8d8b\u5411\u8d8a\u5927\u3002

    \u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6570\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u4e49\uff0c\u7528\u4e8e\u8868\u793a\u96f6\u3001\u65e0\u7a77\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

    \u8868 3-2 \u00a0 \u6307\u6570\u4f4d\u542b\u4e49

    \u6307\u6570\u4f4d E \u5206\u6570\u4f4d \\(\\mathrm{N} = 0\\) \u5206\u6570\u4f4d \\(\\mathrm{N} \\ne 0\\) \u8ba1\u7b97\u516c\u5f0f \\(0\\) \\(\\pm 0\\) \u6b21\u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) \u6b63\u89c4\u6570 \u6b63\u89c4\u6570 \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6b21\u6b63\u89c4\u6570\u663e\u8457\u63d0\u5347\u4e86\u6d6e\u70b9\u6570\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u89c4\u6570\u4e3a \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u89c4\u6570\u4e3a \\(2^{-126} \\times 2^{-23}\\) \u3002

    \u53cc\u7cbe\u5ea6 double \u4e5f\u91c7\u7528\u7c7b\u4f3c\u4e8e float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d58\u8ff0\u3002

    "},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u4ece\u903b\u8f91\u7ed3\u6784\u548c\u7269\u7406\u7ed3\u6784\u4e24\u4e2a\u89d2\u5ea6\u8fdb\u884c\u5206\u7c7b\u3002\u903b\u8f91\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5143\u7d20\u4e4b\u95f4\u7684\u903b\u8f91\u5173\u7cfb\uff0c\u800c\u7269\u7406\u7ed3\u6784\u63cf\u8ff0\u4e86\u6570\u636e\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u7684\u5b58\u50a8\u65b9\u5f0f\u3002
    • \u5e38\u89c1\u7684\u903b\u8f91\u7ed3\u6784\u5305\u62ec\u7ebf\u6027\u3001\u6811\u72b6\u548c\u7f51\u72b6\u7b49\u3002\u901a\u5e38\u6211\u4eec\u6839\u636e\u903b\u8f91\u7ed3\u6784\u5c06\u6570\u636e\u7ed3\u6784\u5206\u4e3a\u7ebf\u6027\uff08\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\uff09\u548c\u975e\u7ebf\u6027\uff08\u6811\u3001\u56fe\u3001\u5806\uff09\u4e24\u79cd\u3002\u54c8\u5e0c\u8868\u7684\u5b9e\u73b0\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002
    • \u5f53\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u6570\u636e\u88ab\u5b58\u50a8\u5728\u8ba1\u7b97\u673a\u5185\u5b58\u4e2d\u3002\u6bcf\u4e2a\u5185\u5b58\u7a7a\u95f4\u90fd\u62e5\u6709\u5bf9\u5e94\u7684\u5185\u5b58\u5730\u5740\uff0c\u7a0b\u5e8f\u901a\u8fc7\u8fd9\u4e9b\u5185\u5b58\u5730\u5740\u8bbf\u95ee\u6570\u636e\u3002
    • \u7269\u7406\u7ed3\u6784\u4e3b\u8981\u5206\u4e3a\u8fde\u7eed\u7a7a\u95f4\u5b58\u50a8\uff08\u6570\u7ec4\uff09\u548c\u5206\u6563\u7a7a\u95f4\u5b58\u50a8\uff08\u94fe\u8868\uff09\u3002\u6240\u6709\u6570\u636e\u7ed3\u6784\u90fd\u662f\u7531\u6570\u7ec4\u3001\u94fe\u8868\u6216\u4e24\u8005\u7684\u7ec4\u5408\u5b9e\u73b0\u7684\u3002
    • \u8ba1\u7b97\u673a\u4e2d\u7684\u57fa\u672c\u6570\u636e\u7c7b\u578b\u5305\u62ec\u6574\u6570 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u70b9\u6570 float\u3001double \uff0c\u5b57\u7b26 char \u548c\u5e03\u5c14 bool \u3002\u5b83\u4eec\u7684\u53d6\u503c\u8303\u56f4\u53d6\u51b3\u4e8e\u5360\u7528\u7a7a\u95f4\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
    • \u539f\u7801\u3001\u53cd\u7801\u548c\u8865\u7801\u662f\u5728\u8ba1\u7b97\u673a\u4e2d\u7f16\u7801\u6570\u5b57\u7684\u4e09\u79cd\u65b9\u6cd5\uff0c\u5b83\u4eec\u4e4b\u95f4\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\u3002\u6574\u6570\u7684\u539f\u7801\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u53f7\u4f4d\uff0c\u5176\u4f59\u4f4d\u662f\u6570\u5b57\u7684\u503c\u3002
    • \u6574\u6570\u5728\u8ba1\u7b97\u673a\u4e2d\u662f\u4ee5\u8865\u7801\u7684\u5f62\u5f0f\u5b58\u50a8\u7684\u3002\u5728\u8865\u7801\u8868\u793a\u4e0b\uff0c\u8ba1\u7b97\u673a\u53ef\u4ee5\u5bf9\u6b63\u6570\u548c\u8d1f\u6570\u7684\u52a0\u6cd5\u4e00\u89c6\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u4e3a\u51cf\u6cd5\u64cd\u4f5c\u5355\u72ec\u8bbe\u8ba1\u7279\u6b8a\u7684\u786c\u4ef6\u7535\u8def\uff0c\u5e76\u4e14\u4e0d\u5b58\u5728\u6b63\u8d1f\u96f6\u6b67\u4e49\u7684\u95ee\u9898\u3002
    • \u6d6e\u70b9\u6570\u7684\u7f16\u7801\u7531 1 \u4f4d\u7b26\u53f7\u4f4d\u30018 \u4f4d\u6307\u6570\u4f4d\u548c 23 \u4f4d\u5206\u6570\u4f4d\u6784\u6210\u3002\u7531\u4e8e\u5b58\u5728\u6307\u6570\u4f4d\uff0c\u56e0\u6b64\u6d6e\u70b9\u6570\u7684\u53d6\u503c\u8303\u56f4\u8fdc\u5927\u4e8e\u6574\u6570\uff0c\u4ee3\u4ef7\u662f\u727a\u7272\u4e86\u7cbe\u5ea6\u3002
    • ASCII \u7801\u662f\u6700\u65e9\u51fa\u73b0\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u957f\u5ea6\u4e3a 1 \u5b57\u8282\uff0c\u5171\u6536\u5f55 127 \u4e2a\u5b57\u7b26\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u5f55\u4e24\u4e07\u591a\u4e2a\u6c49\u5b57\u3002Unicode \u81f4\u529b\u4e8e\u63d0\u4f9b\u4e00\u4e2a\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6807\u51c6\uff0c\u6536\u5f55\u4e16\u754c\u4e0a\u5404\u79cd\u8bed\u8a00\u7684\u5b57\u7b26\uff0c\u4ece\u800c\u89e3\u51b3\u7531\u4e8e\u5b57\u7b26\u7f16\u7801\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5bfc\u81f4\u7684\u4e71\u7801\u95ee\u9898\u3002
    • UTF-8 \u662f\u6700\u53d7\u6b22\u8fce\u7684 Unicode \u7f16\u7801\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u79cd\u53d8\u957f\u7684\u7f16\u7801\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u6269\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5b58\u50a8\u7a7a\u95f4\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u957f\u7684\u7f16\u7801\u65b9\u6cd5\u3002\u5728\u7f16\u7801\u4e2d\u6587\u65f6\uff0cUTF-16 \u5360\u7528\u7684\u7a7a\u95f4\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7f16\u7a0b\u8bed\u8a00\u9ed8\u8ba4\u4f7f\u7528 UTF-16 \u7f16\u7801\u3002
    "},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff1f

    \u54c8\u5e0c\u8868\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u800c\u4e3a\u4e86\u89e3\u51b3\u54c8\u5e0c\u51b2\u7a81\uff0c\u6211\u4eec\u53ef\u80fd\u4f1a\u4f7f\u7528\u201c\u94fe\u5f0f\u5730\u5740\u201d\uff08\u540e\u7eed\u201c\u54c8\u5e0c\u51b2\u7a81\u201d\u7ae0\u8282\u4f1a\u8bb2\uff09\uff1a\u6570\u7ec4\u4e2d\u6bcf\u4e2a\u6876\u6307\u5411\u4e00\u4e2a\u94fe\u8868\uff0c\u5f53\u94fe\u8868\u957f\u5ea6\u8d85\u8fc7\u4e00\u5b9a\u9608\u503c\u65f6\uff0c\u53c8\u53ef\u80fd\u88ab\u8f6c\u5316\u4e3a\u6811\uff08\u901a\u5e38\u4e3a\u7ea2\u9ed1\u6811\uff09\u3002

    \u4ece\u5b58\u50a8\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u54c8\u5e0c\u8868\u7684\u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u4e2a\u94fe\u8868\u6216\u4e00\u68f5\u6811\u3002\u56e0\u6b64\uff0c\u54c8\u5e0c\u8868\u53ef\u80fd\u540c\u65f6\u5305\u542b\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6570\u7ec4\u3001\u94fe\u8868\uff09\u548c\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff08\u6811\uff09\u3002

    Q\uff1achar \u7c7b\u578b\u7684\u957f\u5ea6\u662f 1 \u5b57\u8282\u5417\uff1f

    char \u7c7b\u578b\u7684\u957f\u5ea6\u7531\u7f16\u7a0b\u8bed\u8a00\u91c7\u7528\u7684\u7f16\u7801\u65b9\u6cd5\u51b3\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u91c7\u7528 UTF-16 \u7f16\u7801\uff08\u4fdd\u5b58 Unicode \u7801\u70b9\uff09\uff0c\u56e0\u6b64 char \u7c7b\u578b\u7684\u957f\u5ea6\u4e3a 2 \u5b57\u8282\u3002

    Q\uff1a\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u4e5f\u79f0\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d \u662f\u5426\u6709\u6b67\u4e49\uff1f\u6808\u4e5f\u53ef\u4ee5\u8fdb\u884c\u51fa\u6808\u548c\u5165\u6808\u7b49\u64cd\u4f5c\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52a8\u6001\u201d\u7684\u3002

    \u6808\u786e\u5b9e\u53ef\u4ee5\u5b9e\u73b0\u52a8\u6001\u7684\u6570\u636e\u64cd\u4f5c\uff0c\u4f46\u6570\u636e\u7ed3\u6784\u4ecd\u7136\u662f\u201c\u9759\u6001\u201d\uff08\u957f\u5ea6\u4e0d\u53ef\u53d8\uff09\u7684\u3002\u5c3d\u7ba1\u57fa\u4e8e\u6570\u7ec4\u7684\u6570\u636e\u7ed3\u6784\u53ef\u4ee5\u52a8\u6001\u5730\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u4eec\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u6570\u636e\u91cf\u8d85\u51fa\u4e86\u9884\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u66f4\u5927\u7684\u6570\u7ec4\uff0c\u5e76\u5c06\u65e7\u6570\u7ec4\u7684\u5185\u5bb9\u590d\u5236\u5230\u65b0\u6570\u7ec4\u4e2d\u3002

    Q\uff1a\u5728\u6784\u5efa\u6808\uff08\u961f\u5217\uff09\u7684\u65f6\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u4e3a\u4ec0\u4e48\u5b83\u4eec\u662f\u201c\u9759\u6001\u6570\u636e\u7ed3\u6784\u201d\u5462\uff1f

    \u5728\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u6211\u4eec\u65e0\u987b\u4eba\u5de5\u6307\u5b9a\u6808\uff08\u961f\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u8fd9\u4e2a\u5de5\u4f5c\u7531\u7c7b\u5185\u90e8\u81ea\u52a8\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u4e3a 10\u3002\u53e6\u5916\uff0c\u6269\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52a8\u5b9e\u73b0\u7684\u3002\u8be6\u89c1\u540e\u7eed\u7684\u201c\u5217\u8868\u201d\u7ae0\u8282\u3002

    Q\uff1a\u539f\u7801\u8f6c\u8865\u7801\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\uff0c\u90a3\u4e48\u8865\u7801\u8f6c\u539f\u7801\u5e94\u8be5\u662f\u9006\u8fd0\u7b97\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff0c\u800c\u8865\u7801\u8f6c\u539f\u7801\u4e5f\u4e00\u6837\u53ef\u4ee5\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff0c\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff1f

    \u8fd9\u662f\u56e0\u4e3a\u539f\u7801\u548c\u8865\u7801\u7684\u76f8\u4e92\u8f6c\u6362\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u201c\u8865\u6570\u201d\u7684\u8fc7\u7a0b\u3002\u6211\u4eec\u5148\u7ed9\u51fa\u8865\u6570\u7684\u5b9a\u4e49\uff1a\u5047\u8bbe \\(a + b = c\\) \uff0c\u90a3\u4e48\u6211\u4eec\u79f0 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u8865\u6570\uff0c\u53cd\u4e4b\u4e5f\u79f0 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u8865\u6570\u3002

    \u7ed9\u5b9a\u4e00\u4e2a \\(n = 4\\) \u4f4d\u957f\u5ea6\u7684\u4e8c\u8fdb\u5236\u6570 \\(0010\\) \uff0c\u5982\u679c\u5c06\u8fd9\u4e2a\u6570\u5b57\u770b\u4f5c\u539f\u7801\uff08\u4e0d\u8003\u8651\u7b26\u53f7\u4f4d\uff09\uff0c\u90a3\u4e48\u5b83\u7684\u8865\u7801\u9700\u901a\u8fc7\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\uff1a

    \\[ 0010 \\rightarrow 1101 \\rightarrow 1110 \\]

    \u6211\u4eec\u4f1a\u53d1\u73b0\uff0c\u539f\u7801\u548c\u8865\u7801\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u8865\u7801 \\(1110\\) \u662f\u539f\u7801 \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5b9e\u9645\u4e0a\u662f\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\u7684\u8fc7\u7a0b\u3002

    \u90a3\u4e48\uff0c\u8865\u7801 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u4eec\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

    \\[ 1110 \\rightarrow 0001 \\rightarrow 0010 \\]

    \u6362\u53e5\u8bdd\u8bf4\uff0c\u539f\u7801\u548c\u8865\u7801\u4e92\u4e3a\u5bf9\u65b9\u5230 \\(10000\\) \u7684\u201c\u8865\u6570\u201d\uff0c\u56e0\u6b64\u201c\u539f\u7801\u8f6c\u8865\u7801\u201d\u548c\u201c\u8865\u7801\u8f6c\u539f\u7801\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u540e\u52a0 1 \uff09\u5b9e\u73b0\u3002

    \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u7528\u9006\u8fd0\u7b97\u6765\u6c42\u8865\u7801 \\(1110\\) \u7684\u539f\u7801\uff0c\u5373\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\uff1a

    \\[ 1110 \\rightarrow 1101 \\rightarrow 0010 \\]

    \u603b\u7ed3\u6765\u770b\uff0c\u201c\u5148\u53d6\u53cd\u540e\u52a0 1\u201d\u548c\u201c\u5148\u51cf 1 \u540e\u53d6\u53cd\u201d\u8fd9\u4e24\u79cd\u8fd0\u7b97\u90fd\u662f\u5728\u8ba1\u7b97\u5230 \\(10000\\) \u7684\u8865\u6570\uff0c\u5b83\u4eec\u662f\u7b49\u4ef7\u7684\u3002

    \u672c\u8d28\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u8865\u6570\uff08\u56e0\u4e3a\u6052\u6709 \u539f\u7801 + \u53cd\u7801 = 1111\uff09\uff1b\u800c\u5728\u53cd\u7801\u57fa\u7840\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u8865\u7801\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u8865\u6570\u3002

    \u4e0a\u8ff0\u4ee5 \\(n = 4\\) \u4e3a\u4f8b\uff0c\u5176\u53ef\u88ab\u63a8\u5e7f\u81f3\u4efb\u610f\u4f4d\u6570\u7684\u4e8c\u8fdb\u5236\u6570\u3002

    "},{"location":"chapter_divide_and_conquer/","title":"\u7b2c 12 \u7ae0 \u00a0 \u5206\u6cbb","text":"

    Abstract

    \u96be\u9898\u88ab\u9010\u5c42\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u53d8\u5f97\u66f4\u4e3a\u7b80\u5355\u3002

    \u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u4e2a\u91cd\u8981\u7684\u4e8b\u5b9e\uff1a\u4ece\u7b80\u5355\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u590d\u6742\u3002

    "},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5
    • 12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565
    • 12.3 \u00a0 \u6784\u5efa\u6811\u95ee\u9898
    • 12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898
    • 12.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u7d22\u7b56\u7565","text":"

    \u6211\u4eec\u5df2\u7ecf\u5b66\u8fc7\uff0c\u641c\u7d22\u7b97\u6cd5\u5206\u4e3a\u4e24\u5927\u7c7b\u3002

    • \u66b4\u529b\u641c\u7d22\uff1a\u5b83\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002
    • \u81ea\u9002\u5e94\u641c\u7d22\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u6570\u636e\u7ec4\u7ec7\u5f62\u5f0f\u6216\u5148\u9a8c\u4fe1\u606f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u5b9e\u9645\u4e0a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u548c\u6811\u3002

    • \u4e8c\u5206\u67e5\u627e\u7684\u6bcf\u4e00\u6b65\u90fd\u5c06\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\u5206\u89e3\u4e3a\u4e00\u4e2a\u5c0f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff09\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4e00\u76f4\u6301\u7eed\u5230\u6570\u7ec4\u4e3a\u7a7a\u6216\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
    • \u6811\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u5806\u7b49\u6570\u636e\u7ed3\u6784\u4e2d\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7686\u4e3a \\(O(\\log n)\\) \u3002

    \u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

    • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u67e5\u627e\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\uff08\u5728\u6570\u7ec4\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\u5206\u89e3\u4e3a\u5b50\u95ee\u9898\uff08\u5728\u6570\u7ec4\u7684\u4e00\u534a\u4e2d\u8fdb\u884c\u67e5\u627e\uff09\uff0c\u8fd9\u662f\u901a\u8fc7\u6bd4\u8f83\u4e2d\u95f4\u5143\u7d20\u548c\u76ee\u6807\u5143\u7d20\u6765\u5b9e\u73b0\u7684\u3002
    • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u5904\u7406\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u95ee\u9898\u7684\u5f71\u54cd\u3002
    • \u5b50\u95ee\u9898\u7684\u89e3\u65e0\u987b\u5408\u5e76\uff1a\u4e8c\u5206\u67e5\u627e\u65e8\u5728\u67e5\u627e\u4e00\u4e2a\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u3002\u5f53\u5b50\u95ee\u9898\u5f97\u5230\u89e3\u51b3\u65f6\uff0c\u539f\u95ee\u9898\u4e5f\u4f1a\u540c\u65f6\u5f97\u5230\u89e3\u51b3\u3002

    \u5206\u6cbb\u80fd\u591f\u63d0\u5347\u641c\u7d22\u6548\u7387\uff0c\u672c\u8d28\u4e0a\u662f\u56e0\u4e3a\u66b4\u529b\u641c\u7d22\u6bcf\u8f6e\u53ea\u80fd\u6392\u9664\u4e00\u4e2a\u9009\u9879\uff0c\u800c\u5206\u6cbb\u641c\u7d22\u6bcf\u8f6e\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9009\u9879\u3002

    "},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u4e8e\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e","text":"

    \u5728\u4e4b\u524d\u7684\u7ae0\u8282\u4e2d\uff0c\u4e8c\u5206\u67e5\u627e\u662f\u57fa\u4e8e\u9012\u63a8\uff08\u8fed\u4ee3\uff09\u5b9e\u73b0\u7684\u3002\u73b0\u5728\u6211\u4eec\u57fa\u4e8e\u5206\u6cbb\uff08\u9012\u5f52\uff09\u6765\u5b9e\u73b0\u5b83\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8bf7\u67e5\u627e\u5143\u7d20 target \u3002

    \u4ece\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u4eec\u5c06\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u8bb0\u4e3a \\(f(i, j)\\) \u3002

    \u4ee5\u539f\u95ee\u9898 \\(f(0, n-1)\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u901a\u8fc7\u4ee5\u4e0b\u6b65\u9aa4\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u3002

    1. \u8ba1\u7b97\u641c\u7d22\u533a\u95f4 \\([i, j]\\) \u7684\u4e2d\u70b9 \\(m\\) \uff0c\u6839\u636e\u5b83\u6392\u9664\u4e00\u534a\u641c\u7d22\u533a\u95f4\u3002
    2. \u9012\u5f52\u6c42\u89e3\u89c4\u6a21\u51cf\u5c0f\u4e00\u534a\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u80fd\u4e3a \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
    3. \u5faa\u73af\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u533a\u95f4\u4e3a\u7a7a\u65f6\u8fd4\u56de\u3002

    \u56fe 12-4 \u5c55\u793a\u4e86\u5728\u6570\u7ec4\u4e2d\u4e8c\u5206\u67e5\u627e\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u8fc7\u7a0b\u3002

    \u56fe 12-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u7684\u5206\u6cbb\u8fc7\u7a0b

    \u5728\u5b9e\u73b0\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \u6765\u6c42\u89e3\u95ee\u9898 \\(f(i, j)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_recur.py
    def dfs(nums: list[int], target: int, i: int, j: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j)\"\"\"\n    # \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
    binary_search_recur.cpp
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.java
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.cs
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
    binary_search_recur.go
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u6ca1\u6709\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8ba1\u7b97\u7d22\u5f15\u4e2d\u70b9\n    m := i + ((j - i) >> 1)\n    //\u5224\u65ad\u4e2d\u70b9\u4e0e\u76ee\u6807\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u53f3\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u4e8e\u5219\u9012\u5f52\u5de6\u534a\u6570\u7ec4\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums []int, target int) int {\n    n := len(nums)\n    return dfs(nums, target, 0, n-1)\n}\n
    binary_search_recur.swift
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)\n}\n
    binary_search_recur.js
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.ts
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.dart
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.rs
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = i + (j - i) / 2;\n    if nums[m as usize] < target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.c
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.kt
    /* \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u67e5\u627e */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.rb
    ### \u4e8c\u5206\u67e5\u627e\uff1a\u95ee\u9898 f(i, j) ###\ndef dfs(nums, target, i, j)\n  # \u82e5\u533a\u95f4\u4e3a\u7a7a\uff0c\u4ee3\u8868\u65e0\u76ee\u6807\u5143\u7d20\uff0c\u5219\u8fd4\u56de -1\n  return -1 if i > j\n\n  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n  m = (i + j) / 2\n\n  if nums[m] < target\n    # \u9012\u5f52\u5b50\u95ee\u9898 f(m+1, j)\n    return dfs(nums, target, m + 1, j)\n  elsif nums[m] > target\n    # \u9012\u5f52\u5b50\u95ee\u9898 f(i, m-1)\n    return dfs(nums, target, i, m - 1)\n  else\n    # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m\n  end\nend\n\n### \u4e8c\u5206\u67e5\u627e ###\ndef binary_search(nums, target)\n  n = nums.length\n  # \u6c42\u89e3\u95ee\u9898 f(0, n-1)\n  dfs(nums, target, 0, n - 1)\nend\n
    binary_search_recur.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a\u4e00\u68f5\u4e8c\u53c9\u6811\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \uff0c\u8bf7\u4ece\u4e2d\u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u8fd4\u56de\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u3002\u5047\u8bbe\u4e8c\u53c9\u6811\u4e2d\u6ca1\u6709\u503c\u91cd\u590d\u7684\u8282\u70b9\uff08\u5982\u56fe 12-5 \u6240\u793a\uff09\u3002

    \u56fe 12-5 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65ad\u662f\u5426\u4e3a\u5206\u6cbb\u95ee\u9898","text":"

    \u539f\u95ee\u9898\u5b9a\u4e49\u4e3a\u4ece preorder \u548c inorder \u6784\u5efa\u4e8c\u53c9\u6811\uff0c\u662f\u4e00\u4e2a\u5178\u578b\u7684\u5206\u6cbb\u95ee\u9898\u3002

    • \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u4ece\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\u3001\u6784\u5efa\u53f3\u5b50\u6811\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u8282\u70b9\u3002\u800c\u5bf9\u4e8e\u6bcf\u68f5\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u590d\u7528\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u5c06\u5176\u5212\u5206\u4e3a\u66f4\u5c0f\u7684\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u7a7a\u5b50\u6811\uff09\u65f6\u7ec8\u6b62\u3002
    • \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u5b83\u4eec\u4e4b\u95f4\u6ca1\u6709\u4ea4\u96c6\u3002\u5728\u6784\u5efa\u5de6\u5b50\u6811\u65f6\uff0c\u6211\u4eec\u53ea\u9700\u5173\u6ce8\u4e2d\u5e8f\u904d\u5386\u548c\u524d\u5e8f\u904d\u5386\u4e2d\u4e0e\u5de6\u5b50\u6811\u5bf9\u5e94\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6811\u540c\u7406\u3002
    • \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u5b83\u4eec\u94fe\u63a5\u5230\u6839\u8282\u70b9\u4e0a\uff0c\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5212\u5206\u5b50\u6811","text":"

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u8fd9\u9053\u9898\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u6765\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u901a\u8fc7\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u6765\u5212\u5206\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u5462\uff1f

    \u6839\u636e\u5b9a\u4e49\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\u3002

    • \u524d\u5e8f\u904d\u5386\uff1a[ \u6839\u8282\u70b9 | \u5de6\u5b50\u6811 | \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 3 | 9 | 2 1 7 ] \u3002
    • \u4e2d\u5e8f\u904d\u5386\uff1a[ \u5de6\u5b50\u6811 | \u6839\u8282\u70b9 \uff5c \u53f3\u5b50\u6811 ] \uff0c\u4f8b\u5982\u56fe 12-5 \u7684\u6811\u5bf9\u5e94 [ 9 | 3 | 1 2 7 ] \u3002

    \u4ee5\u4e0a\u56fe\u6570\u636e\u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u56fe 12-6 \u6240\u793a\u7684\u6b65\u9aa4\u5f97\u5230\u5212\u5206\u7ed3\u679c\u3002

    1. \u524d\u5e8f\u904d\u5386\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u8282\u70b9\u7684\u503c\u3002
    2. \u67e5\u627e\u6839\u8282\u70b9 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8be5\u7d22\u5f15\u53ef\u5c06 inorder \u5212\u5206\u4e3a [ 9 | 3 \uff5c 1 2 7 ] \u3002
    3. \u6839\u636e inorder \u7684\u5212\u5206\u7ed3\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u5206\u522b\u4e3a 1 \u548c 3 \uff0c\u4ece\u800c\u53ef\u5c06 preorder \u5212\u5206\u4e3a [ 3 | 9 | 2 1 7 ] \u3002

    \u56fe 12-6 \u00a0 \u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u5212\u5206\u5b50\u6811

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u4e8e\u53d8\u91cf\u63cf\u8ff0\u5b50\u6811\u533a\u95f4","text":"

    \u6839\u636e\u4ee5\u4e0a\u5212\u5206\u65b9\u6cd5\uff0c\u6211\u4eec\u5df2\u7ecf\u5f97\u5230\u6839\u8282\u70b9\u3001\u5de6\u5b50\u6811\u3001\u53f3\u5b50\u6811\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002\u800c\u4e3a\u4e86\u63cf\u8ff0\u8fd9\u4e9b\u7d22\u5f15\u533a\u95f4\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u3002

    • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(i\\) \u3002
    • \u5c06\u5f53\u524d\u6811\u7684\u6839\u8282\u70b9\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8bb0\u4e3a \\(m\\) \u3002
    • \u5c06\u5f53\u524d\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u8bb0\u4e3a \\([l, r]\\) \u3002

    \u5982\u8868 12-1 \u6240\u793a\uff0c\u901a\u8fc7\u4ee5\u4e0a\u53d8\u91cf\u5373\u53ef\u8868\u793a\u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4\u3002

    \u8868 12-1 \u00a0 \u6839\u8282\u70b9\u548c\u5b50\u6811\u5728\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u4e2d\u7684\u7d22\u5f15

    \u6839\u8282\u70b9\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6811\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u533a\u95f4 \u5f53\u524d\u6811 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6811 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6811 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

    \u8bf7\u6ce8\u610f\uff0c\u53f3\u5b50\u6811\u6839\u8282\u70b9\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u4e49\u662f\u201c\u5de6\u5b50\u6811\u7684\u8282\u70b9\u6570\u91cf\u201d\uff0c\u5efa\u8bae\u7ed3\u5408\u56fe 12-7 \u7406\u89e3\u3002

    \u56fe 12-7 \u00a0 \u6839\u8282\u70b9\u548c\u5de6\u53f3\u5b50\u6811\u7684\u7d22\u5f15\u533a\u95f4\u8868\u793a

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u4e3a\u4e86\u63d0\u5347\u67e5\u8be2 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868 hmap \u6765\u5b58\u50a8\u6570\u7ec4 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig build_tree.py
    def dfs(\n    preorder: list[int],\n    inorder_map: dict[int, int],\n    i: int,\n    l: int,\n    r: int,\n) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root = TreeNode(preorder[i])\n    # \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m = inorder_map[preorder[i]]\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u6784\u5efa\u4e8c\u53c9\u6811\"\"\"\n    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorder_map = {val: i for i, val in enumerate(inorder)}\n    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)\n    return root\n
    build_tree.cpp
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    unordered_map<int, int> inorderMap;\n    for (int i = 0; i < inorder.size(); i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);\n    return root;\n}\n
    build_tree.java
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Map<Integer, Integer> inorderMap = new HashMap<>();\n    for (int i = 0; i < inorder.length; i++) {\n        inorderMap.put(inorder[i], i);\n    }\n    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.cs
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    Dictionary<int, int> inorderMap = [];\n    for (int i = 0; i < inorder.Length; i++) {\n        inorderMap.TryAdd(inorder[i], i);\n    }\n    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);\n    return root;\n}\n
    build_tree.go
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    m := inorderMap[preorder[i]]\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    inorderMap := make(map[int]int, len(inorder))\n    for i := 0; i < len(inorder); i++ {\n        inorderMap[inorder[i]] = i\n    }\n\n    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)\n    return root\n}\n
    build_tree.swift
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }\n    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)\n}\n
    build_tree.js
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.ts
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfunction dfs(\n    preorder: number[],\n    inorderMap: Map<number, number>,\n    i: number,\n    l: number,\n    r: number\n): TreeNode | null {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let inorderMap = new Map<number, number>();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.dart
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode? dfs(\n  List<int> preorder,\n  Map<int, int> inorderMap,\n  int i,\n  int l,\n  int r,\n) {\n  // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u8282\u70b9\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u8282\u70b9\n  return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n  Map<int, int> inorderMap = {};\n  for (int i = 0; i < inorder.length; i++) {\n    inorderMap[inorder[i]] = i;\n  }\n  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n  return root;\n}\n
    build_tree.rs
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfn dfs(\n    preorder: &[i32],\n    inorder_map: &HashMap<i32, i32>,\n    i: i32,\n    l: i32,\n    r: i32,\n) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    Some(root)\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    let mut inorder_map: HashMap<i32, i32> = HashMap::new();\n    for i in 0..inorder.len() {\n        inorder_map.insert(inorder[i], i as i32);\n    }\n    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);\n    root\n}\n
    build_tree.c
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root;\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);\n    for (int i = 0; i < inorderSize; i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);\n    free(inorderMap);\n    return root;\n}\n
    build_tree.kt
    /* \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb */\nfun dfs(\n    preorder: IntArray,\n    inorderMap: Map<Int?, Int?>,\n    i: Int,\n    l: Int,\n    r: Int\n): TreeNode? {\n    // \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u8282\u70b9\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u8282\u70b9\n    return root\n}\n\n/* \u6784\u5efa\u4e8c\u53c9\u6811 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n    val inorderMap = HashMap<Int?, Int?>()\n    for (i in inorder.indices) {\n        inorderMap[inorder[i]] = i\n    }\n    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)\n    return root\n}\n
    build_tree.rb
    ### \u6784\u5efa\u4e8c\u53c9\u6811\uff1a\u5206\u6cbb ###\ndef dfs(preorder, inorder_map, i, l, r)\n  # \u5b50\u6811\u533a\u95f4\u4e3a\u7a7a\u65f6\u7ec8\u6b62\n  return if r - l < 0\n\n  # \u521d\u59cb\u5316\u6839\u8282\u70b9\n  root = TreeNode.new(preorder[i])\n  # \u67e5\u8be2 m \uff0c\u4ece\u800c\u5212\u5206\u5de6\u53f3\u5b50\u6811\n  m = inorder_map[preorder[i]]\n  # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u5de6\u5b50\u6811\n  root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n  # \u5b50\u95ee\u9898\uff1a\u6784\u5efa\u53f3\u5b50\u6811\n  root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n\n  # \u8fd4\u56de\u6839\u8282\u70b9\n  root\nend\n\n### \u6784\u5efa\u4e8c\u53c9\u6811 ###\ndef build_tree(preorder, inorder)\n  # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\uff0c\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\n  inorder_map = {}\n  inorder.each_with_index { |val, i| inorder_map[val] = i }\n  dfs(preorder, inorder_map, 0, 0, inorder.length - 1)\nend\n
    build_tree.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 12-8 \u5c55\u793a\u4e86\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5404\u4e2a\u8282\u70b9\u662f\u5728\u5411\u4e0b\u201c\u9012\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u6761\u8fb9\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u5f52\u201d\u7684\u8fc7\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

    <1><2><3><4><5><6><7><8><9>

    \u56fe 12-8 \u00a0 \u6784\u5efa\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b

    \u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u5185\u7684\u524d\u5e8f\u904d\u5386 preorder \u548c\u4e2d\u5e8f\u904d\u5386 inorder \u7684\u5212\u5206\u7ed3\u679c\u5982\u56fe 12-9 \u6240\u793a\u3002

    \u56fe 12-9 \u00a0 \u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u4e2d\u7684\u5212\u5206\u7ed3\u679c

    \u8bbe\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u4e2a\u8282\u70b9\uff08\u6267\u884c\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    \u54c8\u5e0c\u8868\u5b58\u50a8 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u6620\u5c04\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u6808\u5e27\u7a7a\u95f4\u3002\u56e0\u6b64\u603b\u4f53\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u7b97\u6cd5","text":"

    \u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u79f0\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u79cd\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u89c1\u7684\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u4e24\u4e2a\u6b65\u9aa4\u3002

    1. \u5206\uff08\u5212\u5206\u9636\u6bb5\uff09\uff1a\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u6216\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898\u65f6\u7ec8\u6b62\u3002
    2. \u6cbb\uff08\u5408\u5e76\u9636\u6bb5\uff09\uff1a\u4ece\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u95ee\u9898\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

    \u5982\u56fe 12-1 \u6240\u793a\uff0c\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\u4e4b\u4e00\u3002

    1. \u5206\uff1a\u9012\u5f52\u5730\u5c06\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\uff0c\u76f4\u5230\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u95ee\u9898\uff09\u3002
    2. \u6cbb\uff1a\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u6709\u5e8f\u7684\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u8fdb\u884c\u5408\u5e76\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002

    \u56fe 12-1 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65ad\u5206\u6cbb\u95ee\u9898","text":"

    \u4e00\u4e2a\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u51b3\uff0c\u901a\u5e38\u53ef\u4ee5\u53c2\u8003\u4ee5\u4e0b\u51e0\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

    1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u95ee\u9898\u53ef\u4ee5\u5206\u89e3\u6210\u89c4\u6a21\u66f4\u5c0f\u3001\u7c7b\u4f3c\u7684\u5b50\u95ee\u9898\uff0c\u4ee5\u53ca\u80fd\u591f\u4ee5\u76f8\u540c\u65b9\u5f0f\u9012\u5f52\u5730\u8fdb\u884c\u5212\u5206\u3002
    2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u5b50\u95ee\u9898\u4e4b\u95f4\u6ca1\u6709\u91cd\u53e0\uff0c\u4e92\u4e0d\u4f9d\u8d56\uff0c\u53ef\u4ee5\u72ec\u7acb\u89e3\u51b3\u3002
    3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u539f\u95ee\u9898\u7684\u89e3\u901a\u8fc7\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\u5f97\u6765\u3002

    \u663e\u7136\uff0c\u5f52\u5e76\u6392\u5e8f\u6ee1\u8db3\u4ee5\u4e0a\u4e09\u4e2a\u5224\u65ad\u4f9d\u636e\u3002

    1. \u95ee\u9898\u53ef\u4ee5\u5206\u89e3\uff1a\u9012\u5f52\u5730\u5c06\u6570\u7ec4\uff08\u539f\u95ee\u9898\uff09\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\uff09\u3002
    2. \u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff1a\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u53ef\u4ee5\u72ec\u7acb\u5730\u8fdb\u884c\u6392\u5e8f\uff08\u5b50\u95ee\u9898\u53ef\u4ee5\u72ec\u7acb\u8fdb\u884c\u6c42\u89e3\uff09\u3002
    3. \u5b50\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u5408\u5e76\uff1a\u4e24\u4e2a\u6709\u5e8f\u5b50\u6570\u7ec4\uff08\u5b50\u95ee\u9898\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\uff08\u539f\u95ee\u9898\u7684\u89e3\uff09\u3002
    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u901a\u8fc7\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

    \u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u51b3\u7b97\u6cd5\u95ee\u9898\uff0c\u5f80\u5f80\u8fd8\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5f52\u5e76\u6392\u5e8f\u3001\u5806\u6392\u5e8f\u76f8\u8f83\u4e8e\u9009\u62e9\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u4e3a\u5b83\u4eec\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

    \u90a3\u4e48\uff0c\u6211\u4eec\u4e0d\u7981\u53d1\u95ee\uff1a\u4e3a\u4ec0\u4e48\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c42\u903b\u8f91\u662f\u4ec0\u4e48\uff1f\u6362\u53e5\u8bdd\u8bf4\uff0c\u5c06\u5927\u95ee\u9898\u5206\u89e3\u4e3a\u591a\u4e2a\u5b50\u95ee\u9898\u3001\u89e3\u51b3\u5b50\u95ee\u9898\u3001\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u5408\u5e76\u4e3a\u539f\u95ee\u9898\u7684\u89e3\uff0c\u8fd9\u51e0\u6b65\u7684\u6548\u7387\u4e3a\u4ec0\u4e48\u6bd4\u76f4\u63a5\u89e3\u51b3\u539f\u95ee\u9898\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u8fd9\u4e2a\u95ee\u9898\u53ef\u4ee5\u4ece\u64cd\u4f5c\u6570\u91cf\u548c\u5e76\u884c\u8ba1\u7b97\u4e24\u65b9\u9762\u6765\u8ba8\u8bba\u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6570\u91cf\u4f18\u5316","text":"

    \u4ee5\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u4e3a\u4f8b\uff0c\u5176\u5904\u7406\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u9700\u8981 \\(O(n^2)\\) \u65f6\u95f4\u3002\u5047\u8bbe\u6211\u4eec\u6309\u7167\u56fe 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u5219\u5212\u5206\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6bcf\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O((n / 2)^2)\\) \u65f6\u95f4\uff0c\u5408\u5e76\u4e24\u4e2a\u5b50\u6570\u7ec4\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

    \\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

    \u56fe 12-2 \u00a0 \u5212\u5206\u6570\u7ec4\u524d\u540e\u7684\u5192\u6ce1\u6392\u5e8f

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u8ba1\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u8fb9\u548c\u53f3\u8fb9\u5206\u522b\u4e3a\u5212\u5206\u524d\u548c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u603b\u6570\uff1a

    \\[ \\begin{aligned} n^2 & > \\frac{n^2}{2} + 2n \\newline n^2 - \\frac{n^2}{2} - 2n & > 0 \\newline n(n - 4) & > 0 \\end{aligned} \\]

    \u8fd9\u610f\u5473\u7740\u5f53 \\(n > 4\\) \u65f6\uff0c\u5212\u5206\u540e\u7684\u64cd\u4f5c\u6570\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u5e94\u8be5\u66f4\u9ad8\u3002\u8bf7\u6ce8\u610f\uff0c\u5212\u5206\u540e\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u9636 \\(O(n^2)\\) \uff0c\u53ea\u662f\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\u4e86\u3002

    \u8fdb\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u4eec\u628a\u5b50\u6570\u7ec4\u4e0d\u65ad\u5730\u518d\u4ece\u4e2d\u70b9\u5904\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u505c\u6b62\u5212\u5206\u5462\uff1f\u8fd9\u79cd\u601d\u8def\u5b9e\u9645\u4e0a\u5c31\u662f\u201c\u5f52\u5e76\u6392\u5e8f\u201d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    \u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u4eec\u591a\u8bbe\u7f6e\u51e0\u4e2a\u5212\u5206\u70b9\uff0c\u5c06\u539f\u6570\u7ec4\u5e73\u5747\u5212\u5206\u4e3a \\(k\\) \u4e2a\u5b50\u6570\u7ec4\u5462\uff1f\u8fd9\u79cd\u60c5\u51b5\u4e0e\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u7c7b\u4f3c\uff0c\u5b83\u975e\u5e38\u9002\u5408\u6392\u5e8f\u6d77\u91cf\u6570\u636e\uff0c\u7406\u8bba\u4e0a\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230 \\(O(n + k)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e76\u884c\u8ba1\u7b97\u4f18\u5316","text":"

    \u6211\u4eec\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u5e76\u884c\u89e3\u51b3\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5206\u6cbb\u4e0d\u4ec5\u53ef\u4ee5\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8fd8\u6709\u5229\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002

    \u5e76\u884c\u4f18\u5316\u5728\u591a\u6838\u6216\u591a\u5904\u7406\u5668\u7684\u73af\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u4e3a\u7cfb\u7edf\u53ef\u4ee5\u540c\u65f6\u5904\u7406\u591a\u4e2a\u5b50\u95ee\u9898\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8ba1\u7b97\u8d44\u6e90\uff0c\u4ece\u800c\u663e\u8457\u51cf\u5c11\u603b\u4f53\u7684\u8fd0\u884c\u65f6\u95f4\u3002

    \u6bd4\u5982\u5728\u56fe 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u4eec\u5c06\u6d77\u91cf\u7684\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u5219\u53ef\u5c06\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52a1\u5206\u6563\u5230\u5404\u4e2a\u8ba1\u7b97\u5355\u5143\uff0c\u5b8c\u6210\u540e\u518d\u5408\u5e76\u7ed3\u679c\u3002

    \u56fe 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e76\u884c\u8ba1\u7b97

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u89c1\u5e94\u7528","text":"

    \u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u6765\u89e3\u51b3\u8bb8\u591a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\u3002

    • \u5bfb\u627e\u6700\u8fd1\u70b9\u5bf9\uff1a\u8be5\u7b97\u6cd5\u9996\u5148\u5c06\u70b9\u96c6\u5206\u6210\u4e24\u90e8\u5206\uff0c\u7136\u540e\u5206\u522b\u627e\u51fa\u4e24\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u70b9\u5bf9\uff0c\u6700\u540e\u627e\u51fa\u8de8\u8d8a\u4e24\u90e8\u5206\u7684\u6700\u8fd1\u70b9\u5bf9\u3002
    • \u5927\u6574\u6570\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u6574\u6570\u4e58\u6cd5\u5206\u89e3\u4e3a\u51e0\u4e2a\u8f83\u5c0f\u7684\u6574\u6570\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u77e9\u9635\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u7b97\u6cd5\uff0c\u5b83\u5c06\u5927\u77e9\u9635\u4e58\u6cd5\u5206\u89e3\u4e3a\u591a\u4e2a\u5c0f\u77e9\u9635\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u6c49\u8bfa\u5854\u95ee\u9898\uff1a\u6c49\u8bfa\u5854\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u89e3\u51b3\uff0c\u8fd9\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u5e94\u7528\u3002
    • \u6c42\u89e3\u9006\u5e8f\u5bf9\uff1a\u5728\u4e00\u4e2a\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6570\u5b57\u5927\u4e8e\u540e\u9762\u7684\u6570\u5b57\uff0c\u90a3\u4e48\u8fd9\u4e24\u4e2a\u6570\u5b57\u6784\u6210\u4e00\u4e2a\u9006\u5e8f\u5bf9\u3002\u6c42\u89e3\u9006\u5e8f\u5bf9\u95ee\u9898\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u501f\u52a9\u5f52\u5e76\u6392\u5e8f\u8fdb\u884c\u6c42\u89e3\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u8bbe\u8ba1\u4e2d\u5e94\u7528\u5f97\u975e\u5e38\u5e7f\u6cdb\u3002

    • \u4e8c\u5206\u67e5\u627e\uff1a\u4e8c\u5206\u67e5\u627e\u662f\u5c06\u6709\u5e8f\u6570\u7ec4\u4ece\u4e2d\u70b9\u7d22\u5f15\u5904\u5206\u4e3a\u4e24\u90e8\u5206\uff0c\u7136\u540e\u6839\u636e\u76ee\u6807\u503c\u4e0e\u4e2d\u95f4\u5143\u7d20\u503c\u6bd4\u8f83\u7ed3\u679c\uff0c\u51b3\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u533a\u95f4\uff0c\u5e76\u5728\u5269\u4f59\u533a\u95f4\u6267\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
    • \u5f52\u5e76\u6392\u5e8f\uff1a\u672c\u8282\u5f00\u5934\u5df2\u4ecb\u7ecd\uff0c\u4e0d\u518d\u8d58\u8ff0\u3002
    • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9009\u53d6\u4e00\u4e2a\u57fa\u51c6\u503c\uff0c\u7136\u540e\u628a\u6570\u7ec4\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u6570\u7ec4\u7684\u5143\u7d20\u6bd4\u57fa\u51c6\u503c\u5927\uff0c\u518d\u5bf9\u8fd9\u4e24\u90e8\u5206\u8fdb\u884c\u76f8\u540c\u7684\u5212\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u53ea\u5269\u4e0b\u4e00\u4e2a\u5143\u7d20\u3002
    • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c06\u6570\u636e\u5206\u6563\u5230\u591a\u4e2a\u6876\uff0c\u7136\u540e\u5bf9\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u5404\u4e2a\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u4ece\u800c\u5f97\u5230\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002
    • \u6811\uff1a\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\u3001AVL \u6811\u3001\u7ea2\u9ed1\u6811\u3001B \u6811\u3001B+ \u6811\u7b49\uff0c\u5b83\u4eec\u7684\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u89c6\u4e3a\u5206\u6cbb\u7b56\u7565\u7684\u5e94\u7528\u3002
    • \u5806\uff1a\u5806\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u5176\u5404\u79cd\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u5220\u9664\u548c\u5806\u5316\uff0c\u5b9e\u9645\u4e0a\u90fd\u9690\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
    • \u54c8\u5e0c\u8868\uff1a\u867d\u7136\u54c8\u5e0c\u8868\u5e76\u4e0d\u76f4\u63a5\u5e94\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u54c8\u5e0c\u51b2\u7a81\u89e3\u51b3\u65b9\u6848\u95f4\u63a5\u5e94\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u94fe\u5f0f\u5730\u5740\u4e2d\u7684\u957f\u94fe\u8868\u4f1a\u88ab\u8f6c\u5316\u4e3a\u7ea2\u9ed1\u6811\uff0c\u4ee5\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002

    \u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u79cd\u201c\u6da6\u7269\u7ec6\u65e0\u58f0\u201d\u7684\u7b97\u6cd5\u601d\u60f3\uff0c\u9690\u542b\u5728\u5404\u79cd\u7b97\u6cd5\u4e0e\u6570\u636e\u7ed3\u6784\u4e4b\u4e2d\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898","text":"

    \u5728\u5f52\u5e76\u6392\u5e8f\u548c\u6784\u5efa\u4e8c\u53c9\u6811\u4e2d\uff0c\u6211\u4eec\u90fd\u662f\u5c06\u539f\u95ee\u9898\u5206\u89e3\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a\u539f\u95ee\u9898\u4e00\u534a\u7684\u5b50\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u6c49\u8bfa\u5854\u95ee\u9898\uff0c\u6211\u4eec\u91c7\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

    Question

    \u7ed9\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8bb0\u4e3a A\u3001B \u548c C \u3002\u8d77\u59cb\u72b6\u6001\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u7740 \\(n\\) \u4e2a\u5706\u76d8\uff0c\u5b83\u4eec\u4ece\u4e0a\u5230\u4e0b\u6309\u7167\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u3002\u6211\u4eec\u7684\u4efb\u52a1\u662f\u8981\u628a\u8fd9 \\(n\\) \u4e2a\u5706\u76d8\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u5e76\u4fdd\u6301\u5b83\u4eec\u7684\u539f\u6709\u987a\u5e8f\u4e0d\u53d8\uff08\u5982\u56fe 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52a8\u5706\u76d8\u7684\u8fc7\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u89c4\u5219\u3002

    1. \u5706\u76d8\u53ea\u80fd\u4ece\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u62ff\u51fa\uff0c\u4ece\u53e6\u4e00\u6839\u67f1\u5b50\u9876\u90e8\u653e\u5165\u3002
    2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\u3002
    3. \u5c0f\u5706\u76d8\u5fc5\u987b\u65f6\u523b\u4f4d\u4e8e\u5927\u5706\u76d8\u4e4b\u4e0a\u3002

    \u56fe 12-10 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u793a\u4f8b

    \u6211\u4eec\u5c06\u89c4\u6a21\u4e3a \\(i\\) \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u8bb0\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c06 \\(3\\) \u4e2a\u5706\u76d8\u4ece A \u79fb\u52a8\u81f3 C \u7684\u6c49\u8bfa\u5854\u95ee\u9898\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u8651\u57fa\u672c\u60c5\u51b5","text":"

    \u5982\u56fe 12-11 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(1)\\) \uff0c\u5373\u5f53\u53ea\u6709\u4e00\u4e2a\u5706\u76d8\u65f6\uff0c\u6211\u4eec\u5c06\u5b83\u76f4\u63a5\u4ece A \u79fb\u52a8\u81f3 C \u5373\u53ef\u3002

    <1><2>

    \u56fe 12-11 \u00a0 \u89c4\u6a21\u4e3a 1 \u7684\u95ee\u9898\u7684\u89e3

    \u5982\u56fe 12-12 \u6240\u793a\uff0c\u5bf9\u4e8e\u95ee\u9898 \\(f(2)\\) \uff0c\u5373\u5f53\u6709\u4e24\u4e2a\u5706\u76d8\u65f6\uff0c\u7531\u4e8e\u8981\u65f6\u523b\u6ee1\u8db3\u5c0f\u5706\u76d8\u5728\u5927\u5706\u76d8\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u501f\u52a9 B \u6765\u5b8c\u6210\u79fb\u52a8\u3002

    1. \u5148\u5c06\u4e0a\u9762\u7684\u5c0f\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
    2. \u518d\u5c06\u5927\u5706\u76d8\u4ece A \u79fb\u81f3 C \u3002
    3. \u6700\u540e\u5c06\u5c0f\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u56fe 12-12 \u00a0 \u89c4\u6a21\u4e3a 2 \u7684\u95ee\u9898\u7684\u89e3

    \u89e3\u51b3\u95ee\u9898 \\(f(2)\\) \u7684\u8fc7\u7a0b\u53ef\u603b\u7ed3\u4e3a\uff1a\u5c06\u4e24\u4e2a\u5706\u76d8\u501f\u52a9 B \u4ece A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u79f0\u4e3a\u76ee\u6807\u67f1\u3001B \u79f0\u4e3a\u7f13\u51b2\u67f1\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u95ee\u9898\u5206\u89e3","text":"

    \u5bf9\u4e8e\u95ee\u9898 \\(f(3)\\) \uff0c\u5373\u5f53\u6709\u4e09\u4e2a\u5706\u76d8\u65f6\uff0c\u60c5\u51b5\u53d8\u5f97\u7a0d\u5fae\u590d\u6742\u4e86\u4e00\u4e9b\u3002

    \u56e0\u4e3a\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ece\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c06 A \u9876\u90e8\u7684\u4e24\u4e2a\u5706\u76d8\u770b\u4f5c\u4e00\u4e2a\u6574\u4f53\uff0c\u6267\u884c\u56fe 12-13 \u6240\u793a\u7684\u6b65\u9aa4\u3002\u8fd9\u6837\u4e09\u4e2a\u5706\u76d8\u5c31\u88ab\u987a\u5229\u5730\u4ece A \u79fb\u81f3 C \u4e86\u3002

    1. \u4ee4 B \u4e3a\u76ee\u6807\u67f1\u3001C \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece A \u79fb\u81f3 B \u3002
    2. \u5c06 A \u4e2d\u5269\u4f59\u7684\u4e00\u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u52a8\u81f3 C \u3002
    3. \u4ee4 C \u4e3a\u76ee\u6807\u67f1\u3001A \u4e3a\u7f13\u51b2\u67f1\uff0c\u5c06\u4e24\u4e2a\u5706\u76d8\u4ece B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u56fe 12-13 \u00a0 \u89c4\u6a21\u4e3a 3 \u7684\u95ee\u9898\u7684\u89e3

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u6211\u4eec\u5c06\u95ee\u9898 \\(f(3)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(2)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u4e4b\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002\u8fd9\u8bf4\u660e\u5b50\u95ee\u9898\u662f\u72ec\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u5e76\u3002

    \u81f3\u6b64\uff0c\u6211\u4eec\u53ef\u603b\u7ed3\u51fa\u56fe 12-14 \u6240\u793a\u7684\u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c06\u539f\u95ee\u9898 \\(f(n)\\) \u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \u548c\u4e00\u4e2a\u5b50\u95ee\u9898 \\(f(1)\\) \uff0c\u5e76\u6309\u7167\u4ee5\u4e0b\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u3002

    1. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 C \u4ece A \u79fb\u81f3 B \u3002
    2. \u5c06\u5269\u4f59 \\(1\\) \u4e2a\u5706\u76d8\u4ece A \u76f4\u63a5\u79fb\u81f3 C \u3002
    3. \u5c06 \\(n-1\\) \u4e2a\u5706\u76d8\u501f\u52a9 A \u4ece B \u79fb\u81f3 C \u3002

    \u5bf9\u4e8e\u8fd9\u4e24\u4e2a\u5b50\u95ee\u9898 \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u901a\u8fc7\u76f8\u540c\u7684\u65b9\u5f0f\u8fdb\u884c\u9012\u5f52\u5212\u5206\uff0c\u76f4\u81f3\u8fbe\u5230\u6700\u5c0f\u5b50\u95ee\u9898 \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52a8\u64cd\u4f5c\u5373\u53ef\u3002

    \u56fe 12-14 \u00a0 \u89e3\u51b3\u6c49\u8bfa\u5854\u95ee\u9898\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u9012\u5f52\u51fd\u6570 dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c06\u67f1 src \u9876\u90e8\u7684 \\(i\\) \u4e2a\u5706\u76d8\u501f\u52a9\u7f13\u51b2\u67f1 buf \u79fb\u52a8\u81f3\u76ee\u6807\u67f1 tar \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
    def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52a8\u4e00\u4e2a\u5706\u76d8\"\"\"\n    # \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan = src.pop()\n    # \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n\ndef solve_hanota(A: list[int], B: list[int], C: list[int]):\n    \"\"\"\u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898\"\"\"\n    n = len(A)\n    # \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
    hanota.cpp
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src.back();\n    src.pop_back();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.java
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.cs
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
    hanota.go
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src, tar *list.List) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    pan := src.Back()\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9876\u90e8\u5706\u76d8\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
    hanota.swift
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.popLast()!\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u5217\u8868\u5c3e\u90e8\u662f\u67f1\u5b50\u9876\u90e8\n    // \u5c06 src \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
    hanota.js
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src, tar) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.ts
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfunction move(src: number[], tar: number[]): void {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    const pan = src.pop();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.dart
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(List<int> src, List<int> tar) {\n  // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n  int pan = src.removeLast();\n  // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
    hanota.rs
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    let pan = src.pop().unwrap();\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.c
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nvoid dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
    hanota.kt
    /* \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n    val pan = src.removeAt(src.size - 1)\n    // \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
    hanota.rb
    ### \u79fb\u52a8\u4e00\u4e2a\u5706\u76d8 ###\ndef move(src, tar)\n  # \u4ece src \u9876\u90e8\u62ff\u51fa\u4e00\u4e2a\u5706\u76d8\n  pan = src.pop\n  # \u5c06\u5706\u76d8\u653e\u5165 tar \u9876\u90e8\n  tar << pan\nend\n\n### \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 f(i) ###\ndef dfs(i, src, buf, tar)\n  # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u4e2a\u5706\u76d8\uff0c\u5219\u76f4\u63a5\u5c06\u5176\u79fb\u5230 tar\n  if i == 1\n    move(src, tar)\n    return\n  end\n\n  # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 src \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf)\n  # \u5b50\u95ee\u9898 f(1) \uff1a\u5c06 src \u5269\u4f59\u4e00\u4e2a\u5706\u76d8\u79fb\u5230 tar\n  move(src, tar)\n  # \u5b50\u95ee\u9898 f(i-1) \uff1a\u5c06 buf \u9876\u90e8 i-1 \u4e2a\u5706\u76d8\u501f\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar)\nend\n\n### \u6c42\u89e3\u6c49\u8bfa\u5854\u95ee\u9898 ###\ndef solve_hanota(_A, _B, _C)\n  n = _A.length\n  # \u5c06 A \u9876\u90e8 n \u4e2a\u5706\u76d8\u501f\u52a9 B \u79fb\u5230 C\n  dfs(n, _A, _B, _C)\nend\n
    hanota.zig
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 12-15 \u6240\u793a\uff0c\u6c49\u8bfa\u5854\u95ee\u9898\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u4e3a \\(n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u5bf9\u5e94\u4e00\u4e2a\u5f00\u542f\u7684 dfs() \u51fd\u6570\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    \u56fe 12-15 \u00a0 \u6c49\u8bfa\u5854\u95ee\u9898\u7684\u9012\u5f52\u6811

    Quote

    \u6c49\u8bfa\u5854\u95ee\u9898\u6e90\u81ea\u4e00\u4e2a\u53e4\u8001\u7684\u4f20\u8bf4\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u4e2a\u5bfa\u5e99\u91cc\uff0c\u50e7\u4fa3\u4eec\u6709\u4e09\u6839\u9ad8\u5927\u7684\u94bb\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u4e2a\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5706\u76d8\u3002\u50e7\u4fa3\u4eec\u4e0d\u65ad\u5730\u79fb\u52a8\u5706\u76d8\uff0c\u4ed6\u4eec\u76f8\u4fe1\u5728\u6700\u540e\u4e00\u4e2a\u5706\u76d8\u88ab\u6b63\u786e\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u8fd9\u4e2a\u4e16\u754c\u5c31\u4f1a\u7ed3\u675f\u3002

    \u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fa3\u4eec\u6bcf\u79d2\u949f\u79fb\u52a8\u4e00\u6b21\uff0c\u603b\u5171\u9700\u8981\u5927\u7ea6 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7ea6 \\(5850\\) \u4ebf\u5e74\uff0c\u8fdc\u8fdc\u8d85\u8fc7\u4e86\u73b0\u5728\u5bf9\u5b87\u5b99\u5e74\u9f84\u7684\u4f30\u8ba1\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u8fd9\u4e2a\u4f20\u8bf4\u662f\u771f\u7684\uff0c\u6211\u4eec\u5e94\u8be5\u4e0d\u9700\u8981\u62c5\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u6765\u3002

    "},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7ed3","text":"
    • \u5206\u6cbb\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u7b97\u6cd5\u8bbe\u8ba1\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5212\u5206\uff09\u548c\u6cbb\uff08\u5408\u5e76\uff09\u4e24\u4e2a\u9636\u6bb5\uff0c\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\u3002
    • \u5224\u65ad\u662f\u5426\u662f\u5206\u6cbb\u7b97\u6cd5\u95ee\u9898\u7684\u4f9d\u636e\u5305\u62ec\uff1a\u95ee\u9898\u80fd\u5426\u5206\u89e3\u3001\u5b50\u95ee\u9898\u662f\u5426\u72ec\u7acb\u3001\u5b50\u95ee\u9898\u80fd\u5426\u5408\u5e76\u3002
    • \u5f52\u5e76\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u5e94\u7528\uff0c\u5176\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u7b49\u957f\u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u4e2a\u5143\u7d20\u65f6\u5f00\u59cb\u9010\u5c42\u5408\u5e76\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002
    • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u51cf\u5c11\u4e86\u64cd\u4f5c\u6570\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u540e\u6709\u5229\u4e8e\u7cfb\u7edf\u7684\u5e76\u884c\u4f18\u5316\u3002
    • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u51b3\u8bb8\u591a\u7b97\u6cd5\u95ee\u9898\uff0c\u4e5f\u5e7f\u6cdb\u5e94\u7528\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u8bbe\u8ba1\u4e2d\uff0c\u5904\u5904\u53ef\u89c1\u5176\u8eab\u5f71\u3002
    • \u76f8\u8f83\u4e8e\u66b4\u529b\u641c\u7d22\uff0c\u81ea\u9002\u5e94\u641c\u7d22\u6548\u7387\u66f4\u9ad8\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u7684\u641c\u7d22\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u5b9e\u73b0\u7684\u3002
    • \u4e8c\u5206\u67e5\u627e\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u4e2a\u5178\u578b\u5e94\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c06\u5b50\u95ee\u9898\u7684\u89e3\u8fdb\u884c\u5408\u5e76\u7684\u6b65\u9aa4\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u9012\u5f52\u5206\u6cbb\u5b9e\u73b0\u4e8c\u5206\u67e5\u627e\u3002
    • \u5728\u6784\u5efa\u4e8c\u53c9\u6811\u7684\u95ee\u9898\u4e2d\uff0c\u6784\u5efa\u6811\uff08\u539f\u95ee\u9898\uff09\u53ef\u4ee5\u5212\u5206\u4e3a\u6784\u5efa\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\uff08\u5b50\u95ee\u9898\uff09\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u5212\u5206\u524d\u5e8f\u904d\u5386\u548c\u4e2d\u5e8f\u904d\u5386\u7684\u7d22\u5f15\u533a\u95f4\u6765\u5b9e\u73b0\u3002
    • \u5728\u6c49\u8bfa\u5854\u95ee\u9898\u4e2d\uff0c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(n\\) \u7684\u95ee\u9898\u53ef\u4ee5\u5212\u5206\u4e3a\u4e24\u4e2a\u89c4\u6a21\u4e3a \\(n-1\\) \u7684\u5b50\u95ee\u9898\u548c\u4e00\u4e2a\u89c4\u6a21\u4e3a \\(1\\) \u7684\u5b50\u95ee\u9898\u3002\u6309\u987a\u5e8f\u89e3\u51b3\u8fd9\u4e09\u4e2a\u5b50\u95ee\u9898\u540e\uff0c\u539f\u95ee\u9898\u968f\u4e4b\u5f97\u5230\u89e3\u51b3\u3002
    "},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52a8\u6001\u89c4\u5212","text":"

    Abstract

    \u5c0f\u6eaa\u6c47\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u6c47\u5165\u5927\u6d77\u3002

    \u52a8\u6001\u89c4\u5212\u5c06\u5c0f\u95ee\u9898\u7684\u89e3\u6c47\u96c6\u6210\u5927\u95ee\u9898\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9886\u6211\u4eec\u8d70\u5411\u89e3\u51b3\u95ee\u9898\u7684\u5f7c\u5cb8\u3002

    "},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212
    • 14.2 \u00a0 DP \u95ee\u9898\u7279\u6027
    • 14.3 \u00a0 DP \u89e3\u9898\u601d\u8def
    • 14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898
    • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898
    • 14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898
    • 14.7 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52a8\u6001\u89c4\u5212\u95ee\u9898\u7279\u6027","text":"

    \u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4e60\u4e86\u52a8\u6001\u89c4\u5212\u662f\u5982\u4f55\u901a\u8fc7\u5b50\u95ee\u9898\u5206\u89e3\u6765\u6c42\u89e3\u539f\u95ee\u9898\u7684\u3002\u5b9e\u9645\u4e0a\uff0c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u7684\u4fa7\u91cd\u70b9\u4e0d\u540c\u3002

    • \u5206\u6cbb\u7b97\u6cd5\u9012\u5f52\u5730\u5c06\u539f\u95ee\u9898\u5212\u5206\u4e3a\u591a\u4e2a\u76f8\u4e92\u72ec\u7acb\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u95ee\u9898\uff0c\u5e76\u5728\u56de\u6eaf\u4e2d\u5408\u5e76\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6700\u7ec8\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002
    • \u52a8\u6001\u89c4\u5212\u4e5f\u5bf9\u95ee\u9898\u8fdb\u884c\u9012\u5f52\u5206\u89e3\uff0c\u4f46\u4e0e\u5206\u6cbb\u7b97\u6cd5\u7684\u4e3b\u8981\u533a\u522b\u662f\uff0c\u52a8\u6001\u89c4\u5212\u4e2d\u7684\u5b50\u95ee\u9898\u662f\u76f8\u4e92\u4f9d\u8d56\u7684\uff0c\u5728\u5206\u89e3\u8fc7\u7a0b\u4e2d\u4f1a\u51fa\u73b0\u8bb8\u591a\u91cd\u53e0\u5b50\u95ee\u9898\u3002
    • \u56de\u6eaf\u7b97\u6cd5\u5728\u5c1d\u8bd5\u548c\u56de\u9000\u4e2d\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u5e76\u901a\u8fc7\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u7d22\u5206\u652f\u3002\u539f\u95ee\u9898\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\u6784\u6210\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6bcf\u4e2a\u51b3\u7b56\u6b65\u9aa4\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u4e2a\u5b50\u95ee\u9898\u3002

    \u5b9e\u9645\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u5e38\u7528\u6765\u6c42\u89e3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5b83\u4eec\u4e0d\u4ec5\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u8fd8\u5177\u6709\u53e6\u5916\u4e24\u5927\u7279\u6027\uff1a\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784","text":"

    \u6211\u4eec\u5bf9\u722c\u697c\u68af\u95ee\u9898\u7a0d\u4f5c\u6539\u52a8\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9002\u5408\u5c55\u793a\u6700\u4f18\u5b50\u7ed3\u6784\u6982\u5ff5\u3002

    \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7

    \u7ed9\u5b9a\u4e00\u4e2a\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u6bcf\u4e00\u9636\u697c\u68af\u4e0a\u90fd\u8d34\u6709\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u4f60\u5728\u8be5\u53f0\u9636\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\u3002\u7ed9\u5b9a\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\u6570\u7ec4 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u4e2a\u53f0\u9636\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\\(cost[0]\\) \u4e3a\u5730\u9762\uff08\u8d77\u59cb\u70b9\uff09\u3002\u8bf7\u8ba1\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u4ef7\u624d\u80fd\u5230\u8fbe\u9876\u90e8\uff1f

    \u5982\u56fe 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9636\u7684\u4ee3\u4ef7\u5206\u522b\u4e3a \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5219\u4ece\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7\u4e3a \\(2\\) \u3002

    \u56fe 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u6700\u5c0f\u4ee3\u4ef7

    \u8bbe \\(dp[i]\\) \u4e3a\u722c\u5230\u7b2c \\(i\\) \u9636\u7d2f\u8ba1\u4ed8\u51fa\u7684\u4ee3\u4ef7\uff0c\u7531\u4e8e\u7b2c \\(i\\) \u9636\u53ea\u53ef\u80fd\u4ece \\(i - 1\\) \u9636\u6216 \\(i - 2\\) \u9636\u8d70\u6765\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u4e8e \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u4e3a\u4e86\u5c3d\u53ef\u80fd\u51cf\u5c11\u4ee3\u4ef7\uff0c\u6211\u4eec\u5e94\u8be5\u9009\u62e9\u4e24\u8005\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\uff1a

    \\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

    \u8fd9\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u542b\u4e49\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u662f\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\u7684\u3002

    \u672c\u9898\u663e\u7136\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6211\u4eec\u4ece\u4e24\u4e2a\u5b50\u95ee\u9898\u6700\u4f18\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9009\u51fa\u8f83\u4f18\u7684\u90a3\u4e00\u4e2a\uff0c\u5e76\u7528\u5b83\u6784\u5efa\u51fa\u539f\u95ee\u9898 \\(dp[i]\\) \u7684\u6700\u4f18\u89e3\u3002

    \u90a3\u4e48\uff0c\u4e0a\u4e00\u8282\u7684\u722c\u697c\u68af\u9898\u76ee\u6709\u6ca1\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u5462\uff1f\u5b83\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u4e2a\u8ba1\u6570\u95ee\u9898\uff0c\u4f46\u5982\u679c\u6362\u4e00\u79cd\u95ee\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6570\u91cf\u201d\u3002\u6211\u4eec\u610f\u5916\u5730\u53d1\u73b0\uff0c\u867d\u7136\u9898\u76ee\u4fee\u6539\u524d\u540e\u662f\u7b49\u4ef7\u7684\uff0c\u4f46\u6700\u4f18\u5b50\u7ed3\u6784\u6d6e\u73b0\u51fa\u6765\u4e86\uff1a\u7b2c \\(n\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u7b49\u4e8e\u7b2c \\(n-1\\) \u9636\u548c\u7b2c \\(n-2\\) \u9636\u6700\u5927\u65b9\u6848\u6570\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8bf4\uff0c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u89e3\u91ca\u65b9\u5f0f\u6bd4\u8f83\u7075\u6d3b\uff0c\u5728\u4e0d\u540c\u95ee\u9898\u4e2d\u4f1a\u6709\u4e0d\u540c\u7684\u542b\u4e49\u3002

    \u6839\u636e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72b6\u6001 \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f97\u5230\u52a8\u6001\u89c4\u5212\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    return dp[n]\n
    min_cost_climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.java
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDP(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.go
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDP(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.js
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDP(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n  }\n  return dp[n];\n}\n
    min_cost_climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    dp[n]\n}\n
    min_cost_climbing_stairs_dp.c
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDP(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    int res = dp[n];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDP(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1, 0)\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1], dp[2] = cost[1], cost[2]\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDP(comptime cost: []i32) i32 {\n    comptime var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = @min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\u3002

    \u56fe 14-7 \u00a0 \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u672c\u9898\u4e5f\u53ef\u4ee5\u8fdb\u884c\u7a7a\u95f4\u4f18\u5316\uff0c\u5c06\u4e00\u7ef4\u538b\u7f29\u81f3\u96f6\u7ef4\uff0c\u4f7f\u5f97\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:\n    \"\"\"\u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    a, b = cost[1], cost[2]\n    for i in range(3, n + 1):\n        a, b = b, min(a, b) + cost[i]\n    return b\n
    min_cost_climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.java
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.Min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.go
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        tmp := b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minCostClimbingStairsDPComp(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    var (a, b) = (cost[1], cost[2])\n    for i in 3 ... n {\n        (a, b) = (b, min(a, b) + cost[i])\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.js
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minCostClimbingStairsDPComp(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  int a = cost[1], b = cost[2];\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = min(a, tmp) + cost[i];\n    a = tmp;\n  }\n  return b;\n}\n
    min_cost_climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    };\n    let (mut a, mut b) = (cost[1], cost[2]);\n    for i in 3..=n {\n        let tmp = b;\n        b = cmp::min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    b\n}\n
    min_cost_climbing_stairs_dp.c
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minCostClimbingStairsDPComp(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = myMin(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minCostClimbingStairsDPComp(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    var a = cost[1]\n    var b = cost[2]\n    for (i in 3..n) {\n        val tmp = b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1, 0)\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1], dp[2] = cost[1], cost[2]\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n\n# \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\ndef min_cost_climbing_stairs_dp_comp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  a, b = cost[1], cost[2]\n  (3...(n + 1)).each { |i| a, b = b, [a, b].min + cost[i] }\n  b\nend\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u697c\u68af\u6700\u5c0f\u4ee3\u4ef7\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minCostClimbingStairsDPComp(cost: []i32) i32 {\n    var n = cost.len - 1;\n    if (n == 1 or n == 2) {\n        return cost[n];\n    }\n    var a = cost[1];\n    var b = cost[2];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        var tmp = b;\n        b = @min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u65e0\u540e\u6548\u6027","text":"

    \u65e0\u540e\u6548\u6027\u662f\u52a8\u6001\u89c4\u5212\u80fd\u591f\u6709\u6548\u89e3\u51b3\u95ee\u9898\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u4e49\u4e3a\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u786e\u5b9a\u7684\u72b6\u6001\uff0c\u5b83\u7684\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u5f53\u524d\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002

    \u4ee5\u722c\u697c\u68af\u95ee\u9898\u4e3a\u4f8b\uff0c\u7ed9\u5b9a\u72b6\u6001 \\(i\\) \uff0c\u5b83\u4f1a\u53d1\u5c55\u51fa\u72b6\u6001 \\(i+1\\) \u548c\u72b6\u6001 \\(i+2\\) \uff0c\u5206\u522b\u5bf9\u5e94\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u8fd9\u4e24\u79cd\u9009\u62e9\u65f6\uff0c\u6211\u4eec\u65e0\u987b\u8003\u8651\u72b6\u6001 \\(i\\) \u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5b83\u4eec\u5bf9\u72b6\u6001 \\(i\\) \u7684\u672a\u6765\u6ca1\u6709\u5f71\u54cd\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u7ed9\u722c\u697c\u68af\u95ee\u9898\u6dfb\u52a0\u4e00\u4e2a\u7ea6\u675f\uff0c\u60c5\u51b5\u5c31\u4e0d\u4e00\u6837\u4e86\u3002

    \u5e26\u7ea6\u675f\u722c\u697c\u68af

    \u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u4f46\u4e0d\u80fd\u8fde\u7eed\u4e24\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

    \u5982\u56fe 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u9636\u4ec5\u5269 \\(2\\) \u79cd\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u8fde\u7eed\u4e09\u6b21\u8df3 \\(1\\) \u9636\u7684\u65b9\u6848\u4e0d\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\uff0c\u56e0\u6b64\u88ab\u820d\u5f03\u3002

    \u56fe 14-8 \u00a0 \u5e26\u7ea6\u675f\u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

    \u5728\u8be5\u95ee\u9898\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\uff0c\u90a3\u4e48\u4e0b\u4e00\u8f6e\u5c31\u5fc5\u987b\u8df3 \\(2\\) \u9636\u3002\u8fd9\u610f\u5473\u7740\uff0c\u4e0b\u4e00\u6b65\u9009\u62e9\u4e0d\u80fd\u7531\u5f53\u524d\u72b6\u6001\uff08\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u72ec\u7acb\u51b3\u5b9a\uff0c\u8fd8\u548c\u524d\u4e00\u4e2a\u72b6\u6001\uff08\u4e0a\u4e00\u8f6e\u6240\u5728\u697c\u68af\u9636\u6570\uff09\u6709\u5173\u3002

    \u4e0d\u96be\u53d1\u73b0\uff0c\u6b64\u95ee\u9898\u5df2\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u4e3a \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f6e\u8df3 \\(1\\) \u9636\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8bb8\u591a\u201c\u4e0a\u4e00\u8f6e\u662f\u8df3 \\(1\\) \u9636\u4e0a\u6765\u7684\u201d\u65b9\u6848\uff0c\u800c\u4e3a\u4e86\u6ee1\u8db3\u7ea6\u675f\uff0c\u6211\u4eec\u5c31\u4e0d\u80fd\u5c06 \\(dp[i-1]\\) \u76f4\u63a5\u8ba1\u5165 \\(dp[i]\\) \u4e2d\u3002

    \u4e3a\u6b64\uff0c\u6211\u4eec\u9700\u8981\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff1a\u72b6\u6001 \\([i, j]\\) \u8868\u793a\u5904\u5728\u7b2c \\(i\\) \u9636\u5e76\u4e14\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(j\\) \u9636\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72b6\u6001\u5b9a\u4e49\u6709\u6548\u5730\u533a\u5206\u4e86\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u8fd8\u662f \\(2\\) \u9636\uff0c\u6211\u4eec\u53ef\u4ee5\u636e\u6b64\u5224\u65ad\u5f53\u524d\u72b6\u6001\u662f\u4ece\u4f55\u800c\u6765\u7684\u3002

    • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(1\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ea\u80fd\u9009\u62e9\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u4ece \\(dp[i-1, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002
    • \u5f53\u4e0a\u4e00\u8f6e\u8df3\u4e86 \\(2\\) \u9636\u65f6\uff0c\u4e0a\u4e0a\u4e00\u8f6e\u53ef\u9009\u62e9\u8df3 \\(1\\) \u9636\u6216\u8df3 \\(2\\) \u9636\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u4ece \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f6c\u79fb\u8fc7\u6765\u3002

    \u5982\u56fe 14-9 \u6240\u793a\uff0c\u5728\u8be5\u5b9a\u4e49\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u65b9\u6848\u6570\u3002\u6b64\u65f6\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

    \u56fe 14-9 \u00a0 \u8003\u8651\u7ea6\u675f\u4e0b\u7684\u9012\u63a8\u5173\u7cfb

    \u6700\u7ec8\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u4e24\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u9636\u7684\u65b9\u6848\u603b\u6570\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
    def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    return dp[n][1] + dp[n][2]\n
    climbing_stairs_constraint_dp.cpp
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.java
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.cs
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i, 1] = dp[i - 1, 2];\n        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];\n    }\n    return dp[n, 1] + dp[n, 2];\n}\n
    climbing_stairs_constraint_dp.go
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i][1] = dp[i-1][2]\n        dp[i][2] = dp[i-2][1] + dp[i-2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.swift
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.js
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.ts
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.dart
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i][1] = dp[i - 1][2];\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n  }\n  return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.rs
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_constraint_dp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return 1;\n    };\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.c
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(3, sizeof(int));\n    }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    int res = dp[n][1] + dp[n][2];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    climbing_stairs_constraint_dp.kt
    /* \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.rb
    ### \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef climbing_stairs_constraint_dp(n)\n  return 1 if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1) { Array.new(3, 0) }\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1][1], dp[1][2] = 1, 0\n  dp[2][1], dp[2][2] = 0, 1\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for i in 3...(n + 1)\n    dp[i][1] = dp[i - 1][2]\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n  end\n\n  dp[n][1] + dp[n][2]\nend\n
    climbing_stairs_constraint_dp.zig
    // \u5e26\u7ea6\u675f\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsConstraintDP(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u4e8e\u4ec5\u9700\u591a\u8003\u8651\u524d\u9762\u4e00\u4e2a\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6269\u5c55\u72b6\u6001\u5b9a\u4e49\uff0c\u4f7f\u5f97\u95ee\u9898\u91cd\u65b0\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u95ee\u9898\u5177\u6709\u975e\u5e38\u4e25\u91cd\u7684\u201c\u6709\u540e\u6548\u6027\u201d\u3002

    \u722c\u697c\u68af\u4e0e\u969c\u788d\u751f\u6210

    \u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\u3002\u89c4\u5b9a\u5f53\u722c\u5230\u7b2c \\(i\\) \u9636\u65f6\uff0c\u7cfb\u7edf\u81ea\u52a8\u4f1a\u5728\u7b2c \\(2i\\) \u9636\u4e0a\u653e\u4e0a\u969c\u788d\u7269\uff0c\u4e4b\u540e\u6240\u6709\u8f6e\u90fd\u4e0d\u5141\u8bb8\u8df3\u5230\u7b2c \\(2i\\) \u9636\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u4e24\u8f6e\u5206\u522b\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u9636\u4e0a\uff0c\u5219\u4e4b\u540e\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u9636\u4e0a\u3002\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

    \u5728\u8fd9\u4e2a\u95ee\u9898\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8dc3\u4f9d\u8d56\u8fc7\u53bb\u6240\u6709\u7684\u72b6\u6001\uff0c\u56e0\u4e3a\u6bcf\u4e00\u6b21\u8df3\u8dc3\u90fd\u4f1a\u5728\u66f4\u9ad8\u7684\u9636\u68af\u4e0a\u8bbe\u7f6e\u969c\u788d\uff0c\u5e76\u5f71\u54cd\u672a\u6765\u7684\u8df3\u8dc3\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u52a8\u6001\u89c4\u5212\u5f80\u5f80\u96be\u4ee5\u89e3\u51b3\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u590d\u6742\u7684\u7ec4\u5408\u4f18\u5316\u95ee\u9898\uff08\u4f8b\u5982\u65c5\u884c\u5546\u95ee\u9898\uff09\u4e0d\u6ee1\u8db3\u65e0\u540e\u6548\u6027\u3002\u5bf9\u4e8e\u8fd9\u7c7b\u95ee\u9898\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u542f\u53d1\u5f0f\u641c\u7d22\u3001\u9057\u4f20\u7b97\u6cd5\u3001\u5f3a\u5316\u5b66\u4e60\u7b49\uff0c\u4ece\u800c\u5728\u6709\u9650\u65f6\u95f4\u5185\u5f97\u5230\u53ef\u7528\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52a8\u6001\u89c4\u5212\u89e3\u9898\u601d\u8def","text":"

    \u4e0a\u4e24\u8282\u4ecb\u7ecd\u4e86\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4e3b\u8981\u7279\u5f81\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u4e00\u8d77\u63a2\u7a76\u4e24\u4e2a\u66f4\u52a0\u5b9e\u7528\u7684\u95ee\u9898\u3002

    1. \u5982\u4f55\u5224\u65ad\u4e00\u4e2a\u95ee\u9898\u662f\u4e0d\u662f\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff1f
    2. \u6c42\u89e3\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8be5\u4ece\u4f55\u5904\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9aa4\u662f\u4ec0\u4e48\uff1f
    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u95ee\u9898\u5224\u65ad","text":"

    \u603b\u7684\u6765\u8bf4\uff0c\u5982\u679c\u4e00\u4e2a\u95ee\u9898\u5305\u542b\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6ee1\u8db3\u65e0\u540e\u6548\u6027\uff0c\u90a3\u4e48\u5b83\u901a\u5e38\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u4eec\u5f88\u96be\u4ece\u95ee\u9898\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u8fd9\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f1a\u653e\u5bbd\u6761\u4ef6\uff0c\u5148\u89c2\u5bdf\u95ee\u9898\u662f\u5426\u9002\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7a77\u4e3e\uff09\u89e3\u51b3\u3002

    \u9002\u5408\u7528\u56de\u6eaf\u89e3\u51b3\u7684\u95ee\u9898\u901a\u5e38\u6ee1\u8db3\u201c\u51b3\u7b56\u6811\u6a21\u578b\u201d\uff0c\u8fd9\u79cd\u95ee\u9898\u53ef\u4ee5\u4f7f\u7528\u6811\u5f62\u7ed3\u6784\u6765\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u4e2a\u8282\u70b9\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\uff0c\u6bcf\u4e00\u6761\u8def\u5f84\u4ee3\u8868\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\u3002

    \u6362\u53e5\u8bdd\u8bf4\uff0c\u5982\u679c\u95ee\u9898\u5305\u542b\u660e\u786e\u7684\u51b3\u7b56\u6982\u5ff5\uff0c\u5e76\u4e14\u89e3\u662f\u901a\u8fc7\u4e00\u7cfb\u5217\u51b3\u7b56\u4ea7\u751f\u7684\uff0c\u90a3\u4e48\u5b83\u5c31\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u6765\u89e3\u51b3\u3002

    \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u52a8\u6001\u89c4\u5212\u95ee\u9898\u8fd8\u6709\u4e00\u4e9b\u5224\u65ad\u7684\u201c\u52a0\u5206\u9879\u201d\u3002

    • \u95ee\u9898\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u4f18\u5316\u63cf\u8ff0\u3002
    • \u95ee\u9898\u7684\u72b6\u6001\u80fd\u591f\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u3001\u591a\u7ef4\u77e9\u9635\u6216\u6811\u6765\u8868\u793a\uff0c\u5e76\u4e14\u4e00\u4e2a\u72b6\u6001\u4e0e\u5176\u5468\u56f4\u7684\u72b6\u6001\u5b58\u5728\u9012\u63a8\u5173\u7cfb\u3002

    \u76f8\u5e94\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u51cf\u5206\u9879\u201d\u3002

    • \u95ee\u9898\u7684\u76ee\u6807\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u4f18\u89e3\u3002
    • \u95ee\u9898\u63cf\u8ff0\u4e2d\u6709\u660e\u663e\u7684\u6392\u5217\u7ec4\u5408\u7684\u7279\u5f81\uff0c\u9700\u8981\u8fd4\u56de\u5177\u4f53\u7684\u591a\u4e2a\u65b9\u6848\u3002

    \u5982\u679c\u4e00\u4e2a\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\uff0c\u5e76\u5177\u6709\u8f83\u4e3a\u660e\u663e\u7684\u201c\u52a0\u5206\u9879\u201d\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5047\u8bbe\u5b83\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\uff0c\u5e76\u5728\u6c42\u89e3\u8fc7\u7a0b\u4e2d\u9a8c\u8bc1\u5b83\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u95ee\u9898\u6c42\u89e3\u6b65\u9aa4","text":"

    \u52a8\u6001\u89c4\u5212\u7684\u89e3\u9898\u6d41\u7a0b\u4f1a\u56e0\u95ee\u9898\u7684\u6027\u8d28\u548c\u96be\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9aa4\uff1a\u63cf\u8ff0\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5bfc\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u7b49\u3002

    \u4e3a\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u9898\u6b65\u9aa4\uff0c\u6211\u4eec\u4f7f\u7528\u4e00\u4e2a\u7ecf\u5178\u95ee\u9898\u201c\u6700\u5c0f\u8def\u5f84\u548c\u201d\u6765\u4e3e\u4f8b\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a \\(n \\times m\\) \u7684\u4e8c\u7ef4\u7f51\u683c grid \uff0c\u7f51\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u5305\u542b\u4e00\u4e2a\u975e\u8d1f\u6574\u6570\uff0c\u8868\u793a\u8be5\u5355\u5143\u683c\u7684\u4ee3\u4ef7\u3002\u673a\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u5355\u5143\u683c\u4e3a\u8d77\u59cb\u70b9\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52a8\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u8fbe\u53f3\u4e0b\u89d2\u5355\u5143\u683c\u3002\u8bf7\u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f84\u548c\u3002

    \u56fe 14-10 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u7f51\u683c\u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e3a \\(13\\) \u3002

    \u56fe 14-10 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u793a\u4f8b\u6570\u636e

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u672c\u9898\u7684\u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u5c31\u662f\u4ece\u5f53\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8bbe\u5f53\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u4e3a \\([i, j]\\) \uff0c\u5219\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u540e\uff0c\u7d22\u5f15\u53d8\u4e3a \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72b6\u6001\u5e94\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u4e24\u4e2a\u53d8\u91cf\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

    \u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u4ece\u8d77\u59cb\u70b9 \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\uff0c\u89e3\u8bb0\u4e3a \\(dp[i, j]\\) \u3002

    \u81f3\u6b64\uff0c\u6211\u4eec\u5c31\u5f97\u5230\u4e86\u56fe 14-11 \u6240\u793a\u7684\u4e8c\u7ef4 \\(dp\\) \u77e9\u9635\uff0c\u5176\u5c3a\u5bf8\u4e0e\u8f93\u5165\u7f51\u683c \\(grid\\) \u76f8\u540c\u3002

    \u56fe 14-11 \u00a0 \u72b6\u6001\u5b9a\u4e49\u4e0e dp \u8868

    Note

    \u52a8\u6001\u89c4\u5212\u548c\u56de\u6eaf\u8fc7\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u4e3a\u4e00\u4e2a\u51b3\u7b56\u5e8f\u5217\uff0c\u800c\u72b6\u6001\u7531\u6240\u6709\u51b3\u7b56\u53d8\u91cf\u6784\u6210\u3002\u5b83\u5e94\u5f53\u5305\u542b\u63cf\u8ff0\u89e3\u9898\u8fdb\u5ea6\u7684\u6240\u6709\u53d8\u91cf\uff0c\u5176\u5305\u542b\u4e86\u8db3\u591f\u7684\u4fe1\u606f\uff0c\u80fd\u591f\u7528\u6765\u63a8\u5bfc\u51fa\u4e0b\u4e00\u4e2a\u72b6\u6001\u3002

    \u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\uff0c\u6211\u4eec\u4f1a\u5b9a\u4e49\u4e00\u4e2a \\(dp\\) \u8868\u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u72b6\u6001\u7684\u6bcf\u4e2a\u72ec\u7acb\u53d8\u91cf\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\u3002\u4ece\u672c\u8d28\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72b6\u6001\u548c\u5b50\u95ee\u9898\u7684\u89e3\u4e4b\u95f4\u7684\u6620\u5c04\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u5bf9\u4e8e\u72b6\u6001 \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u4ece\u4e0a\u8fb9\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u8fb9\u683c\u5b50 \\([i, j-1]\\) \u8f6c\u79fb\u800c\u6765\u3002\u56e0\u6b64\u6700\u4f18\u5b50\u7ed3\u6784\u4e3a\uff1a\u5230\u8fbe \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e0e \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c\u4e2d\u8f83\u5c0f\u7684\u90a3\u4e00\u4e2a\u51b3\u5b9a\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u56fe 14-12 \u6240\u793a\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

    \\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

    \u56fe 14-12 \u00a0 \u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    Note

    \u6839\u636e\u5b9a\u4e49\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u95ee\u9898\u548c\u5b50\u95ee\u9898\u7684\u5173\u7cfb\uff0c\u627e\u51fa\u901a\u8fc7\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6765\u6784\u9020\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u4f18\u5b50\u7ed3\u6784\u3002

    \u4e00\u65e6\u6211\u4eec\u627e\u5230\u4e86\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5728\u672c\u9898\u4e2d\uff0c\u5904\u5728\u9996\u884c\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u5de6\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u5904\u5728\u9996\u5217\u7684\u72b6\u6001\u53ea\u80fd\u4ece\u5176\u4e0a\u8fb9\u7684\u72b6\u6001\u5f97\u6765\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u8fb9\u754c\u6761\u4ef6\u3002

    \u5982\u56fe 14-13 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u6211\u4eec\u4f7f\u7528\u5faa\u73af\u6765\u904d\u5386\u77e9\u9635\uff0c\u5916\u5faa\u73af\u904d\u5386\u5404\u884c\uff0c\u5185\u5faa\u73af\u904d\u5386\u5404\u5217\u3002

    \u56fe 14-13 \u00a0 \u8fb9\u754c\u6761\u4ef6\u4e0e\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    Note

    \u8fb9\u754c\u6761\u4ef6\u5728\u52a8\u6001\u89c4\u5212\u4e2d\u7528\u4e8e\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u7d22\u4e2d\u7528\u4e8e\u526a\u679d\u3002

    \u72b6\u6001\u8f6c\u79fb\u987a\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8bc1\u5728\u8ba1\u7b97\u5f53\u524d\u95ee\u9898\u7684\u89e3\u65f6\uff0c\u6240\u6709\u5b83\u4f9d\u8d56\u7684\u66f4\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u90fd\u5df2\u7ecf\u88ab\u6b63\u786e\u5730\u8ba1\u7b97\u51fa\u6765\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u5df2\u7ecf\u53ef\u4ee5\u76f4\u63a5\u5199\u51fa\u52a8\u6001\u89c4\u5212\u4ee3\u7801\u3002\u7136\u800c\u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u7d22 \\(\\rightarrow\\) \u8bb0\u5fc6\u5316\u641c\u7d22 \\(\\rightarrow\\) \u52a8\u6001\u89c4\u5212\u201d\u7684\u987a\u5e8f\u5b9e\u73b0\u66f4\u52a0\u7b26\u5408\u601d\u7ef4\u4e60\u60ef\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

    \u4ece\u72b6\u6001 \\([i, j]\\) \u5f00\u59cb\u641c\u7d22\uff0c\u4e0d\u65ad\u5206\u89e3\u4e3a\u66f4\u5c0f\u7684\u72b6\u6001 \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u9012\u5f52\u51fd\u6570\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, j]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u4ece \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f84\u548c \\(dp[i, j]\\) \u3002
    • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53 \\(i = 0\\) \u4e14 \\(j = 0\\) \u65f6\uff0c\u8fd4\u56de\u4ee3\u4ef7 \\(grid[0, 0]\\) \u3002
    • \u526a\u679d\uff1a\u5f53 \\(i < 0\\) \u65f6\u6216 \\(j < 0\\) \u65f6\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u65f6\u8fd4\u56de\u4ee3\u4ef7 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.Min(left, up) + grid[i][j];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)\n    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  return min(left, up) + grid[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs(grid, i - 1, j);\n    let left = min_path_sum_dfs(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22 ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  return grid[i][j] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  return Float::INFINITY if i < 0 || j < 0\n  # \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  up = min_path_sum_dfs(grid, i - 1, j)\n  left = min_path_sum_dfs(grid, i, j - 1)\n  # \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  [left, up].min + grid[i][j]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u66b4\u529b\u641c\u7d22\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-14 \u7ed9\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u4e3a\u6839\u8282\u70b9\u7684\u9012\u5f52\u6811\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5176\u6570\u91cf\u4f1a\u968f\u7740\u7f51\u683c grid \u7684\u5c3a\u5bf8\u53d8\u5927\u800c\u6025\u5267\u589e\u591a\u3002

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u539f\u56e0\u4e3a\uff1a\u5b58\u5728\u591a\u6761\u8def\u5f84\u53ef\u4ee5\u4ece\u5de6\u4e0a\u89d2\u5230\u8fbe\u67d0\u4e00\u5355\u5143\u683c\u3002

    \u56fe 14-14 \u00a0 \u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

    \u6bcf\u4e2a\u72b6\u6001\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u4e24\u79cd\u9009\u62e9\uff0c\u4ece\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u603b\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^{m + n})\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u79cd\u8ba1\u7b97\u65b9\u5f0f\u672a\u8003\u8651\u4e34\u8fd1\u7f51\u683c\u8fb9\u754c\u7684\u60c5\u51b5\uff0c\u5f53\u5230\u8fbe\u7f51\u7edc\u8fb9\u754c\u65f6\u53ea\u5269\u4e0b\u4e00\u79cd\u9009\u62e9\uff0c\u56e0\u6b64\u5b9e\u9645\u7684\u8def\u5f84\u6570\u91cf\u4f1a\u5c11\u4e00\u4e9b\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

    \u6211\u4eec\u5f15\u5165\u4e00\u4e2a\u548c\u7f51\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8bb0\u5fc6\u5217\u8868 mem \uff0c\u7528\u4e8e\u8bb0\u5f55\u5404\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u8fdb\u884c\u526a\u679d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dfs_mem(\n    grid: list[list[int]], mem: list[list[int]], i: int, j: int\n) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.Min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)\n    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u7c7b\u578b\u662f\u56fa\u5b9a\u8303\u56f4\u7684\u6574\u6570\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u65e0\u7a77\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i as usize][j as usize] != -1 {\n        return mem[i as usize][j as usize];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);\n    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];\n    mem[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef min_path_sum_dfs_mem(grid, mem, i, j)\n  # \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n  return grid[0][0] if i == 0 && j == 0\n  # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n  return Float::INFINITY if i < 0 || j < 0\n  # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return mem[i][j] if mem[i][j] != -1\n  # \u5de6\u8fb9\u548c\u4e0a\u8fb9\u5355\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n  # \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n  mem[i][j] = [left, up].min + grid[i][j]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u4e3a\u5de6\u4e0a\u89d2\u5355\u5143\u683c\uff0c\u5219\u7ec8\u6b62\u641c\u7d22\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de +\u221e \u4ee3\u4ef7\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] != -1) {\n        return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    }\n    // \u8ba1\u7b97\u4ece\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u4ece\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f84\u4ee3\u4ef7\n    mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))] = @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n    return mem[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8bb0\u5fc6\u5316\u540e\uff0c\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u72b6\u6001\u603b\u6570\uff0c\u5373\u7f51\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

    \u56fe 14-15 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

    \u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * m for _ in range(n)]\n    dp[0][0] = grid[0][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n):\n        for j in range(1, m):\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n    return dp[n - 1][m - 1]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n, vector<int>(m));\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n][m];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDP(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n, m];\n    dp[0, 0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0, j] = dp[0, j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i, 0] = dp[i - 1, 0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1, m - 1];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n)\n    for i := 0; i < n; i++ {\n        dp[i] = make([]int, m)\n    }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        for j := 1; j < m; j++ {\n            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]\n        }\n    }\n    return dp[n-1][m-1]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDP(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ..< n {\n        for j in 1 ..< m {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDP(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i < n; i++) {\n        for (let j: number = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));\n  dp[0][0] = grid[0][0];\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j < m; j++) {\n    dp[0][j] = dp[0][j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n  for (int i = 1; i < n; i++) {\n    dp[i][0] = dp[i - 1][0] + grid[i][0];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i < n; i++) {\n    for (int j = 1; j < m; j++) {\n      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n    }\n  }\n  return dp[n - 1][m - 1];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; m]; n];\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..n {\n        for j in 1..m {\n            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    dp[n - 1][m - 1]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nint minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc(n * sizeof(int *));\n    for (int i = 0; i < n; i++) {\n        dp[i] = calloc(m, sizeof(int));\n    }\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    int res = dp[n - 1][m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i < n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDP(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n) { IntArray(m) }\n    dp[0][0] = grid[0][0]\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..<n) {\n        for (j in 1..<m) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef min_path_sum_dp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n) { Array.new(m, 0) }\n  dp[0][0] = grid[0][0]\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n  (1...n).each { |i| dp[i][0] = dp[i - 1][0] + grid[i][0] }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for i in 1...n\n    for j in 1...m\n      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]\n    end\n  end\n  dp[n -1][m -1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u52a8\u6001\u89c4\u5212\nfn minPathSumDP(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][m]i32{[_]i32{0} ** m} ** n;\n    dp[0][0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n) |i| {\n        for (1..m) |j| {\n            dp[i][j] = @min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f84\u548c\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\uff0c\u5176\u904d\u5386\u4e86\u6574\u4e2a\u7f51\u683c\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

    \u6570\u7ec4 dp \u5927\u5c0f\u4e3a \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nm)\\) \u3002

    <1><2><3><4><5><6><7><8><9><10><11><12>

    \u56fe 14-16 \u00a0 \u6700\u5c0f\u8def\u5f84\u548c\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e\u6bcf\u4e2a\u683c\u5b50\u53ea\u4e0e\u5176\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u683c\u5b50\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u53ea\u7528\u4e00\u4e2a\u5355\u884c\u6570\u7ec4\u6765\u5b9e\u73b0 \\(dp\\) \u8868\u3002

    \u8bf7\u6ce8\u610f\uff0c\u56e0\u4e3a\u6570\u7ec4 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72b6\u6001\uff0c\u6240\u4ee5\u6211\u4eec\u65e0\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72b6\u6001\uff0c\u800c\u662f\u5728\u904d\u5386\u6bcf\u884c\u65f6\u66f4\u65b0\u5b83\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_path_sum.py
    def min_path_sum_dp_comp(grid: list[list[int]]) -> int:\n    \"\"\"\u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in range(1, m):\n        dp[j] = dp[j - 1] + grid[0][j]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m):\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n    return dp[m - 1]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint MinPathSumDPComp(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[m];\n    dp[0] = grid[0][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j := 1; j < m; j++ {\n        dp[j] = dp[j-1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j < m; j++ {\n            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]\n        }\n    }\n    return dp[m-1]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc minPathSumDPComp(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for j in 1 ..< m {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ..< n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ..< m {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction minPathSumDPComp(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = new Array(m);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(m, 0);\n  dp[0] = grid[0][0];\n  for (int j = 1; j < m; j++) {\n    dp[j] = dp[j - 1] + grid[0][j];\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j < m; j++) {\n      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n    }\n  }\n  return dp[m - 1];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; m];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for j in 1..m {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..m {\n            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    dp[m - 1]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(m, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j < m; j++) {\n            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    int res = dp[m - 1];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun minPathSumDPComp(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(m)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0]\n    for (j in 1..<m) {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..<n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..<m) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
    min_path_sum.rb
    ### \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef min_path_sum_dp_comp(grid)\n  n, m = grid.length, grid.first.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(m, 0)\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  dp[0] = grid[0][0]\n  (1...m).each { |j| dp[j] = dp[j - 1] + grid[0][j] }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for i in 1...n\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    (1...m).each { |j| dp[j] = [dp[j - 1], dp[j]].min + grid[i][j] }\n  end\n  dp[m - 1]\nend\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f84\u548c\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn minPathSumDPComp(comptime grid: anytype) i32 {\n    comptime var n = grid.len;\n    comptime var m = grid[0].len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** m;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    dp[0] = grid[0][0];\n    for (1..m) |j| {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        for (1..m) |j| {\n            dp[j] = @min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898","text":"

    \u7f16\u8f91\u8ddd\u79bb\uff0c\u4e5f\u79f0 Levenshtein \u8ddd\u79bb\uff0c\u6307\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u4e92\u76f8\u8f6c\u6362\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6570\uff0c\u901a\u5e38\u7528\u4e8e\u5728\u4fe1\u606f\u68c0\u7d22\u548c\u81ea\u7136\u8bed\u8a00\u5904\u7406\u4e2d\u5ea6\u91cf\u4e24\u4e2a\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

    Question

    \u8f93\u5165\u4e24\u4e2a\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c06 \\(s\\) \u8f6c\u6362\u4e3a \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

    \u4f60\u53ef\u4ee5\u5728\u4e00\u4e2a\u5b57\u7b26\u4e32\u4e2d\u8fdb\u884c\u4e09\u79cd\u7f16\u8f91\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u4e2a\u5b57\u7b26\u3001\u5220\u9664\u4e00\u4e2a\u5b57\u7b26\u3001\u5c06\u5b57\u7b26\u66ff\u6362\u4e3a\u4efb\u610f\u4e00\u4e2a\u5b57\u7b26\u3002

    \u5982\u56fe 14-27 \u6240\u793a\uff0c\u5c06 kitten \u8f6c\u6362\u4e3a sitting \u9700\u8981\u7f16\u8f91 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u4e0e 1 \u6b21\u6dfb\u52a0\u64cd\u4f5c\uff1b\u5c06 hello \u8f6c\u6362\u4e3a algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u6362\u64cd\u4f5c\u548c 1 \u6b21\u5220\u9664\u64cd\u4f5c\u3002

    \u56fe 14-27 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u793a\u4f8b\u6570\u636e

    \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u51b3\u7b56\u6811\u6a21\u578b\u6765\u89e3\u91ca\u3002\u5b57\u7b26\u4e32\u5bf9\u5e94\u6811\u8282\u70b9\uff0c\u4e00\u8f6e\u51b3\u7b56\uff08\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\uff09\u5bf9\u5e94\u6811\u7684\u4e00\u6761\u8fb9\u3002

    \u5982\u56fe 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u51b5\u4e0b\uff0c\u6bcf\u4e2a\u8282\u70b9\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8bb8\u591a\u6761\u8fb9\uff0c\u6bcf\u6761\u8fb9\u5bf9\u5e94\u4e00\u79cd\u64cd\u4f5c\uff0c\u8fd9\u610f\u5473\u7740\u4ece hello \u8f6c\u6362\u5230 algo \u6709\u8bb8\u591a\u79cd\u53ef\u80fd\u7684\u8def\u5f84\u3002

    \u4ece\u51b3\u7b56\u6811\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u8282\u70b9 hello \u548c\u8282\u70b9 algo \u4e4b\u95f4\u7684\u6700\u77ed\u8def\u5f84\u3002

    \u56fe 14-28 \u00a0 \u57fa\u4e8e\u51b3\u7b56\u6811\u6a21\u578b\u8868\u793a\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u6bcf\u4e00\u8f6e\u7684\u51b3\u7b56\u662f\u5bf9\u5b57\u7b26\u4e32 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\u64cd\u4f5c\u3002

    \u6211\u4eec\u5e0c\u671b\u5728\u7f16\u8f91\u64cd\u4f5c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u95ee\u9898\u7684\u89c4\u6a21\u9010\u6e10\u7f29\u5c0f\uff0c\u8fd9\u6837\u624d\u80fd\u6784\u5efa\u5b50\u95ee\u9898\u3002\u8bbe\u5b57\u7b26\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \uff0c\u6211\u4eec\u5148\u8003\u8651\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u4eec\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u76f4\u63a5\u8003\u8651 \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u4eec\u9700\u8981\u5bf9 \\(s\\) \u8fdb\u884c\u4e00\u6b21\u7f16\u8f91\uff08\u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\uff09\uff0c\u4f7f\u5f97\u4e24\u5b57\u7b26\u4e32\u5c3e\u90e8\u7684\u5b57\u7b26\u76f8\u540c\uff0c\u4ece\u800c\u53ef\u4ee5\u8df3\u8fc7\u5b83\u4eec\uff0c\u8003\u8651\u89c4\u6a21\u66f4\u5c0f\u7684\u95ee\u9898\u3002

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u6211\u4eec\u5728\u5b57\u7b26\u4e32 \\(s\\) \u4e2d\u8fdb\u884c\u7684\u6bcf\u4e00\u8f6e\u51b3\u7b56\uff08\u7f16\u8f91\u64cd\u4f5c\uff09\uff0c\u90fd\u4f1a\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u4f59\u7684\u5f85\u5339\u914d\u5b57\u7b26\u53d1\u751f\u53d8\u5316\u3002\u56e0\u6b64\uff0c\u72b6\u6001\u4e3a\u5f53\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u8651\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u4e2a\u5b57\u7b26\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

    \u72b6\u6001 \\([i, j]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\uff1a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002

    \u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u8003\u8651\u5b50\u95ee\u9898 \\(dp[i, j]\\) \uff0c\u5176\u5bf9\u5e94\u7684\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5c3e\u90e8\u5b57\u7b26\u4e3a \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u636e\u4e0d\u540c\u7f16\u8f91\u64cd\u4f5c\u5206\u4e3a\u56fe 14-29 \u6240\u793a\u7684\u4e09\u79cd\u60c5\u51b5\u3002

    1. \u5728 \\(s[i-1]\\) \u4e4b\u540e\u6dfb\u52a0 \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i, j-1]\\) \u3002
    2. \u5220\u9664 \\(s[i-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j]\\) \u3002
    3. \u5c06 \\(s[i-1]\\) \u66ff\u6362\u4e3a \\(t[j-1]\\) \uff0c\u5219\u5269\u4f59\u5b50\u95ee\u9898 \\(dp[i-1, j-1]\\) \u3002

    \u56fe 14-29 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u72b6\u6001\u8f6c\u79fb

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7f16\u8f91\u6b65\u6570 \\(1\\) \u3002\u5bf9\u5e94\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

    \u8bf7\u6ce8\u610f\uff0c\u5f53 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ dp[i, j] = dp[i-1, j-1] \\]

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5f53\u4e24\u5b57\u7b26\u4e32\u90fd\u4e3a\u7a7a\u65f6\uff0c\u7f16\u8f91\u6b65\u6570\u4e3a \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u5f53 \\(s\\) \u4e3a\u7a7a\u4f46 \\(t\\) \u4e0d\u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(t\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u5f53 \\(s\\) \u4e0d\u4e3a\u7a7a\u4f46 \\(t\\) \u4e3a\u7a7a\u65f6\uff0c\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u7b49\u4e8e \\(s\\) \u7684\u957f\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

    \u89c2\u5bdf\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8d56\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in range(1, n + 1):\n        dp[i][0] = i\n    for j in range(1, m + 1):\n        dp[0][j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for j in range(1, m + 1):\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1\n    return dp[n][m]\n
    edit_distance.cpp
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.java
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.cs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i, 0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0, j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n, m];\n}\n
    edit_distance.go
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, m+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i := 1; i <= n; i++ {\n        dp[i][0] = i\n    }\n    for j := 1; j <= m; j++ {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= m; j++ {\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.swift
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDP(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1 ... n {\n        dp[i][0] = i\n    }\n    for j in 1 ... m {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for j in 1 ... m {\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.js
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.ts
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDP(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: m + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.dart
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(String s, String t) {\n  int n = s.length, m = t.length;\n  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int i = 1; i <= n; i++) {\n    dp[i][0] = i;\n  }\n  for (int j = 1; j <= m; j++) {\n    dp[0][j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int j = 1; j <= m; j++) {\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n      }\n    }\n  }\n  return dp[n][m];\n}\n
    edit_distance.rs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![vec![0; m + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for i in 1..=n {\n        dp[i][0] = i as i32;\n    }\n    for j in 1..m {\n        dp[0][j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for j in 1..=m {\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] =\n                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    dp[n][m]\n}\n
    edit_distance.c
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nint editDistanceDP(char *s, char *t, int n, int m) {\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(m + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    int res = dp[n][m];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    edit_distance.kt
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDP(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = Array(n + 1) { IntArray(m + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (i in 1..n) {\n        dp[i][0] = i\n    }\n    for (j in 1..m) {\n        dp[0][j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (j in 1..m) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.rb
    ### \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef edit_distance_dp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(n + 1) { Array.new(m + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(n + 1)).each { |i| dp[i][0] = i }\n  (1...(m + 1)).each { |j| dp[0][j] = j }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for j in 1...(m +1)\n      if s[i - 1] == t[j - 1]\n        # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[i][j] = dp[i - 1][j - 1]\n      else\n        # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[i][j] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1\n      end\n    end\n  end\n  dp[n][m]\nend\n
    edit_distance.zig
    // \u7f16\u8f91\u8ddd\u79bb\uff1a\u52a8\u6001\u89c4\u5212\nfn editDistanceDP(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_][m + 1]i32{[_]i32{0} ** (m + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..n + 1) |i| {\n        dp[i][0] = @intCast(i);\n    }\n    for (1..m + 1) |j| {\n        dp[0][j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..m + 1) |j| {\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[i][j] = @min(@min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-30 \u6240\u793a\uff0c\u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u8fc7\u7a0b\u4e0e\u80cc\u5305\u95ee\u9898\u975e\u5e38\u7c7b\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5199\u4e00\u4e2a\u4e8c\u7ef4\u7f51\u683c\u7684\u8fc7\u7a0b\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u56fe 14-30 \u00a0 \u7f16\u8f91\u8ddd\u79bb\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e \\(dp[i,j]\\) \u662f\u7531\u4e0a\u65b9 \\(dp[i-1, j]\\)\u3001\u5de6\u65b9 \\(dp[i, j-1]\\)\u3001\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \u8f6c\u79fb\u800c\u6765\u7684\uff0c\u800c\u6b63\u5e8f\u904d\u5386\u4f1a\u4e22\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u904d\u5386\u65e0\u6cd5\u63d0\u524d\u6784\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u4e24\u79cd\u904d\u5386\u987a\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

    \u4e3a\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf leftup \u6765\u6682\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u4ece\u800c\u53ea\u9700\u8003\u8651\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u65f6\u7684\u60c5\u51b5\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u904d\u5386\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in range(1, n + 1):\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u6682\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    return dp[m]\n
    edit_distance.cpp
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.java
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.cs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.go
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i := 1; i <= n; i++ {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.swift
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc editDistanceDPComp(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: 0, count: m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1 ... n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.js
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.ts
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction editDistanceDPComp(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.dart
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
    edit_distance.rs
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn edit_distance_dp_comp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![0; m + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for i in 1..=n {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for j in 1..=m {\n            let temp = dp[j];\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
    edit_distance.c
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    edit_distance.kt
    /* \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (i in 1..n) {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.rb
    ### \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef edit_distance_dp_comp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(m + 1, 0)\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n  (1...(m + 1)).each { |j| dp[j] = j }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n  for i in 1...(n + 1)\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n    leftup = dp.first # \u6682\u5b58 dp[i-1, j-1]\n    dp[0] += 1\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n    for j in 1...(m + 1)\n      temp = dp[j]\n      if s[i - 1] == t[j - 1]\n        # \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n        dp[j] = leftup\n      else\n        # \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n        dp[j] = [dp[j - 1], dp[j], leftup].min + 1\n      end\n      leftup = temp # \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n    end\n  end\n  dp[m]\nend\n
    edit_distance.zig
    // \u7f16\u8f91\u8ddd\u79bb\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn editDistanceDPComp(comptime s: []const u8, comptime t: []const u8) i32 {\n    comptime var n = s.len;\n    comptime var m = t.len;\n    var dp = [_]i32{0} ** (m + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\n    for (1..n + 1) |i| {\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u6682\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u4e24\u5b57\u7b26\u76f8\u7b49\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u6b64\u4e24\u5b57\u7b26\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7f16\u8f91\u6b65\u6570 = \u63d2\u5165\u3001\u5220\u9664\u3001\u66ff\u6362\u8fd9\u4e09\u79cd\u64cd\u4f5c\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u4e3a\u4e0b\u4e00\u8f6e\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52a8\u6001\u89c4\u5212","text":"

    \u52a8\u6001\u89c4\u5212\uff08dynamic programming\uff09\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u7b97\u6cd5\u8303\u5f0f\uff0c\u5b83\u5c06\u4e00\u4e2a\u95ee\u9898\u5206\u89e3\u4e3a\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u907f\u514d\u91cd\u590d\u8ba1\u7b97\uff0c\u4ece\u800c\u5927\u5e45\u63d0\u5347\u65f6\u95f4\u6548\u7387\u3002

    \u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u4ece\u4e00\u4e2a\u7ecf\u5178\u4f8b\u9898\u5165\u624b\uff0c\u5148\u7ed9\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c2\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u518d\u9010\u6b65\u5bfc\u51fa\u66f4\u9ad8\u6548\u7684\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

    \u722c\u697c\u68af

    \u7ed9\u5b9a\u4e00\u4e2a\u5171\u6709 \\(n\\) \u9636\u7684\u697c\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u9636\u6216\u8005 \\(2\\) \u9636\uff0c\u8bf7\u95ee\u6709\u591a\u5c11\u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\uff1f

    \u5982\u56fe 14-1 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e00\u4e2a \\(3\\) \u9636\u697c\u68af\uff0c\u5171\u6709 \\(3\\) \u79cd\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u697c\u9876\u3002

    \u56fe 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u9636\u7684\u65b9\u6848\u6570\u91cf

    \u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u65b9\u6848\u6570\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u56de\u6eaf\u6765\u7a77\u4e3e\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5c06\u722c\u697c\u68af\u60f3\u8c61\u4e3a\u4e00\u4e2a\u591a\u8f6e\u9009\u62e9\u7684\u8fc7\u7a0b\uff1a\u4ece\u5730\u9762\u51fa\u53d1\uff0c\u6bcf\u8f6e\u9009\u62e9\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u6bcf\u5f53\u5230\u8fbe\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u65b9\u6848\u6570\u91cf\u52a0 \\(1\\) \uff0c\u5f53\u8d8a\u8fc7\u697c\u68af\u9876\u90e8\u65f6\u5c31\u5c06\u5176\u526a\u679d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_backtrack.py
    def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:\n    \"\"\"\u56de\u6eaf\"\"\"\n    # \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n:\n            continue\n        # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    state = 0  # \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n
    climbing_stairs_backtrack.cpp
    /* \u56de\u6eaf */\nvoid backtrack(vector<int> &choices, int state, int n, vector<int> &res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;                // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res[0];\n}\n
    climbing_stairs_backtrack.java
    /* \u56de\u6eaf */\nvoid backtrack(List<Integer> choices, int state, int n, List<Integer> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.cs
    /* \u56de\u6eaf */\nvoid Backtrack(List<int> choices, int state, int n, List<int> res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    Backtrack(choices, state, n, res);\n    return res[0];\n}\n
    climbing_stairs_backtrack.go
    /* \u56de\u6eaf */\nfunc backtrack(choices []int, state, n int, res []int) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state+choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    choices := []int{1, 2}\n    // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    res[0] = 0\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.swift
    /* \u56de\u6eaf */\nfunc backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices: choices, state: state, n: n, res: &res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.js
    /* \u56de\u6eaf */\nfunction backtrack(choices, state, n, res) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.ts
    /* \u56de\u6eaf */\nfunction backtrack(\n    choices: number[],\n    state: number,\n    n: number,\n    res: Map<0, any>\n): void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    const state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.dart
    /* \u56de\u6eaf */\nvoid backtrack(List<int> choices, int state, int n, List<int> res) {\n  // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u904d\u5386\u6240\u6709\u9009\u62e9\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n    if (state + choice > n) continue;\n    // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n  int state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n  backtrack(choices, state, n, res);\n  return res[0];\n}\n
    climbing_stairs_backtrack.rs
    /* \u56de\u6eaf */\nfn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if state + choice > n {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    let state = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, n as i32, &mut res);\n    res[0]\n}\n
    climbing_stairs_backtrack.c
    /* \u56de\u6eaf */\nvoid backtrack(int *choices, int state, int n, int *res, int len) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n)\n            continue;\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    int state = 0;           // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    int len = sizeof(choices) / sizeof(int);\n    backtrack(choices, state, n, res, len);\n    int result = *res;\n    free(res);\n    return result;\n}\n
    climbing_stairs_backtrack.kt
    /* \u56de\u6eaf */\nfun backtrack(\n    choices: MutableList<Int>,\n    state: Int,\n    n: Int,\n    res: MutableList<Int>\n) {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) continue\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u697c\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    val state = 0 // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.rb
    ### \u56de\u6eaf ###\ndef backtrack(choices, state, n, res)\n  # \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n  res[0] += 1 if state == n\n  # \u904d\u5386\u6240\u6709\u9009\u62e9\n  for choice in choices\n    # \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n    next if state + choice > n\n\n    # \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n    backtrack(choices, state + choice, n, res)\n  end\n  # \u56de\u9000\nend\n\n### \u722c\u697c\u68af\uff1a\u56de\u6eaf ###\ndef climbing_stairs_backtrack(n)\n  choices = [1, 2] # \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n  state = 0 # \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n  res = [0] # \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n  backtrack(choices, state, n, res)\n  res.first\nend\n
    climbing_stairs_backtrack.zig
    // \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u5f53\u722c\u5230\u7b2c n \u9636\u65f6\uff0c\u65b9\u6848\u6570\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u904d\u5386\u6240\u6709\u9009\u62e9\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8bb8\u8d8a\u8fc7\u7b2c n \u9636\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u697c\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9009\u62e9\u5411\u4e0a\u722c 1 \u9636\u6216 2 \u9636\n    var state: i32 = 0; // \u4ece\u7b2c 0 \u9636\u5f00\u59cb\u722c\n    var res = std.ArrayList(i32).init(std.heap.page_allocator);\n    defer res.deinit();\n    try res.append(0); // \u4f7f\u7528 res[0] \u8bb0\u5f55\u65b9\u6848\u6570\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

    \u56de\u6eaf\u7b97\u6cd5\u901a\u5e38\u5e76\u4e0d\u663e\u5f0f\u5730\u5bf9\u95ee\u9898\u8fdb\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c06\u6c42\u89e3\u95ee\u9898\u770b\u4f5c\u4e00\u7cfb\u5217\u51b3\u7b56\u6b65\u9aa4\uff0c\u901a\u8fc7\u8bd5\u63a2\u548c\u526a\u679d\uff0c\u641c\u7d22\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

    \u6211\u4eec\u53ef\u4ee5\u5c1d\u8bd5\u4ece\u95ee\u9898\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u8fd9\u9053\u9898\u3002\u8bbe\u722c\u5230\u7b2c \\(i\\) \u9636\u5171\u6709 \\(dp[i]\\) \u79cd\u65b9\u6848\uff0c\u90a3\u4e48 \\(dp[i]\\) \u5c31\u662f\u539f\u95ee\u9898\uff0c\u5176\u5b50\u95ee\u9898\u5305\u62ec\uff1a

    \\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

    \u7531\u4e8e\u6bcf\u8f6e\u53ea\u80fd\u4e0a \\(1\\) \u9636\u6216 \\(2\\) \u9636\uff0c\u56e0\u6b64\u5f53\u6211\u4eec\u7ad9\u5728\u7b2c \\(i\\) \u9636\u697c\u68af\u4e0a\u65f6\uff0c\u4e0a\u4e00\u8f6e\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u4e0a\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ea\u80fd\u4ece\u7b2c \\(i -1\\) \u9636\u6216\u7b2c \\(i - 2\\) \u9636\u8fc8\u5411\u7b2c \\(i\\) \u9636\u3002

    \u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u63a8\u8bba\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u9636\u7684\u65b9\u6848\u6570\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u9636\u7684\u65b9\u6848\u6570\u5c31\u7b49\u4e8e\u722c\u5230\u7b2c \\(i\\) \u9636\u7684\u65b9\u6848\u6570\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

    \\[ dp[i] = dp[i-1] + dp[i-2] \\]

    \u8fd9\u610f\u5473\u7740\u5728\u722c\u697c\u68af\u95ee\u9898\u4e2d\uff0c\u5404\u4e2a\u5b50\u95ee\u9898\u4e4b\u95f4\u5b58\u5728\u9012\u63a8\u5173\u7cfb\uff0c\u539f\u95ee\u9898\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u95ee\u9898\u7684\u89e3\u6784\u5efa\u5f97\u6765\u3002\u56fe 14-2 \u5c55\u793a\u4e86\u8be5\u9012\u63a8\u5173\u7cfb\u3002

    \u56fe 14-2 \u00a0 \u65b9\u6848\u6570\u91cf\u9012\u63a8\u5173\u7cfb

    \u6211\u4eec\u53ef\u4ee5\u6839\u636e\u9012\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u7d22\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u4e3a\u8d77\u59cb\u70b9\uff0c\u9012\u5f52\u5730\u5c06\u4e00\u4e2a\u8f83\u5927\u95ee\u9898\u62c6\u89e3\u4e3a\u4e24\u4e2a\u8f83\u5c0f\u95ee\u9898\u7684\u548c\uff0c\u76f4\u81f3\u5230\u8fbe\u6700\u5c0f\u5b50\u95ee\u9898 \\(dp[1]\\) \u548c \\(dp[2]\\) \u65f6\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u9636\u5206\u522b\u6709 \\(1\\)\u3001\\(2\\) \u79cd\u65b9\u6848\u3002

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5b83\u548c\u6807\u51c6\u56de\u6eaf\u4ee3\u7801\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u4f46\u66f4\u52a0\u7b80\u6d01\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
    def dfs(i: int) -> int:\n    \"\"\"\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1) + dfs(i - 2)\n    return count\n\ndef climbing_stairs_dfs(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u641c\u7d22\"\"\"\n    return dfs(n)\n
    climbing_stairs_dfs.cpp
    /* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.java
    /* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.cs
    /* \u641c\u7d22 */\nint DFS(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1) + DFS(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
    climbing_stairs_dfs.go
    /* \u641c\u7d22 */\nfunc dfs(i int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfs(i-1) + dfs(i-2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.swift
    /* \u641c\u7d22 */\nfunc dfs(i: Int) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1) + dfs(i: i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
    climbing_stairs_dfs.js
    /* \u641c\u7d22 */\nfunction dfs(i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.ts
    /* \u641c\u7d22 */\nfunction dfs(i: number): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.dart
    /* \u641c\u7d22 */\nint dfs(int i) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1) + dfs(i - 2);\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
    climbing_stairs_dfs.rs
    /* \u641c\u7d22 */\nfn dfs(i: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1) + dfs(i - 2);\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
    climbing_stairs_dfs.c
    /* \u641c\u7d22 */\nint dfs(int i) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.kt
    /* \u641c\u7d22 */\nfun dfs(i: Int): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1) + dfs(i - 2)\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u641c\u7d22 */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.rb
    ### \u641c\u7d22 ###\ndef dfs(i)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # dp[i] = dp[i-1] + dp[i-2]\n  dfs(i - 1) + dfs(i - 2)\nend\n\n### \u722c\u697c\u68af\uff1a\u641c\u7d22 ###\ndef climbing_stairs_dfs(n)\n  dfs(n)\nend\n
    climbing_stairs_dfs.zig
    // \u641c\u7d22\nfn dfs(i: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u641c\u7d22\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u7d22\u5f62\u6210\u7684\u9012\u5f52\u6811\u3002\u5bf9\u4e8e\u95ee\u9898 \\(dp[n]\\) \uff0c\u5176\u9012\u5f52\u6811\u7684\u6df1\u5ea6\u4e3a \\(n\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002\u6307\u6570\u9636\u5c5e\u4e8e\u7206\u70b8\u5f0f\u589e\u957f\uff0c\u5982\u679c\u6211\u4eec\u8f93\u5165\u4e00\u4e2a\u6bd4\u8f83\u5927\u7684 \\(n\\) \uff0c\u5219\u4f1a\u9677\u5165\u6f2b\u957f\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

    \u56fe 14-3 \u00a0 \u722c\u697c\u68af\u5bf9\u5e94\u9012\u5f52\u6811

    \u89c2\u5bdf\u56fe 14-3 \uff0c\u6307\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f\u201c\u91cd\u53e0\u5b50\u95ee\u9898\u201d\u5bfc\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u4e3a \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u4e24\u8005\u90fd\u5305\u542b\u5b50\u95ee\u9898 \\(dp[7]\\) \u3002

    \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5b50\u95ee\u9898\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u5b50\u5b50\u5b59\u5b59\u65e0\u7a77\u5c3d\u4e5f\u3002\u7edd\u5927\u90e8\u5206\u8ba1\u7b97\u8d44\u6e90\u90fd\u6d6a\u8d39\u5728\u8fd9\u4e9b\u91cd\u53e0\u7684\u5b50\u95ee\u9898\u4e0a\u3002

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

    \u4e3a\u4e86\u63d0\u5347\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u4eec\u5e0c\u671b\u6240\u6709\u7684\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u6570\u7ec4 mem \u6765\u8bb0\u5f55\u6bcf\u4e2a\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5e76\u5728\u641c\u7d22\u8fc7\u7a0b\u4e2d\u5c06\u91cd\u53e0\u5b50\u95ee\u9898\u526a\u679d\u3002

    1. \u5f53\u9996\u6b21\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u5c06\u5176\u8bb0\u5f55\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u540e\u4f7f\u7528\u3002
    2. \u5f53\u518d\u6b21\u9700\u8981\u8ba1\u7b97 \\(dp[i]\\) \u65f6\uff0c\u6211\u4eec\u4fbf\u53ef\u76f4\u63a5\u4ece mem[i] \u4e2d\u83b7\u53d6\u7ed3\u679c\uff0c\u4ece\u800c\u907f\u514d\u91cd\u590d\u8ba1\u7b97\u8be5\u5b50\u95ee\u9898\u3002

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
    def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 or i == 2:\n        return i\n    # \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1:\n        return mem[i]\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    # \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
    climbing_stairs_dfs_mem.cpp
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, vector<int> &mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.java
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.cs
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint DFS(int i, int[] mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1, mem) + DFS(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
    climbing_stairs_dfs_mem.go
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfsMem(i int, mem []int) int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    mem := make([]int, n+1)\n    for i := range mem {\n        mem[i] = -1\n    }\n    return dfsMem(n, mem)\n}\n
    climbing_stairs_dfs_mem.swift
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc dfs(i: Int, mem: inout [Int]) -> Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
    climbing_stairs_dfs_mem.js
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i, mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.ts
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction dfs(i: number, mem: number[]): number {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i === 1 || i === 2) return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.dart
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, List<int> mem) {\n  // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  if (i == 1 || i == 2) return i;\n  // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n  if (mem[i] != -1) return mem[i];\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n  // \u8bb0\u5f55 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.rs
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn dfs(i: usize, mem: &mut [i32]) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if mem[i] != -1 {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
    climbing_stairs_dfs_mem.c
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nint dfs(int i, int *mem) {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2)\n        return i;\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    int *mem = (int *)malloc((n + 1) * sizeof(int));\n    for (int i = 0; i <= n; i++) {\n        mem[i] = -1;\n    }\n    int result = dfs(n, mem);\n    free(mem);\n    return result;\n}\n
    climbing_stairs_dfs_mem.kt
    /* \u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun dfs(i: Int, mem: IntArray): Int {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 || i == 2) return i\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) return mem[i]\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
    climbing_stairs_dfs_mem.rb
    ### \u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef dfs(i, mem)\n  # \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n  return i if i == 1 || i == 2\n  # \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n  return mem[i] if mem[i] != -1\n\n  # dp[i] = dp[i-1] + dp[i-2]\n  count = dfs(i - 1, mem) + dfs(i - 2, mem)\n  # \u8bb0\u5f55 dp[i]\n  mem[i] = count\nend\n\n### \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef climbing_stairs_dfs_mem(n)\n  # mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n  mem = Array.new(n + 1, -1)\n  dfs(n, mem)\nend\n
    climbing_stairs_dfs_mem.zig
    // \u8bb0\u5fc6\u5316\u641c\u7d22\nfn dfs(i: usize, mem: []i32) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (i == 1 or i == 2) {\n        return @intCast(i);\n    }\n    // \u82e5\u5b58\u5728\u8bb0\u5f55 dp[i] \uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u4e4b\n    if (mem[i] != -1) {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    var count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u8bb0\u5f55 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u697c\u68af\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8bb0\u5f55\u722c\u5230\u7b2c i \u9636\u7684\u65b9\u6848\u603b\u6570\uff0c-1 \u4ee3\u8868\u65e0\u8bb0\u5f55\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u56fe 14-4 \uff0c\u7ecf\u8fc7\u8bb0\u5fc6\u5316\u5904\u7406\u540e\uff0c\u6240\u6709\u91cd\u53e0\u5b50\u95ee\u9898\u90fd\u53ea\u9700\u8ba1\u7b97\u4e00\u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u8fd9\u662f\u4e00\u4e2a\u5de8\u5927\u7684\u98de\u8dc3\u3002

    \u56fe 14-4 \u00a0 \u8bb0\u5fc6\u5316\u641c\u7d22\u5bf9\u5e94\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

    \u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u201c\u4ece\u9876\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u4eec\u4ece\u539f\u95ee\u9898\uff08\u6839\u8282\u70b9\uff09\u5f00\u59cb\uff0c\u9012\u5f52\u5730\u5c06\u8f83\u5927\u5b50\u95ee\u9898\u5206\u89e3\u4e3a\u8f83\u5c0f\u5b50\u95ee\u9898\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u95ee\u9898\uff08\u53f6\u8282\u70b9\uff09\u3002\u4e4b\u540e\uff0c\u901a\u8fc7\u56de\u6eaf\u9010\u5c42\u6536\u96c6\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u6784\u5efa\u51fa\u539f\u95ee\u9898\u7684\u89e3\u3002

    \u4e0e\u4e4b\u76f8\u53cd\uff0c\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u201c\u4ece\u5e95\u81f3\u9876\u201d\u7684\u65b9\u6cd5\uff1a\u4ece\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\u5f00\u59cb\uff0c\u8fed\u4ee3\u5730\u6784\u5efa\u66f4\u5927\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u95ee\u9898\u7684\u89e3\u3002

    \u7531\u4e8e\u52a8\u6001\u89c4\u5212\u4e0d\u5305\u542b\u56de\u6eaf\u8fc7\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u5faa\u73af\u8fed\u4ee3\u5b9e\u73b0\uff0c\u65e0\u987b\u4f7f\u7528\u9012\u5f52\u3002\u5728\u4ee5\u4e0b\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u521d\u59cb\u5316\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u4e0e\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u6570\u7ec4 mem \u76f8\u540c\u7684\u8bb0\u5f55\u4f5c\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in range(3, n + 1):\n        dp[i] = dp[i - 1] + dp[i - 2]\n    return dp[n]\n
    climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.java
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.go
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        dp[i] = dp[i-1] + dp[i-2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3 ... n {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.js
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  for (int i = 3; i <= n; i++) {\n    dp[i] = dp[i - 1] + dp[i - 2];\n  }\n  return dp[n];\n}\n
    climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp(n: usize) -> i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i in 3..=n {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    dp[n]\n}\n
    climbing_stairs_dp.c
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    int result = dp[n];\n    free(dp);\n    return result;\n}\n
    climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (i in 3..n) {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef climbing_stairs_dp(n)\n  return n  if n == 1 || n == 2\n\n  # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n  dp = Array.new(n + 1, 0)\n  # \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n  dp[1], dp[2] = 1, 2\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }\n\n  dp[n]\nend\n
    climbing_stairs_dp.zig
    // \u722c\u697c\u68af\uff1a\u52a8\u6001\u89c4\u5212\nfn climbingStairsDP(comptime n: usize) i32 {\n    // \u5df2\u77e5 dp[1] \u548c dp[2] \uff0c\u8fd4\u56de\u4e4b\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u4e8e\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72b6\u6001\uff1a\u9884\u8bbe\u6700\u5c0f\u5b50\u95ee\u9898\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-5 \u6a21\u62df\u4e86\u4ee5\u4e0a\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\u3002

    \u56fe 14-5 \u00a0 \u722c\u697c\u68af\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u4e0e\u56de\u6eaf\u7b97\u6cd5\u4e00\u6837\uff0c\u52a8\u6001\u89c4\u5212\u4e5f\u4f7f\u7528\u201c\u72b6\u6001\u201d\u6982\u5ff5\u6765\u8868\u793a\u95ee\u9898\u6c42\u89e3\u7684\u7279\u5b9a\u9636\u6bb5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u5bf9\u5e94\u4e00\u4e2a\u5b50\u95ee\u9898\u4ee5\u53ca\u76f8\u5e94\u7684\u5c40\u90e8\u6700\u4f18\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u697c\u68af\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5f53\u524d\u6240\u5728\u697c\u68af\u9636\u6570 \\(i\\) \u3002

    \u6839\u636e\u4ee5\u4e0a\u5185\u5bb9\uff0c\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa\u52a8\u6001\u89c4\u5212\u7684\u5e38\u7528\u672f\u8bed\u3002

    • \u5c06\u6570\u7ec4 dp \u79f0\u4e3a dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72b6\u6001 \\(i\\) \u5bf9\u5e94\u5b50\u95ee\u9898\u7684\u89e3\u3002
    • \u5c06\u6700\u5c0f\u5b50\u95ee\u9898\u5bf9\u5e94\u7684\u72b6\u6001\uff08\u7b2c \\(1\\) \u9636\u548c\u7b2c \\(2\\) \u9636\u697c\u68af\uff09\u79f0\u4e3a\u521d\u59cb\u72b6\u6001\u3002
    • \u5c06\u9012\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u79f0\u4e3a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002
    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u7531\u4e8e \\(dp[i]\\) \u53ea\u4e0e \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u987b\u4f7f\u7528\u4e00\u4e2a\u6570\u7ec4 dp \u6765\u5b58\u50a8\u6240\u6709\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u800c\u53ea\u9700\u4e24\u4e2a\u53d8\u91cf\u6eda\u52a8\u524d\u8fdb\u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    if n == 1 or n == 2:\n        return n\n    a, b = 1, 2\n    for _ in range(3, n + 1):\n        a, b = b, a + b\n    return b\n
    climbing_stairs_dp.cpp
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.java
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.cs
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint ClimbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.go
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u4ece\u8f83\u5c0f\u5b50\u95ee\u9898\u9010\u6b65\u6c42\u89e3\u8f83\u5927\u5b50\u95ee\u9898\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
    climbing_stairs_dp.swift
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc climbingStairsDPComp(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    var a = 1\n    var b = 2\n    for _ in 3 ... n {\n        (a, b) = (b, a + b)\n    }\n    return b\n}\n
    climbing_stairs_dp.js
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n) {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.ts
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction climbingStairsDPComp(n: number): number {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.dart
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n  if (n == 1 || n == 2) return n;\n  int a = 1, b = 2;\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = a + b;\n    a = tmp;\n  }\n  return b;\n}\n
    climbing_stairs_dp.rs
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn climbing_stairs_dp_comp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    let (mut a, mut b) = (1, 2);\n    for _ in 3..=n {\n        let tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    b\n}\n
    climbing_stairs_dp.c
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.kt
    /* \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun climbingStairsDPComp(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    var a = 1\n    var b = 2\n    for (i in 3..n) {\n        val temp = b\n        b += a\n        a = temp\n    }\n    return b\n}\n
    climbing_stairs_dp.rb
    ### \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef climbing_stairs_dp_comp(n)\n  return n if n == 1 || n == 2\n\n  a, b = 1, 2\n  (3...(n + 1)).each { a, b = b, a + b }\n\n  b\nend\n
    climbing_stairs_dp.zig
    // \u722c\u697c\u68af\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn climbingStairsDPComp(comptime n: usize) i32 {\n    if (n == 1 or n == 2) {\n        return @intCast(n);\n    }\n    var a: i32 = 1;\n    var b: i32 = 2;\n    for (3..n + 1) |_| {\n        var tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u4ee5\u4e0a\u4ee3\u7801\uff0c\u7531\u4e8e\u7701\u53bb\u4e86\u6570\u7ec4 dp \u5360\u7528\u7684\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

    \u5728\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e2d\uff0c\u5f53\u524d\u72b6\u6001\u5f80\u5f80\u4ec5\u4e0e\u524d\u9762\u6709\u9650\u4e2a\u72b6\u6001\u6709\u5173\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72b6\u6001\uff0c\u901a\u8fc7\u201c\u964d\u7ef4\u201d\u6765\u8282\u7701\u5185\u5b58\u7a7a\u95f4\u3002\u8fd9\u79cd\u7a7a\u95f4\u4f18\u5316\u6280\u5de7\u88ab\u79f0\u4e3a\u201c\u6eda\u52a8\u53d8\u91cf\u201d\u6216\u201c\u6eda\u52a8\u6570\u7ec4\u201d\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u95ee\u9898","text":"

    \u80cc\u5305\u95ee\u9898\u662f\u4e00\u4e2a\u975e\u5e38\u597d\u7684\u52a8\u6001\u89c4\u5212\u5165\u95e8\u9898\u76ee\uff0c\u662f\u52a8\u6001\u89c4\u5212\u4e2d\u6700\u5e38\u89c1\u7684\u95ee\u9898\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u95ee\u9898\u3001\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u3001\u591a\u91cd\u80cc\u5305\u95ee\u9898\u7b49\u3002

    \u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6765\u6c42\u89e3\u6700\u5e38\u89c1\u7684 0-1 \u80cc\u5305\u95ee\u9898\u3002

    Question

    \u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002

    \u89c2\u5bdf\u56fe 14-17 \uff0c\u7531\u4e8e\u7269\u54c1\u7f16\u53f7 \\(i\\) \u4ece \\(1\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u6570\u7ec4\u7d22\u5f15\u4ece \\(0\\) \u5f00\u59cb\u8ba1\u6570\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5bf9\u5e94\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u4ef7\u503c \\(val[i-1]\\) \u3002

    \u56fe 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u6570\u636e

    \u6211\u4eec\u53ef\u4ee5\u5c06 0-1 \u80cc\u5305\u95ee\u9898\u770b\u4f5c\u4e00\u4e2a\u7531 \\(n\\) \u8f6e\u51b3\u7b56\u7ec4\u6210\u7684\u8fc7\u7a0b\uff0c\u5bf9\u4e8e\u6bcf\u4e2a\u7269\u4f53\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u4e24\u79cd\u51b3\u7b56\uff0c\u56e0\u6b64\u8be5\u95ee\u9898\u6ee1\u8db3\u51b3\u7b56\u6811\u6a21\u578b\u3002

    \u8be5\u95ee\u9898\u7684\u76ee\u6807\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u201d\uff0c\u56e0\u6b64\u8f83\u5927\u6982\u7387\u662f\u4e00\u4e2a\u52a8\u6001\u89c4\u5212\u95ee\u9898\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u5bf9\u4e8e\u6bcf\u4e2a\u7269\u54c1\u6765\u8bf4\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u51cf\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72b6\u6001\u5b9a\u4e49\uff1a\u5f53\u524d\u7269\u54c1\u7f16\u53f7 \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8bb0\u4e3a \\([i, c]\\) \u3002

    \u72b6\u6001 \\([i, c]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\uff0c\u8bb0\u4e3a \\(dp[i, c]\\) \u3002

    \u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u4e2a\u5c3a\u5bf8\u4e3a \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7ef4 \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u5f53\u6211\u4eec\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u51b3\u7b56\u540e\uff0c\u5269\u4f59\u7684\u662f\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u51b3\u7b56\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e24\u79cd\u60c5\u51b5\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u53d8\uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u51cf\u5c11 \\(wgt[i-1]\\) \uff0c\u4ef7\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72b6\u6001\u53d8\u5316\u4e3a \\([i-1, c-wgt[i-1]]\\) \u3002

    \u4e0a\u8ff0\u5206\u6790\u5411\u6211\u4eec\u63ed\u793a\u4e86\u672c\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u6700\u5927\u4ef7\u503c \\(dp[i, c]\\) \u7b49\u4e8e\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\u3002\u7531\u6b64\u53ef\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\uff1a

    \\[ dp[i, c] = \\max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) \\]

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u4f59\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5f53\u65e0\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\u6700\u5927\u4ef7\u503c\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

    \u5f53\u524d\u72b6\u6001 \\([i, c]\\) \u4ece\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001 \\([i-1, c-wgt[i-1]]\\) \u8f6c\u79fb\u800c\u6765\uff0c\u56e0\u6b64\u901a\u8fc7\u4e24\u5c42\u5faa\u73af\u6b63\u5e8f\u904d\u5386\u6574\u4e2a \\(dp\\) \u8868\u5373\u53ef\u3002

    \u6839\u636e\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u6309\u987a\u5e8f\u5b9e\u73b0\u66b4\u529b\u641c\u7d22\u3001\u8bb0\u5fc6\u5316\u641c\u7d22\u3001\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u7d22","text":"

    \u641c\u7d22\u4ee3\u7801\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u9012\u5f52\u53c2\u6570\uff1a\u72b6\u6001 \\([i, c]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u5b50\u95ee\u9898\u7684\u89e3 \\(dp[i, c]\\) \u3002
    • \u7ec8\u6b62\u6761\u4ef6\uff1a\u5f53\u7269\u54c1\u7f16\u53f7\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\u4e3a \\(0\\) \u65f6\uff0c\u7ec8\u6b62\u9012\u5f52\u5e76\u8fd4\u56de\u4ef7\u503c \\(0\\) \u3002
    • \u526a\u679d\uff1a\u82e5\u5f53\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs(wgt, val, i - 1, c)\n    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes);\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFS(weight, val, i - 1, c);\n    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.Max(no, yes);\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFS(wgt, val, i-1, c)\n    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return int(math.Max(float64(no), float64(yes)))\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return Math.max(no, yes);\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFS(wgt, val, i - 1, c);\n  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  return max(no, yes);\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs(wgt, val, i - 1, c);\n    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    std::cmp::max(no, yes)\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return myMax(no, yes);\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFS(wgt, _val, i - 1, c)\n    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return max(no, yes)\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22 ###\ndef knapsack_dfs(wgt, val, i, c)\n  # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  return 0 if i == 0 || c == 0\n  # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c\n  # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  no = knapsack_dfs(wgt, val, i - 1, c)\n  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  [no, yes].max\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u7d22\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFS(wgt, val, i - 1, c);\n    var yes = knapsackDFS(wgt, val, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    return @max(no, yes);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-18 \u6240\u793a\uff0c\u7531\u4e8e\u6bcf\u4e2a\u7269\u54c1\u90fd\u4f1a\u4ea7\u751f\u4e0d\u9009\u548c\u9009\u4e24\u6761\u641c\u7d22\u5206\u652f\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(2^n)\\) \u3002

    \u89c2\u5bdf\u9012\u5f52\u6811\uff0c\u5bb9\u6613\u53d1\u73b0\u5176\u4e2d\u5b58\u5728\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u5f53\u7269\u54c1\u8f83\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f83\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f83\u591a\u65f6\uff0c\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u6570\u91cf\u5c06\u4f1a\u5927\u5e45\u589e\u591a\u3002

    \u56fe 14-18 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u66b4\u529b\u641c\u7d22\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22","text":"

    \u4e3a\u4e86\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\uff0c\u6211\u4eec\u501f\u52a9\u8bb0\u5fc6\u5217\u8868 mem \u6765\u8bb0\u5f55\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5bf9\u5e94 \\(dp[i, c]\\) \u3002

    \u5f15\u5165\u8bb0\u5fc6\u5316\u4e4b\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5b50\u95ee\u9898\u6570\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dfs_mem(\n    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int\n) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\"\"\"\n    # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);\n    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    no := knapsackDFSMem(wgt, val, mem, i-1, c)\n    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]\n    // \u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = int(math.Max(float64(no), float64(yes)))\n    return mem[i][c]\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c {\n        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfunction knapsackDFSMem(\n    wgt: Array<number>,\n    val: Array<number>,\n    mem: Array<Array<number>>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(\n  List<int> wgt,\n  List<int> val,\n  List<List<int>> mem,\n  int i,\n  int c,\n) {\n  // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22 ###\ndef knapsack_dfs_mem(wgt, val, mem, i, c)\n  # \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n  return 0 if i == 0 || c == 0\n  # \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return mem[i][c] if mem[i][c] != -1\n  # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c\n  # \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n  mem[i][c] = [no, yes].max\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u8bb0\u5fc6\u5316\u641c\u7d22\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9009\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u5219\u8fd4\u56de\u4ef7\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8bb0\u5f55\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u53ea\u80fd\u9009\u62e9\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8ba1\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u4ef7\u503c\n    var no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    var yes = knapsackDFSMem(wgt, val, mem, i - 1, c - @as(usize, @intCast(wgt[i - 1]))) + val[i - 1];\n    // \u8bb0\u5f55\u5e76\u8fd4\u56de\u4e24\u79cd\u65b9\u6848\u4e2d\u4ef7\u503c\u66f4\u5927\u7684\u90a3\u4e00\u4e2a\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-19 \u5c55\u793a\u4e86\u5728\u8bb0\u5fc6\u5316\u641c\u7d22\u4e2d\u88ab\u526a\u6389\u7684\u641c\u7d22\u5206\u652f\u3002

    \u56fe 14-19 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u8bb0\u5fc6\u5316\u641c\u7d22\u9012\u5f52\u6811

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52a8\u6001\u89c4\u5212","text":"

    \u52a8\u6001\u89c4\u5212\u5b9e\u8d28\u4e0a\u5c31\u662f\u5728\u72b6\u6001\u8f6c\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u8fc7\u7a0b\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint KnapsackDP(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(n + 1)\n        .fill(0)\n        .map(() => Array(cap + 1).fill(0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],\n                );\n            }\n        }\n    }\n    dp[n][cap]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint knapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn knapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i - 1][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 14-20 \u6240\u793a\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u90fd\u7531\u6570\u7ec4 dp \u5927\u5c0f\u51b3\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14>

    \u56fe 14-20 \u00a0 0-1 \u80cc\u5305\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u90fd\u53ea\u4e0e\u5176\u4e0a\u4e00\u884c\u7684\u72b6\u6001\u6709\u5173\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e24\u4e2a\u6570\u7ec4\u6eda\u52a8\u524d\u8fdb\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

    \u8fdb\u4e00\u6b65\u601d\u8003\uff0c\u6211\u4eec\u80fd\u5426\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u5b9e\u73b0\u7a7a\u95f4\u4f18\u5316\u5462\uff1f\u89c2\u5bdf\u53ef\u77e5\uff0c\u6bcf\u4e2a\u72b6\u6001\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f6c\u79fb\u8fc7\u6765\u7684\u3002\u5047\u8bbe\u53ea\u6709\u4e00\u4e2a\u6570\u7ec4\uff0c\u5f53\u5f00\u59cb\u904d\u5386\u7b2c \\(i\\) \u884c\u65f6\uff0c\u8be5\u6570\u7ec4\u5b58\u50a8\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72b6\u6001\u3002

    • \u5982\u679c\u91c7\u53d6\u6b63\u5e8f\u904d\u5386\uff0c\u90a3\u4e48\u904d\u5386\u5230 \\(dp[i, j]\\) \u65f6\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7ecf\u88ab\u8986\u76d6\uff0c\u6b64\u65f6\u5c31\u65e0\u6cd5\u5f97\u5230\u6b63\u786e\u7684\u72b6\u6001\u8f6c\u79fb\u7ed3\u679c\u3002
    • \u5982\u679c\u91c7\u53d6\u5012\u5e8f\u904d\u5386\uff0c\u5219\u4e0d\u4f1a\u53d1\u751f\u8986\u76d6\u95ee\u9898\uff0c\u72b6\u6001\u8f6c\u79fb\u53ef\u4ee5\u6b63\u786e\u8fdb\u884c\u3002

    \u56fe 14-21 \u5c55\u793a\u4e86\u5728\u5355\u4e2a\u6570\u7ec4\u4e0b\u4ece\u7b2c \\(i = 1\\) \u884c\u8f6c\u6362\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u8fc7\u7a0b\u3002\u8bf7\u601d\u8003\u6b63\u5e8f\u904d\u5386\u548c\u5012\u5e8f\u904d\u5386\u7684\u533a\u522b\u3002

    <1><2><3><4><5><6>

    \u56fe 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4 \\(i\\) \u76f4\u63a5\u5220\u9664\uff0c\u5e76\u4e14\u628a\u5185\u5faa\u73af\u66f4\u6539\u4e3a\u5012\u5e8f\u904d\u5386\u5373\u53ef\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig knapsack.py
    def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u904d\u5386\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint KnapsackDPComp(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u904d\u5386\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction knapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array(cap + 1).fill(0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u904d\u5386\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u904d\u5386\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u904d\u5386\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u904d\u5386\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.rb
    ### 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u5012\u5e8f\u904d\u5386\n    for c in cap.downto(1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn knapsackDPComp(wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u904d\u5386\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7ed3","text":"
    • \u52a8\u6001\u89c4\u5212\u5bf9\u95ee\u9898\u8fdb\u884c\u5206\u89e3\uff0c\u5e76\u901a\u8fc7\u5b58\u50a8\u5b50\u95ee\u9898\u7684\u89e3\u6765\u89c4\u907f\u91cd\u590d\u8ba1\u7b97\uff0c\u63d0\u9ad8\u8ba1\u7b97\u6548\u7387\u3002
    • \u4e0d\u8003\u8651\u65f6\u95f4\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52a8\u6001\u89c4\u5212\u95ee\u9898\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u7d22\uff09\u8fdb\u884c\u6c42\u89e3\uff0c\u4f46\u9012\u5f52\u6811\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u53e0\u5b50\u95ee\u9898\uff0c\u6548\u7387\u6781\u4f4e\u3002\u901a\u8fc7\u5f15\u5165\u8bb0\u5fc6\u5316\u5217\u8868\uff0c\u53ef\u4ee5\u5b58\u50a8\u6240\u6709\u8ba1\u7b97\u8fc7\u7684\u5b50\u95ee\u9898\u7684\u89e3\uff0c\u4ece\u800c\u4fdd\u8bc1\u91cd\u53e0\u5b50\u95ee\u9898\u53ea\u88ab\u8ba1\u7b97\u4e00\u6b21\u3002
    • \u8bb0\u5fc6\u5316\u641c\u7d22\u662f\u4e00\u79cd\u4ece\u9876\u81f3\u5e95\u7684\u9012\u5f52\u5f0f\u89e3\u6cd5\uff0c\u800c\u4e0e\u4e4b\u5bf9\u5e94\u7684\u52a8\u6001\u89c4\u5212\u662f\u4e00\u79cd\u4ece\u5e95\u81f3\u9876\u7684\u9012\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5199\u8868\u683c\u201d\u4e00\u6837\u3002\u7531\u4e8e\u5f53\u524d\u72b6\u6001\u4ec5\u4f9d\u8d56\u67d0\u4e9b\u5c40\u90e8\u72b6\u6001\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u4e2a\u7ef4\u5ea6\uff0c\u4ece\u800c\u964d\u4f4e\u7a7a\u95f4\u590d\u6742\u5ea6\u3002
    • \u5b50\u95ee\u9898\u5206\u89e3\u662f\u4e00\u79cd\u901a\u7528\u7684\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52a8\u6001\u89c4\u5212\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8d28\u3002
    • \u52a8\u6001\u89c4\u5212\u95ee\u9898\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u53e0\u5b50\u95ee\u9898\u3001\u6700\u4f18\u5b50\u7ed3\u6784\u3001\u65e0\u540e\u6548\u6027\u3002
    • \u5982\u679c\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u53ef\u4ee5\u4ece\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u6784\u5efa\u5f97\u6765\uff0c\u5219\u5b83\u5c31\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u3002
    • \u65e0\u540e\u6548\u6027\u6307\u5bf9\u4e8e\u4e00\u4e2a\u72b6\u6001\uff0c\u5176\u672a\u6765\u53d1\u5c55\u53ea\u4e0e\u8be5\u72b6\u6001\u6709\u5173\uff0c\u800c\u4e0e\u8fc7\u53bb\u7ecf\u5386\u7684\u6240\u6709\u72b6\u6001\u65e0\u5173\u3002\u8bb8\u591a\u7ec4\u5408\u4f18\u5316\u95ee\u9898\u4e0d\u5177\u6709\u65e0\u540e\u6548\u6027\uff0c\u65e0\u6cd5\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u5feb\u901f\u6c42\u89e3\u3002

    \u80cc\u5305\u95ee\u9898

    • \u80cc\u5305\u95ee\u9898\u662f\u6700\u5178\u578b\u7684\u52a8\u6001\u89c4\u5212\u95ee\u9898\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u53d8\u79cd\u3002
    • 0-1 \u80cc\u5305\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf\u4e3a \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u4ef7\u503c\u3002\u6839\u636e\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u4e24\u79cd\u51b3\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u5e76\u6784\u5efa\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\uff0c\u7531\u4e8e\u6bcf\u4e2a\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u904d\u5386\u5217\u8868\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72b6\u6001\u88ab\u8986\u76d6\u3002
    • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u6bcf\u79cd\u7269\u54c1\u7684\u9009\u53d6\u6570\u91cf\u65e0\u9650\u5236\uff0c\u56e0\u6b64\u9009\u62e9\u653e\u5165\u7269\u54c1\u7684\u72b6\u6001\u8f6c\u79fb\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\u3002\u7531\u4e8e\u72b6\u6001\u4f9d\u8d56\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u5728\u7a7a\u95f4\u4f18\u5316\u4e2d\u5e94\u5f53\u6b63\u5e8f\u904d\u5386\u3002
    • \u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u4e2a\u53d8\u79cd\u3002\u5b83\u4ece\u6c42\u201c\u6700\u5927\u201d\u4ef7\u503c\u53d8\u4e3a\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e01\u6570\u91cf\uff0c\u56e0\u6b64\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u5e94\u6539\u4e3a \\(\\min()\\) \u3002\u4ece\u8ffd\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u6765\u8868\u793a\u201c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u201d\u7684\u65e0\u6548\u89e3\u3002
    • \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u4ece\u6c42\u201c\u6700\u5c11\u786c\u5e01\u6570\u91cf\u201d\u6539\u4e3a\u6c42\u201c\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u201d\uff0c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u76f8\u5e94\u5730\u4ece \\(\\min()\\) \u6539\u4e3a\u6c42\u548c\u8fd0\u7b97\u7b26\u3002

    \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898

    • \u7f16\u8f91\u8ddd\u79bb\uff08Levenshtein \u8ddd\u79bb\uff09\u7528\u4e8e\u8861\u91cf\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u4e49\u4e3a\u4ece\u4e00\u4e2a\u5b57\u7b26\u4e32\u5230\u53e6\u4e00\u4e2a\u5b57\u7b26\u4e32\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\uff0c\u7f16\u8f91\u64cd\u4f5c\u5305\u62ec\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\u3002
    • \u7f16\u8f91\u8ddd\u79bb\u95ee\u9898\u7684\u72b6\u6001\u5b9a\u4e49\u4e3a\u5c06 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u66f4\u6539\u4e3a \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u6240\u9700\u7684\u6700\u5c11\u7f16\u8f91\u6b65\u6570\u3002\u5f53 \\(s[i] \\ne t[j]\\) \u65f6\uff0c\u5177\u6709\u4e09\u79cd\u51b3\u7b56\uff1a\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66ff\u6362\uff0c\u5b83\u4eec\u90fd\u6709\u76f8\u5e94\u7684\u5269\u4f59\u5b50\u95ee\u9898\u3002\u636e\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\u4e0e\u6784\u5efa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u3002\u800c\u5f53 \\(s[i] = t[j]\\) \u65f6\uff0c\u65e0\u987b\u7f16\u8f91\u5f53\u524d\u5b57\u7b26\u3002
    • \u5728\u7f16\u8f91\u8ddd\u79bb\u4e2d\uff0c\u72b6\u6001\u4f9d\u8d56\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72b6\u6001\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u6b63\u5e8f\u6216\u5012\u5e8f\u904d\u5386\u90fd\u65e0\u6cd5\u6b63\u786e\u5730\u8fdb\u884c\u72b6\u6001\u8f6c\u79fb\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u5229\u7528\u4e00\u4e2a\u53d8\u91cf\u6682\u5b58\u5de6\u4e0a\u65b9\u72b6\u6001\uff0c\u4ece\u800c\u8f6c\u5316\u5230\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7b49\u4ef7\u7684\u60c5\u51b5\uff0c\u53ef\u4ee5\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002
    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

    \u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5148\u6c42\u89e3\u53e6\u4e00\u4e2a\u5e38\u89c1\u7684\u80cc\u5305\u95ee\u9898\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u4e86\u89e3\u5b83\u7684\u4e00\u79cd\u7279\u4f8b\uff1a\u96f6\u94b1\u5151\u6362\u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 14-22 \u6240\u793a\u3002

    \u56fe 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\uff0c\u533a\u522b\u4ec5\u5728\u4e8e\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9009\u62e9\u6b21\u6570\u3002

    • \u5728 0-1 \u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u53ea\u6709\u4e00\u4e2a\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u53ea\u80fd\u4ece\u524d \\(i-1\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002
    • \u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e2d\uff0c\u6bcf\u79cd\u7269\u54c1\u7684\u6570\u91cf\u662f\u65e0\u9650\u7684\uff0c\u56e0\u6b64\u5c06\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u540e\uff0c\u4ecd\u53ef\u4ee5\u4ece\u524d \\(i\\) \u4e2a\u7269\u54c1\u4e2d\u9009\u62e9\u3002

    \u5728\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u89c4\u5b9a\u4e0b\uff0c\u72b6\u6001 \\([i, c]\\) \u7684\u53d8\u5316\u5206\u4e3a\u4e24\u79cd\u60c5\u51b5\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u76f8\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u4e0e 0-1 \u80cc\u5305\u95ee\u9898\u4e0d\u540c\uff0c\u8f6c\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

    \u4ece\u800c\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u53d8\u4e3a\uff1a

    \\[ dp[i, c] = \\max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) \\]"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5bf9\u6bd4\u4e24\u9053\u9898\u76ee\u7684\u4ee3\u7801\uff0c\u72b6\u6001\u8f6c\u79fb\u4e2d\u6709\u4e00\u5904\u4ece \\(i-1\\) \u53d8\u4e3a \\(i\\) \uff0c\u5176\u4f59\u5b8c\u5168\u4e00\u81f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
    def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
    unbounded_knapsack.cpp
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.java
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.cs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
    unbounded_knapsack.go
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.swift
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.js
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.ts
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.dart
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
    unbounded_knapsack.rs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.c
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.rb
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDP(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][cap + 1]i32{[_]i32{0} ** (cap + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[i][c] = @max(dp[i - 1][c], dp[i][c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7531\u4e8e\u5f53\u524d\u72b6\u6001\u662f\u4ece\u5de6\u8fb9\u548c\u4e0a\u8fb9\u7684\u72b6\u6001\u8f6c\u79fb\u800c\u6765\u7684\uff0c\u56e0\u6b64\u7a7a\u95f4\u4f18\u5316\u540e\u5e94\u8be5\u5bf9 \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u8fdb\u884c\u6b63\u5e8f\u904d\u5386\u3002

    \u8fd9\u4e2a\u904d\u5386\u987a\u5e8f\u4e0e 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8bf7\u501f\u52a9\u56fe 14-23 \u6765\u7406\u89e3\u4e24\u8005\u7684\u533a\u522b\u3002

    <1><2><3><4><5><6>

    \u56fe 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u5728\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    \u4ee3\u7801\u5b9e\u73b0\u6bd4\u8f83\u7b80\u5355\uff0c\u4ec5\u9700\u5c06\u6570\u7ec4 dp \u7684\u7b2c\u4e00\u7ef4\u5220\u9664\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig unbounded_knapsack.py
    def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
    unbounded_knapsack.cpp
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(cap + 1, 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.java
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.cs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.go
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, cap+1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.swift
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.js
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.ts
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction unboundedKnapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.dart
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
    unbounded_knapsack.rs
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; cap + 1];\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
    unbounded_knapsack.c
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun unboundedKnapsackDPComp(\n    wgt: IntArray,\n    _val: IntArray,\n    cap: Int\n): Int {\n    val n = wgt.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(cap + 1)\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.rb
    ### \u5b8c\u5168\u80cc\u5305\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n\n### \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ##3\ndef unbounded_knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(cap + 1, 0)\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u904d\u5386\n    for c in 1...(cap + 1)\n      if wgt[i -1] > c\n        # \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n        dp[c] = dp[c]\n      else\n        # \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn unboundedKnapsackDPComp(comptime wgt: []i32, val: []i32, comptime cap: usize) i32 {\n    comptime var n = wgt.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (cap + 1);\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u8fc7\u80cc\u5305\u5bb9\u91cf\uff0c\u5219\u4e0d\u9009\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u7269\u54c1 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5927\u503c\n                dp[c] = @max(dp[c], dp[c - @as(usize, @intCast(wgt[i - 1]))] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898","text":"

    \u80cc\u5305\u95ee\u9898\u662f\u4e00\u5927\u7c7b\u52a8\u6001\u89c4\u5212\u95ee\u9898\u7684\u4ee3\u8868\uff0c\u5176\u62e5\u6709\u5f88\u591a\u53d8\u79cd\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

    Question

    \u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 14-24 \u6240\u793a\u3002

    \u56fe 14-24 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u96f6\u94b1\u5151\u6362\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u4e00\u79cd\u7279\u6b8a\u60c5\u51b5\uff0c\u4e24\u8005\u5177\u6709\u4ee5\u4e0b\u8054\u7cfb\u4e0e\u4e0d\u540c\u70b9\u3002

    • \u4e24\u9053\u9898\u53ef\u4ee5\u76f8\u4e92\u8f6c\u6362\uff0c\u201c\u7269\u54c1\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5bf9\u5e94\u201c\u786c\u5e01\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5bf9\u5e94\u201c\u76ee\u6807\u91d1\u989d\u201d\u3002
    • \u4f18\u5316\u76ee\u6807\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u4ef7\u503c\uff0c\u96f6\u94b1\u5151\u6362\u95ee\u9898\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e01\u6570\u91cf\u3002
    • \u5b8c\u5168\u80cc\u5305\u95ee\u9898\u662f\u6c42\u201c\u4e0d\u8d85\u8fc7\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u94b1\u5151\u6362\u662f\u6c42\u201c\u6070\u597d\u201d\u51d1\u5230\u76ee\u6807\u91d1\u989d\u7684\u89e3\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f6e\u7684\u51b3\u7b56\uff0c\u5b9a\u4e49\u72b6\u6001\uff0c\u4ece\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u72b6\u6001 \\([i, a]\\) \u5bf9\u5e94\u7684\u5b50\u95ee\u9898\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\uff0c\u8bb0\u4e3a \\(dp[i, a]\\) \u3002

    \u4e8c\u7ef4 \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt+1)\\) \u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u4f18\u5b50\u7ed3\u6784\uff0c\u8fdb\u800c\u63a8\u5bfc\u51fa\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b

    \u672c\u9898\u4e0e\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u7684\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u4e24\u70b9\u5dee\u5f02\u3002

    • \u672c\u9898\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c06\u8fd0\u7b97\u7b26 \\(\\max()\\) \u66f4\u6539\u4e3a \\(\\min()\\) \u3002
    • \u4f18\u5316\u4e3b\u4f53\u662f\u786c\u5e01\u6570\u91cf\u800c\u975e\u5546\u54c1\u4ef7\u503c\uff0c\u56e0\u6b64\u5728\u9009\u4e2d\u786c\u5e01\u65f6\u6267\u884c \\(+1\\) \u5373\u53ef\u3002
    \\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

    \u7b2c\u4e09\u6b65\uff1a\u786e\u5b9a\u8fb9\u754c\u6761\u4ef6\u548c\u72b6\u6001\u8f6c\u79fb\u987a\u5e8f

    \u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u51d1\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u4e3a \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

    \u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u5373\u662f\u65e0\u6548\u89e3\u3002\u4e3a\u4f7f\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u6570\u80fd\u591f\u8bc6\u522b\u5e76\u8fc7\u6ee4\u65e0\u6548\u89e3\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528 \\(+ \\infty\\) \u6765\u8868\u793a\u5b83\u4eec\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(+ \\infty\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u5e76\u672a\u63d0\u4f9b \\(+ \\infty\\) \u53d8\u91cf\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u6765\u4ee3\u66ff\u3002\u800c\u8fd9\u53c8\u4f1a\u5bfc\u81f4\u5927\u6570\u8d8a\u754c\uff1a\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u53d1\u751f\u6ea2\u51fa\u3002

    \u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u6570\u5b57 \\(amt + 1\\) \u6765\u8868\u793a\u65e0\u6548\u89e3\uff0c\u56e0\u4e3a\u51d1\u51fa \\(amt\\) \u7684\u786c\u5e01\u6570\u91cf\u6700\u591a\u4e3a \\(amt\\) \u3002\u6700\u540e\u8fd4\u56de\u524d\uff0c\u5224\u65ad \\(dp[n, amt]\\) \u662f\u5426\u7b49\u4e8e \\(amt + 1\\) \uff0c\u82e5\u662f\u5219\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n    return dp[n][amt] if dp[n][amt] != MAX else -1\n
    coin_change.cpp
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.java
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.cs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDP(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n, amt] != MAX ? dp[n, amt] : -1;\n}\n
    coin_change.go
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt]\n    }\n    return -1\n}\n
    coin_change.swift
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1\n}\n
    coin_change.js
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
    coin_change.ts
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
    coin_change.dart
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.rs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt] as i32;\n    } else {\n        -1\n    }\n}\n
    coin_change.c
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[n][amt] != MAX) dp[n][amt] else -1\n}\n
    coin_change.rb
    ### \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_dp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }\n  # \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[i][a] = [dp[i - 1][a], dp[i][a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[n][amt] != _MAX ? dp[n][amt] : -1\nend\n
    coin_change.zig
    // \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = @min(dp[i - 1][a], dp[i][a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[n][amt] != max) {\n        return @intCast(dp[n][amt]);\n    } else {\n        return -1;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 14-25 \u5c55\u793a\u4e86\u96f6\u94b1\u5151\u6362\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u975e\u5e38\u76f8\u4f3c\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u56fe 14-25 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898\u7684\u52a8\u6001\u89c4\u5212\u8fc7\u7a0b

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u96f6\u94b1\u5151\u6362\u7684\u7a7a\u95f4\u4f18\u5316\u7684\u5904\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u4e00\u81f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n    return dp[amt] if dp[amt] != MAX else -1\n
    coin_change.cpp
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.java
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Arrays.fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.cs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    Array.Fill(dp, MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.go
    /* \u96f6\u94b1\u5151\u6362\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    for i := 1; i <= amt; i++ {\n        dp[i] = max\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt]\n    }\n    return -1\n}\n
    coin_change.swift
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: MAX, count: amt + 1)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1\n}\n
    coin_change.js
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
    coin_change.ts
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
    coin_change.dart
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, MAX);\n  dp[0] = 0;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.rs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp.fill(max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt] as i32;\n    } else {\n        -1\n    }\n}\n
    coin_change.c
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = malloc((amt + 1) * sizeof(int));\n    for (int j = 1; j <= amt; j++) {\n        dp[j] = MAX;\n    } \n    dp[0] = 0;\n\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[amt] != MAX ? dp[amt] : -1;\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp.fill(MAX)\n    dp[0] = 0\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[amt] != MAX) dp[amt] else -1\n}\n
    coin_change.rb
    ### \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_dp_comp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, _MAX)\n  dp[0] = 0\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u904d\u5386\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n        dp[a] = [dp[a], dp[a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[amt] != _MAX ? dp[amt] : -1\nend\n
    coin_change.zig
    // \u96f6\u94b1\u5151\u6362\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    comptime var max = amt + 1;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    @memset(&dp, max);\n    dp[0] = 0;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = @min(dp[a], dp[a - @as(usize, @intCast(coins[i - 1]))] + 1);\n            }\n        }\n    }\n    if (dp[amt] != max) {\n        return @intCast(dp[amt]);\n    } else {\n        return -1;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II","text":"

    Question

    \u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u786c\u5e01\u7ec4\u5408\u6570\u91cf\u3002\u793a\u4f8b\u5982\u56fe 14-26 \u6240\u793a\u3002

    \u56fe 14-26 \u00a0 \u96f6\u94b1\u5151\u6362\u95ee\u9898 II \u7684\u793a\u4f8b\u6570\u636e

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52a8\u6001\u89c4\u5212\u601d\u8def","text":"

    \u76f8\u6bd4\u4e8e\u4e0a\u4e00\u9898\uff0c\u672c\u9898\u76ee\u6807\u662f\u6c42\u7ec4\u5408\u6570\u91cf\uff0c\u56e0\u6b64\u5b50\u95ee\u9898\u53d8\u4e3a\uff1a\u524d \\(i\\) \u79cd\u786c\u5e01\u80fd\u591f\u51d1\u51fa\u91d1\u989d \\(a\\) \u7684\u7ec4\u5408\u6570\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u4e3a \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7ef4\u77e9\u9635\u3002

    \u5f53\u524d\u72b6\u6001\u7684\u7ec4\u5408\u6570\u91cf\u7b49\u4e8e\u4e0d\u9009\u5f53\u524d\u786c\u5e01\u4e0e\u9009\u5f53\u524d\u786c\u5e01\u8fd9\u4e24\u79cd\u51b3\u7b56\u7684\u7ec4\u5408\u6570\u91cf\u4e4b\u548c\u3002\u72b6\u6001\u8f6c\u79fb\u65b9\u7a0b\u4e3a\uff1a

    \\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

    \u5f53\u76ee\u6807\u91d1\u989d\u4e3a \\(0\\) \u65f6\uff0c\u65e0\u987b\u9009\u62e9\u4efb\u4f55\u786c\u5e01\u5373\u53ef\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u5e94\u5c06\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u4e3a \\(1\\) \u3002\u5f53\u65e0\u786c\u5e01\u65f6\uff0c\u65e0\u6cd5\u51d1\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6807\u91d1\u989d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u4e8e \\(0\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
    def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u521d\u59cb\u5316\u9996\u5217\n    for i in range(n + 1):\n        dp[i][0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n    return dp[n][amt]\n
    coin_change_ii.cpp
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.java
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.cs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDP(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i, 0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n, amt];\n}\n
    coin_change_ii.go
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i := 0; i <= n; i++ {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\uff1a\u5176\u4f59\u884c\u548c\u5217\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.swift
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0 ... n {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.js
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.ts
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.dart
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u521d\u59cb\u5316\u9996\u5217\n  for (int i = 0; i <= n; i++) {\n    dp[i][0] = 1;\n  }\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[n][amt];\n}\n
    coin_change_ii.rs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u521d\u59cb\u5316\u9996\u5217\n    for i in 0..=n {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[n][amt]\n}\n
    coin_change_ii.c
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[n][amt];\n    // \u91ca\u653e\u5185\u5b58\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (i in 0..n) {\n        dp[i][0] = 1\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.rb
    ### \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_ii_dp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u521d\u59cb\u5316\u9996\u5217\n  (0...(n + 1)).each { |i| dp[i][0] = 1 }\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n      end\n    end\n  end\n  dp[n][amt]\nend\n
    coin_change_ii.zig
    // \u96f6\u94b1\u5151\u6362 II\uff1a\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDP(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_][amt + 1]i32{[_]i32{0} ** (amt + 1)} ** (n + 1);\n    // \u521d\u59cb\u5316\u9996\u5217\n    for (0..n + 1) |i| {\n        dp[i][0] = 1;\n    }\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[i][a] = dp[i - 1][a] + dp[i][a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u95f4\u4f18\u5316","text":"

    \u7a7a\u95f4\u4f18\u5316\u5904\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u5220\u9664\u786c\u5e01\u7ef4\u5ea6\u5373\u53ef\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
    def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72b6\u6001\u8f6c\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u904d\u5386\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
    coin_change_ii.cpp
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u521d\u59cb\u5316 dp \u8868\n    vector<int> dp(amt + 1, 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.java
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.cs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint CoinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u521d\u59cb\u5316 dp \u8868\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.go
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins []int, amt int) int {\n    n := len(coins)\n    // \u521d\u59cb\u5316 dp \u8868\n    dp := make([]int, amt+1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u904d\u5386\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a-coins[i-1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.swift
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunc coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = Array(repeating: 0, count: amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.js
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins, amt) {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.ts
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfunction coinChangeIIDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u521d\u59cb\u5316 dp \u8868\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.dart
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u521d\u59cb\u5316 dp \u8868\n  List<int> dp = List.filled(amt + 1, 0);\n  dp[0] = 1;\n  // \u72b6\u6001\u8f6c\u79fb\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[amt];\n}\n
    coin_change_ii.rs
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u521d\u59cb\u5316 dp \u8868\n    let mut dp = vec![0; amt + 1];\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[amt]\n}\n
    coin_change_ii.c
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nint coinChangeIIDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u521d\u59cb\u5316 dp \u8868\n    int *dp = calloc(amt + 1, sizeof(int));\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91ca\u653e\u5185\u5b58\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 */\nfun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u521d\u59cb\u5316 dp \u8868\n    val dp = IntArray(amt + 1)\n    dp[0] = 1\n    // \u72b6\u6001\u8f6c\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.rb
    ### \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212 ###\ndef coin_change_ii_dp_comp(coins, amt)\n  n = coins.length\n  # \u521d\u59cb\u5316 dp \u8868\n  dp = Array.new(amt + 1, 0)\n  dp[0] = 1\n  # \u72b6\u6001\u8f6c\u79fb\n  for i in 1...(n + 1)\n    # \u6b63\u5e8f\u904d\u5386\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n        dp[a] = dp[a]\n      else\n        # \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u4e4b\u548c\n        dp[a] = dp[a] + dp[a - coins[i - 1]]\n      end\n    end\n  end\n  dp[amt]\nend\n
    coin_change_ii.zig
    // \u96f6\u94b1\u5151\u6362 II\uff1a\u7a7a\u95f4\u4f18\u5316\u540e\u7684\u52a8\u6001\u89c4\u5212\nfn coinChangeIIDPComp(comptime coins: []i32, comptime amt: usize) i32 {\n    comptime var n = coins.len;\n    // \u521d\u59cb\u5316 dp \u8868\n    var dp = [_]i32{0} ** (amt + 1);\n    dp[0] = 1;\n    // \u72b6\u6001\u8f6c\u79fb\n    for (1..n + 1) |i| {\n        for (1..amt + 1) |a| {\n            if (coins[i - 1] > @as(i32, @intCast(a))) {\n                // \u82e5\u8d85\u8fc7\u76ee\u6807\u91d1\u989d\uff0c\u5219\u4e0d\u9009\u786c\u5e01 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9009\u548c\u9009\u786c\u5e01 i \u8fd9\u4e24\u79cd\u65b9\u6848\u7684\u8f83\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u56fe","text":"

    Abstract

    \u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u4eec\u5c31\u50cf\u662f\u4e00\u4e2a\u4e2a\u8282\u70b9\uff0c\u88ab\u65e0\u6570\u770b\u4e0d\u89c1\u7684\u8fb9\u76f8\u8fde\u3002

    \u6bcf\u4e00\u6b21\u7684\u76f8\u8bc6\u4e0e\u76f8\u79bb\uff0c\u90fd\u5728\u8fd9\u5f20\u5de8\u5927\u7684\u7f51\u7edc\u56fe\u4e2d\u7559\u4e0b\u72ec\u7279\u7684\u5370\u8bb0\u3002

    "},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 9.1 \u00a0 \u56fe
    • 9.2 \u00a0 \u56fe\u57fa\u7840\u64cd\u4f5c
    • 9.3 \u00a0 \u56fe\u7684\u904d\u5386
    • 9.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u56fe","text":"

    \u56fe\uff08graph\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u7531\u9876\u70b9\uff08vertex\uff09\u548c\u8fb9\uff08edge\uff09\u7ec4\u6210\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u56fe \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9 \\(V\\) \u548c\u4e00\u7ec4\u8fb9 \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u4e2a\u5305\u542b 5 \u4e2a\u9876\u70b9\u548c 7 \u6761\u8fb9\u7684\u56fe\u3002

    \\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

    \u5982\u679c\u5c06\u9876\u70b9\u770b\u4f5c\u8282\u70b9\uff0c\u5c06\u8fb9\u770b\u4f5c\u8fde\u63a5\u5404\u4e2a\u8282\u70b9\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06\u56fe\u770b\u4f5c\u4e00\u79cd\u4ece\u94fe\u8868\u62d3\u5c55\u800c\u6765\u7684\u6570\u636e\u7ed3\u6784\u3002\u5982\u56fe 9-1 \u6240\u793a\uff0c\u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002

    \u56fe 9-1 \u00a0 \u94fe\u8868\u3001\u6811\u3001\u56fe\u4e4b\u95f4\u7684\u5173\u7cfb

    "},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u56fe\u7684\u5e38\u89c1\u7c7b\u578b\u4e0e\u672f\u8bed","text":"

    \u6839\u636e\u8fb9\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u4e3a\u65e0\u5411\u56fe\uff08undirected graph\uff09\u548c\u6709\u5411\u56fe\uff08directed graph\uff09\uff0c\u5982\u56fe 9-2 \u6240\u793a\u3002

    • \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u8fb9\u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u7684\u201c\u53cc\u5411\u201d\u8fde\u63a5\u5173\u7cfb\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u5173\u7cfb\u201d\u3002
    • \u5728\u6709\u5411\u56fe\u4e2d\uff0c\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u5173\u6ce8\u201d\u4e0e\u201c\u88ab\u5173\u6ce8\u201d\u5173\u7cfb\u3002

    \u56fe 9-2 \u00a0 \u6709\u5411\u56fe\u4e0e\u65e0\u5411\u56fe

    \u6839\u636e\u6240\u6709\u9876\u70b9\u662f\u5426\u8fde\u901a\uff0c\u53ef\u5206\u4e3a\u8fde\u901a\u56fe\uff08connected graph\uff09\u548c\u975e\u8fde\u901a\u56fe\uff08disconnected graph\uff09\uff0c\u5982\u56fe 9-3 \u6240\u793a\u3002

    • \u5bf9\u4e8e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u53ef\u4ee5\u5230\u8fbe\u5176\u4f59\u4efb\u610f\u9876\u70b9\u3002
    • \u5bf9\u4e8e\u975e\u8fde\u901a\u56fe\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002

    \u56fe 9-3 \u00a0 \u8fde\u901a\u56fe\u4e0e\u975e\u8fde\u901a\u56fe

    \u6211\u4eec\u8fd8\u53ef\u4ee5\u4e3a\u8fb9\u6dfb\u52a0\u201c\u6743\u91cd\u201d\u53d8\u91cf\uff0c\u4ece\u800c\u5f97\u5230\u5982\u56fe 9-4 \u6240\u793a\u7684\u6709\u6743\u56fe\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u8363\u8000\u300b\u7b49\u624b\u6e38\u4e2d\uff0c\u7cfb\u7edf\u4f1a\u6839\u636e\u5171\u540c\u6e38\u620f\u65f6\u95f4\u6765\u8ba1\u7b97\u73a9\u5bb6\u4e4b\u95f4\u7684\u201c\u4eb2\u5bc6\u5ea6\u201d\uff0c\u8fd9\u79cd\u4eb2\u5bc6\u5ea6\u7f51\u7edc\u5c31\u53ef\u4ee5\u7528\u6709\u6743\u56fe\u6765\u8868\u793a\u3002

    \u56fe 9-4 \u00a0 \u6709\u6743\u56fe\u4e0e\u65e0\u6743\u56fe

    \u56fe\u6570\u636e\u7ed3\u6784\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u672f\u8bed\u3002

    • \u90bb\u63a5\uff08adjacency\uff09\uff1a\u5f53\u4e24\u9876\u70b9\u4e4b\u95f4\u5b58\u5728\u8fb9\u76f8\u8fde\u65f6\uff0c\u79f0\u8fd9\u4e24\u9876\u70b9\u201c\u90bb\u63a5\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u9876\u70b9 1 \u7684\u90bb\u63a5\u9876\u70b9\u4e3a\u9876\u70b9 2\u30013\u30015\u3002
    • \u8def\u5f84\uff08path\uff09\uff1a\u4ece\u9876\u70b9 A \u5230\u9876\u70b9 B \u7ecf\u8fc7\u7684\u8fb9\u6784\u6210\u7684\u5e8f\u5217\u88ab\u79f0\u4e3a\u4ece A \u5230 B \u7684\u201c\u8def\u5f84\u201d\u3002\u5728\u56fe 9-4 \u4e2d\uff0c\u8fb9\u5e8f\u5217 1-5-2-4 \u662f\u9876\u70b9 1 \u5230\u9876\u70b9 4 \u7684\u4e00\u6761\u8def\u5f84\u3002
    • \u5ea6\uff08degree\uff09\uff1a\u4e00\u4e2a\u9876\u70b9\u62e5\u6709\u7684\u8fb9\u6570\u3002\u5bf9\u4e8e\u6709\u5411\u56fe\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u6307\u5411\u8be5\u9876\u70b9\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u6761\u8fb9\u4ece\u8be5\u9876\u70b9\u6307\u51fa\u3002
    "},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u56fe\u7684\u8868\u793a","text":"

    \u56fe\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u65e0\u5411\u56fe\u8fdb\u884c\u4e3e\u4f8b\u3002

    "},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u90bb\u63a5\u77e9\u9635","text":"

    \u8bbe\u56fe\u7684\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u90bb\u63a5\u77e9\u9635\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u4e2a \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u662f\u5426\u5b58\u5728\u8fb9\u3002

    \u5982\u56fe 9-5 \u6240\u793a\uff0c\u8bbe\u90bb\u63a5\u77e9\u9635\u4e3a \\(M\\)\u3001\u9876\u70b9\u5217\u8868\u4e3a \\(V\\) \uff0c\u90a3\u4e48\u77e9\u9635\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9876\u70b9 \\(V[i]\\) \u5230\u9876\u70b9 \\(V[j]\\) \u4e4b\u95f4\u5b58\u5728\u8fb9\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u4e24\u9876\u70b9\u4e4b\u95f4\u65e0\u8fb9\u3002

    \u56fe 9-5 \u00a0 \u56fe\u7684\u90bb\u63a5\u77e9\u9635\u8868\u793a

    \u90bb\u63a5\u77e9\u9635\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u9876\u70b9\u4e0d\u80fd\u4e0e\u81ea\u8eab\u76f8\u8fde\uff0c\u56e0\u6b64\u90bb\u63a5\u77e9\u9635\u4e3b\u5bf9\u89d2\u7ebf\u5143\u7d20\u6ca1\u6709\u610f\u4e49\u3002
    • \u5bf9\u4e8e\u65e0\u5411\u56fe\uff0c\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u7b49\u4ef7\uff0c\u6b64\u65f6\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\u3002
    • \u5c06\u90bb\u63a5\u77e9\u9635\u7684\u5143\u7d20\u4ece \\(1\\) \u548c \\(0\\) \u66ff\u6362\u4e3a\u6743\u91cd\uff0c\u5219\u53ef\u8868\u793a\u6709\u6743\u56fe\u3002

    \u4f7f\u7528\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u77e9\u9635\u5143\u7d20\u4ee5\u83b7\u53d6\u8fb9\uff0c\u56e0\u6b64\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9635\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u5185\u5b58\u5360\u7528\u8f83\u591a\u3002

    "},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u90bb\u63a5\u8868","text":"

    \u90bb\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u94fe\u8868\u8282\u70b9\u8868\u793a\u9876\u70b9\u3002\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff08\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u9876\u70b9\uff09\u3002\u56fe 9-6 \u5c55\u793a\u4e86\u4e00\u4e2a\u4f7f\u7528\u90bb\u63a5\u8868\u5b58\u50a8\u7684\u56fe\u7684\u793a\u4f8b\u3002

    \u56fe 9-6 \u00a0 \u56fe\u7684\u90bb\u63a5\u8868\u8868\u793a

    \u90bb\u63a5\u8868\u4ec5\u5b58\u50a8\u5b9e\u9645\u5b58\u5728\u7684\u8fb9\uff0c\u800c\u8fb9\u7684\u603b\u6570\u901a\u5e38\u8fdc\u5c0f\u4e8e \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002\u7136\u800c\uff0c\u5728\u90bb\u63a5\u8868\u4e2d\u9700\u8981\u901a\u8fc7\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u5176\u65f6\u95f4\u6548\u7387\u4e0d\u5982\u90bb\u63a5\u77e9\u9635\u3002

    \u89c2\u5bdf\u56fe 9-6 \uff0c\u90bb\u63a5\u8868\u7ed3\u6784\u4e0e\u54c8\u5e0c\u8868\u4e2d\u7684\u201c\u94fe\u5f0f\u5730\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u4eec\u4e5f\u53ef\u4ee5\u91c7\u7528\u7c7b\u4f3c\u7684\u65b9\u6cd5\u6765\u4f18\u5316\u6548\u7387\u3002\u6bd4\u5982\u5f53\u94fe\u8868\u8f83\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u5316\u4e3a AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u6548\u7387\u4ece \\(O(n)\\) \u4f18\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u8fd8\u53ef\u4ee5\u628a\u94fe\u8868\u8f6c\u6362\u4e3a\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

    "},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u56fe\u7684\u5e38\u89c1\u5e94\u7528","text":"

    \u5982\u8868 9-1 \u6240\u793a\uff0c\u8bb8\u591a\u73b0\u5b9e\u7cfb\u7edf\u53ef\u4ee5\u7528\u56fe\u6765\u5efa\u6a21\uff0c\u76f8\u5e94\u7684\u95ee\u9898\u4e5f\u53ef\u4ee5\u7ea6\u5316\u4e3a\u56fe\u8ba1\u7b97\u95ee\u9898\u3002

    \u8868 9-1 \u00a0 \u73b0\u5b9e\u751f\u6d3b\u4e2d\u5e38\u89c1\u7684\u56fe

    \u9876\u70b9 \u8fb9 \u56fe\u8ba1\u7b97\u95ee\u9898 \u793e\u4ea4\u7f51\u7edc \u7528\u6237 \u597d\u53cb\u5173\u7cfb \u6f5c\u5728\u597d\u53cb\u63a8\u8350 \u5730\u94c1\u7ebf\u8def \u7ad9\u70b9 \u7ad9\u70b9\u95f4\u7684\u8fde\u901a\u6027 \u6700\u77ed\u8def\u7ebf\u63a8\u8350 \u592a\u9633\u7cfb \u661f\u4f53 \u661f\u4f53\u95f4\u7684\u4e07\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8f68\u9053\u8ba1\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u56fe\u7684\u57fa\u7840\u64cd\u4f5c","text":"

    \u56fe\u7684\u57fa\u7840\u64cd\u4f5c\u53ef\u5206\u4e3a\u5bf9\u201c\u8fb9\u201d\u7684\u64cd\u4f5c\u548c\u5bf9\u201c\u9876\u70b9\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u90bb\u63a5\u77e9\u9635\u201d\u548c\u201c\u90bb\u63a5\u8868\u201d\u4e24\u79cd\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5b9e\u73b0\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

    "},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u7684\u5b9e\u73b0","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u9876\u70b9\u6570\u91cf\u4e3a \\(n\\) \u7684\u65e0\u5411\u56fe\uff0c\u5219\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u5f0f\u5982\u56fe 9-7 \u6240\u793a\u3002

    • \u6dfb\u52a0\u6216\u5220\u9664\u8fb9\uff1a\u76f4\u63a5\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u800c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u9700\u8981\u540c\u65f6\u66f4\u65b0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
    • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u7684\u5c3e\u90e8\u6dfb\u52a0\u4e00\u884c\u4e00\u5217\uff0c\u5e76\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
    • \u5220\u9664\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u4e00\u884c\u4e00\u5217\u3002\u5f53\u5220\u9664\u9996\u884c\u9996\u5217\u65f6\u8fbe\u5230\u6700\u5dee\u60c5\u51b5\uff0c\u9700\u8981\u5c06 \\((n-1)^2\\) \u4e2a\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52a8\u201d\uff0c\u4ece\u800c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u521d\u59cb\u5316\uff1a\u4f20\u5165 \\(n\\) \u4e2a\u9876\u70b9\uff0c\u521d\u59cb\u5316\u957f\u5ea6\u4e3a \\(n\\) \u7684\u9876\u70b9\u5217\u8868 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u90bb\u63a5\u77e9\u9635 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    \u521d\u59cb\u5316\u90bb\u63a5\u77e9\u9635\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

    \u56fe 9-7 \u00a0 \u90bb\u63a5\u77e9\u9635\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

    \u4ee5\u4e0b\u662f\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u8868\u793a\u56fe\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
    class GraphAdjMat:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u6dfb\u52a0\u9876\u70b9\n        for val in vertices:\n            self.add_vertex(val)\n        # \u6dfb\u52a0\u8fb9\n        # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        n = self.size()\n        # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u77e9\u9635\"\"\"\n        print(\"\u9876\u70b9\u5217\u8868 =\", self.vertices)\n        print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        print_matrix(self.adj_mat)\n
    graph_adjacency_matrix.cpp
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9876\u70b9\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    void print() {\n        cout << \"\u9876\u70b9\u5217\u8868 = \";\n        printVector(vertices);\n        cout << \"\u90bb\u63a5\u77e9\u9635 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
    graph_adjacency_matrix.java
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u6dfb\u52a0\u9876\u70b9\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void print() {\n        System.out.print(\"\u9876\u70b9\u5217\u8868 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.cs
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    public void Print() {\n        Console.Write(\"\u9876\u70b9\u5217\u8868 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u90bb\u63a5\u77e9\u9635 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.go
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjMat struct {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    vertices []int\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u6dfb\u52a0\u9876\u70b9\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u521d\u59cb\u5316\u56fe\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9876\u70b9\u5217\u8868 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u90bb\u63a5\u77e9\u9635 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
    graph_adjacency_matrix.swift
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.append(val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    func print() {\n        Swift.print(\"\u9876\u70b9\u5217\u8868 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u90bb\u63a5\u77e9\u9635 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
    graph_adjacency_matrix.js
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print() {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.ts
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n    vertices: number[]; // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u51fd\u6570 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u6dfb\u52a0\u9876\u70b9\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        this.vertices.splice(index, 1);\n\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    print(): void {\n        console.log('\u9876\u70b9\u5217\u8868 = ', this.vertices);\n        console.log('\u90bb\u63a5\u77e9\u9635 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.dart
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9876\u70b9\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u6dfb\u52a0\u9876\u70b9\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u6dfb\u52a0\u8fb9\n    // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    vertices.add(val);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    vertices.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n  void printAdjMat() {\n    print(\"\u9876\u70b9\u5217\u8868 = $vertices\");\n    print(\"\u90bb\u63a5\u77e9\u9635 = \");\n    printMatrix(adjMat);\n  }\n}\n
    graph_adjacency_matrix.rs
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjMat {\n    // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u6dfb\u52a0\u9876\u70b9\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        self.vertices.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    pub fn print(&self) {\n        println!(\"\u9876\u70b9\u5217\u8868 = {:?}\", self.vertices);\n        println!(\"\u90bb\u63a5\u77e9\u9635 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
    graph_adjacency_matrix.c
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u56fe\u7684\u9876\u70b9\u6570\u91cf\u5df2\u8fbe\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u6dfb\u52a0\u7b2c n \u4e2a\u9876\u70b9\uff0c\u5e76\u5c06\u7b2c n \u884c\u548c\u5217\u7f6e\u96f6\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9876\u70b9\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u5220\u9664\u8fb9 */\n// \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u8fb9\u7d22\u5f15\u8d8a\u754c\u6216\u76f8\u7b49\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9876\u70b9\u5217\u8868 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u90bb\u63a5\u77e9\u9635 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
    graph_adjacency_matrix.kt
    /* \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u9876\u70b9\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u6dfb\u52a0\u8fb9\n        // \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n        vertices.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    // \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u77e9\u9635 */\n    fun print() {\n        print(\"\u9876\u70b9\u5217\u8868 = \")\n        println(vertices)\n        println(\"\u90bb\u63a5\u77e9\u9635 =\")\n        printMatrix(adjMat)\n    }\n}\n
    graph_adjacency_matrix.rb
    ### \u57fa\u4e8e\u90bb\u63a5\u77e9\u9635\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    ### \u6784\u9020\u65b9\u6cd5 ###\n    # \u9876\u70b9\u5217\u8868\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9876\u70b9\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @vertices = []\n    # \u90bb\u63a5\u77e9\u9635\uff0c\u884c\u5217\u7d22\u5f15\u5bf9\u5e94\u201c\u9876\u70b9\u7d22\u5f15\u201d\n    @adj_mat = []\n    # \u6dfb\u52a0\u9876\u70b9\n    vertices.each { |val| add_vertex(val) }\n    # \u6dfb\u52a0\u8fb9\n    # \u8bf7\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9876\u70b9\u7d22\u5f15\uff0c\u5373\u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @vertices.length\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(val)\n    n = size\n    # \u5411\u9876\u70b9\u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u9876\u70b9\u7684\u503c\n    @vertices << val\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u884c\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u6dfb\u52a0\u4e00\u5217\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u5728\u9876\u70b9\u5217\u8868\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9876\u70b9\n    @vertices.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u884c\n    @adj_mat.delete_at(index)\n    # \u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u5220\u9664\u7d22\u5f15 index \u7684\u5217\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u90bb\u63a5\u77e9\u9635\u5173\u4e8e\u4e3b\u5bf9\u89d2\u7ebf\u5bf9\u79f0\uff0c\u5373\u6ee1\u8db3 (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(i, j)\n    # \u53c2\u6570 i, j \u5bf9\u5e94 vertices \u5143\u7d20\u7d22\u5f15\n    # \u7d22\u5f15\u8d8a\u754c\u4e0e\u76f8\u7b49\u5904\u7406\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u77e9\u9635 ###\n  def __print__\n    puts \"\u9876\u70b9\u5217\u8868 = #{@vertices}\"\n    puts '\u90bb\u63a5\u77e9\u9635 ='\n    print_matrix(@adj_mat)\n  end\nend\n
    graph_adjacency_matrix.zig
    [class]{GraphAdjMat}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u4e8e\u90bb\u63a5\u8868\u7684\u5b9e\u73b0","text":"

    \u8bbe\u65e0\u5411\u56fe\u7684\u9876\u70b9\u603b\u6570\u4e3a \\(n\\)\u3001\u8fb9\u603b\u6570\u4e3a \\(m\\) \uff0c\u5219\u53ef\u6839\u636e\u56fe 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5b9e\u73b0\u5404\u79cd\u64cd\u4f5c\u3002

    • \u6dfb\u52a0\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u7684\u672b\u5c3e\u6dfb\u52a0\u8fb9\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002\u56e0\u4e3a\u662f\u65e0\u5411\u56fe\uff0c\u6240\u4ee5\u9700\u8981\u540c\u65f6\u6dfb\u52a0\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
    • \u5220\u9664\u8fb9\uff1a\u5728\u9876\u70b9\u5bf9\u5e94\u94fe\u8868\u4e2d\u67e5\u627e\u5e76\u5220\u9664\u6307\u5b9a\u8fb9\uff0c\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\u3002\u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u9700\u8981\u540c\u65f6\u5220\u9664\u4e24\u4e2a\u65b9\u5411\u7684\u8fb9\u3002
    • \u6dfb\u52a0\u9876\u70b9\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u94fe\u8868\uff0c\u5e76\u5c06\u65b0\u589e\u9876\u70b9\u4f5c\u4e3a\u94fe\u8868\u5934\u8282\u70b9\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
    • \u5220\u9664\u9876\u70b9\uff1a\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5220\u9664\u5305\u542b\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
    • \u521d\u59cb\u5316\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\u521b\u5efa \\(n\\) \u4e2a\u9876\u70b9\u548c \\(2m\\) \u6761\u8fb9\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u65f6\u95f4\u3002
    \u521d\u59cb\u5316\u90bb\u63a5\u8868\u6dfb\u52a0\u8fb9\u5220\u9664\u8fb9\u6dfb\u52a0\u9876\u70b9\u5220\u9664\u9876\u70b9

    \u56fe 9-8 \u00a0 \u90bb\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u5220\u8fb9\u3001\u589e\u5220\u9876\u70b9

    \u4ee5\u4e0b\u662f\u90bb\u63a5\u8868\u7684\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u6bd4\u56fe 9-8 \uff0c\u5b9e\u9645\u4ee3\u7801\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

    • \u4e3a\u4e86\u65b9\u4fbf\u6dfb\u52a0\u4e0e\u5220\u9664\u9876\u70b9\uff0c\u4ee5\u53ca\u7b80\u5316\u4ee3\u7801\uff0c\u6211\u4eec\u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u6765\u4ee3\u66ff\u94fe\u8868\u3002
    • \u4f7f\u7528\u54c8\u5e0c\u8868\u6765\u5b58\u50a8\u90bb\u63a5\u8868\uff0ckey \u4e3a\u9876\u70b9\u5b9e\u4f8b\uff0cvalue \u4e3a\u8be5\u9876\u70b9\u7684\u90bb\u63a5\u9876\u70b9\u5217\u8868\uff08\u94fe\u8868\uff09\u3002

    \u53e6\u5916\uff0c\u6211\u4eec\u5728\u90bb\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u7c7b\u6765\u8868\u793a\u9876\u70b9\uff0c\u8fd9\u6837\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u4e0e\u90bb\u63a5\u77e9\u9635\u4e00\u6837\uff0c\u7528\u5217\u8868\u7d22\u5f15\u6765\u533a\u5206\u4e0d\u540c\u9876\u70b9\uff0c\u90a3\u4e48\u5047\u8bbe\u8981\u5220\u9664\u7d22\u5f15\u4e3a \\(i\\) \u7684\u9876\u70b9\uff0c\u5219\u9700\u904d\u5386\u6574\u4e2a\u90bb\u63a5\u8868\uff0c\u5c06\u6240\u6709\u5927\u4e8e \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u51cf \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u4e2a\u9876\u70b9\u90fd\u662f\u552f\u4e00\u7684 Vertex \u5b9e\u4f8b\uff0c\u5220\u9664\u67d0\u4e00\u9876\u70b9\u4e4b\u540e\u5c31\u65e0\u987b\u6539\u52a8\u5176\u4ed6\u9876\u70b9\u4e86\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
    class GraphAdjList:\n    \"\"\"\u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u9876\u70b9\u6570\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u6dfb\u52a0\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u5220\u9664\u8fb9\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u6dfb\u52a0\u9876\u70b9\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u5220\u9664\u9876\u70b9\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.pop(vet)\n        # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u90bb\u63a5\u8868\"\"\"\n        print(\"\u90bb\u63a5\u8868 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
    graph_adjacency_list.cpp
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  public:\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u5220\u9664\u6307\u5b9a\u8282\u70b9 */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9876\u70b9\");\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.erase(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    void print() {\n        cout << \"\u90bb\u63a5\u8868 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
    graph_adjacency_list.java
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u90bb\u63a5\u8868 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
    graph_adjacency_list.cs
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u6784\u9020\u51fd\u6570 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList.Add(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.Remove(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u90bb\u63a5\u8868 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
    graph_adjacency_list.go
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntype graphAdjList struct {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList map[Vertex][]Vertex\n}\n\n/* \u6784\u9020\u51fd\u6570 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2, \u6dfb\u52a0\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u5220\u9664\u8fb9 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    delete(g.adjList, vet)\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u6253\u5370\u90bb\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u90bb\u63a5\u8868 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
    graph_adjacency_list.swift
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = []\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c2\u6570\u9519\u8bef\")\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.removeValue(forKey: vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u90bb\u63a5\u8868 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
    graph_adjacency_list.js
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print() {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
    graph_adjacency_list.ts
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        this.adjList.set(vet, []);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        this.adjList.delete(vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    print(): void {\n        console.log('\u90bb\u63a5\u8868 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
    graph_adjacency_list.dart
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList {\n  // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u6dfb\u52a0\u8fb9 */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u5220\u9664\u8fb9 */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u6dfb\u52a0\u9876\u70b9 */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    adjList[vet] = [];\n  }\n\n  /* \u5220\u9664\u9876\u70b9 */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    adjList.remove(vet);\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u6253\u5370\u90bb\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u90bb\u63a5\u8868 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
    graph_adjacency_list.rs
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b\u578b */\npub struct GraphAdjList {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        self.adj_list.get_mut(&vet1).unwrap().push(vet2);\n        self.adj_list.get_mut(&vet2).unwrap().push(vet1);\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2\n        {\n            panic!(\"value error\");\n        }\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        self.adj_list\n            .get_mut(&vet1)\n            .unwrap()\n            .retain(|&vet| vet != vet2);\n        self.adj_list\n            .get_mut(&vet2)\n            .unwrap()\n            .retain(|&vet| vet != vet1);\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        if !self.adj_list.contains_key(&vet) {\n            panic!(\"value error\");\n        }\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        self.adj_list.remove(&vet);\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u90bb\u63a5\u8868 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
    graph_adjacency_list.c
    /* \u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9876\u70b9\n    struct AdjListNode *next; // \u540e\u7ee7\u8282\u70b9\n} AdjListNode;\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u5934\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u5220\u9664\u8fb9\u8f85\u52a9\u51fd\u6570 */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u94fe\u8868\u4e2d\u641c\u7d22 vet \u5bf9\u5e94\u8282\u70b9\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c06 vet \u5bf9\u5e94\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\n    pre->next = cur->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(cur);\n}\n\n/* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u8282\u70b9\u6570\u7ec4\n    int size;                     // \u8282\u70b9\u6570\u91cf\n} GraphAdjList;\n\n/* \u6784\u9020\u51fd\u6570 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u67e5\u627e\u9876\u70b9\u5bf9\u5e94\u7684\u8282\u70b9 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u6dfb\u52a0\u8fb9 */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u6dfb\u52a0\u8fb9 vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u5220\u9664\u8fb9 */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u5220\u9664\u8fb9 vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u6dfb\u52a0\u9876\u70b9 */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    graph->heads[graph->size++] = head;\n}\n\n/* \u5220\u9664\u9876\u70b9 */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u5c06\u8be5\u9876\u70b9\u4e4b\u540e\u7684\u9876\u70b9\u5411\u524d\u79fb\u52a8\uff0c\u4ee5\u586b\u8865\u7a7a\u7f3a\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
    graph_adjacency_list.kt
    /* \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        // \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u83b7\u53d6\u9876\u70b9\u6570\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u6dfb\u52a0\u8fb9 */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u6dfb\u52a0\u8fb9 vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u5220\u9664\u8fb9 */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u5220\u9664\u8fb9 vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u6dfb\u52a0\u9876\u70b9 */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u5220\u9664\u9876\u70b9 */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n        adjList.remove(vet)\n        // \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u6253\u5370\u90bb\u63a5\u8868 */\n    fun print() {\n        println(\"\u90bb\u63a5\u8868 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
    graph_adjacency_list.rb
    ### \u57fa\u4e8e\u90bb\u63a5\u8868\u5b9e\u73b0\u7684\u65e0\u5411\u56fe\u7c7b ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(edges)\n    # \u90bb\u63a5\u8868\uff0ckey\uff1a\u9876\u70b9\uff0cvalue\uff1a\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    @adj_list = {}\n    # \u6dfb\u52a0\u6240\u6709\u9876\u70b9\u548c\u8fb9\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  ### \u83b7\u53d6\u9876\u70b9\u6570\u91cf ###\n  def size\n    @adj_list.length\n  end\n\n  ### \u6dfb\u52a0\u8fb9 ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  ### \u5220\u9664\u8fb9 ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u5220\u9664\u8fb9 vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  ### \u6dfb\u52a0\u9876\u70b9 ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u94fe\u8868\n    @adj_list[vet] = []\n  end\n\n  ### \u5220\u9664\u9876\u70b9 ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u5728\u90bb\u63a5\u8868\u4e2d\u5220\u9664\u9876\u70b9 vet \u5bf9\u5e94\u7684\u94fe\u8868\n    @adj_list.delete(vet)\n    # \u904d\u5386\u5176\u4ed6\u9876\u70b9\u7684\u94fe\u8868\uff0c\u5220\u9664\u6240\u6709\u5305\u542b vet \u7684\u8fb9\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  ### \u6253\u5370\u90bb\u63a5\u8868 ###\n  def __print__\n    puts '\u90bb\u63a5\u8868 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5bf9\u6bd4","text":"

    \u8bbe\u56fe\u4e2d\u5171\u6709 \\(n\\) \u4e2a\u9876\u70b9\u548c \\(m\\) \u6761\u8fb9\uff0c\u8868 9-2 \u5bf9\u6bd4\u4e86\u90bb\u63a5\u77e9\u9635\u548c\u90bb\u63a5\u8868\u7684\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u3002

    \u8868 9-2 \u00a0 \u90bb\u63a5\u77e9\u9635\u4e0e\u90bb\u63a5\u8868\u5bf9\u6bd4

    \u90bb\u63a5\u77e9\u9635 \u90bb\u63a5\u8868\uff08\u94fe\u8868\uff09 \u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09 \u5224\u65ad\u662f\u5426\u90bb\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u8fb9 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u8fb9 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u6dfb\u52a0\u9876\u70b9 \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u9876\u70b9 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u5185\u5b58\u7a7a\u95f4\u5360\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

    \u89c2\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u90bb\u63a5\u8868\uff08\u54c8\u5e0c\u8868\uff09\u7684\u65f6\u95f4\u6548\u7387\u4e0e\u7a7a\u95f4\u6548\u7387\u6700\u4f18\u3002\u4f46\u5b9e\u9645\u4e0a\uff0c\u5728\u90bb\u63a5\u77e9\u9635\u4e2d\u64cd\u4f5c\u8fb9\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u6570\u7ec4\u8bbf\u95ee\u6216\u8d4b\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7efc\u5408\u6765\u770b\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\u7684\u539f\u5219\uff0c\u800c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u7684\u539f\u5219\u3002

    "},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u56fe\u7684\u904d\u5386","text":"

    \u6811\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5bf9\u591a\u201d\u7684\u5173\u7cfb\uff0c\u800c\u56fe\u5219\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5bf9\u591a\u201d\u5173\u7cfb\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u6811\u770b\u4f5c\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\u3002\u663e\u7136\uff0c\u6811\u7684\u904d\u5386\u64cd\u4f5c\u4e5f\u662f\u56fe\u7684\u904d\u5386\u64cd\u4f5c\u7684\u4e00\u79cd\u7279\u4f8b\u3002

    \u56fe\u548c\u6811\u90fd\u9700\u8981\u5e94\u7528\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u904d\u5386\u64cd\u4f5c\u3002\u56fe\u7684\u904d\u5386\u65b9\u5f0f\u4e5f\u53ef\u5206\u4e3a\u4e24\u79cd\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u548c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

    "},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5e7f\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u4ece\u67d0\u4e2a\u8282\u70b9\u51fa\u53d1\uff0c\u59cb\u7ec8\u4f18\u5148\u8bbf\u95ee\u8ddd\u79bb\u6700\u8fd1\u7684\u9876\u70b9\uff0c\u5e76\u4e00\u5c42\u5c42\u5411\u5916\u6269\u5f20\u3002\u5982\u56fe 9-9 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u9996\u5148\u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u7136\u540e\u904d\u5386\u4e0b\u4e00\u4e2a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u8bbf\u95ee\u5b8c\u6bd5\u3002

    \u56fe 9-9 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386

    "},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

    BFS \u901a\u5e38\u501f\u52a9\u961f\u5217\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\u3002\u961f\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8d28\uff0c\u8fd9\u4e0e BFS \u7684\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u601d\u60f3\u5f02\u66f2\u540c\u5de5\u3002

    1. \u5c06\u904d\u5386\u8d77\u59cb\u9876\u70b9 startVet \u52a0\u5165\u961f\u5217\uff0c\u5e76\u5f00\u542f\u5faa\u73af\u3002
    2. \u5728\u5faa\u73af\u7684\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\uff0c\u5f39\u51fa\u961f\u9996\u9876\u70b9\u5e76\u8bb0\u5f55\u8bbf\u95ee\uff0c\u7136\u540e\u5c06\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u52a0\u5165\u5230\u961f\u5217\u5c3e\u90e8\u3002
    3. \u5faa\u73af\u6b65\u9aa4 2. \uff0c\u76f4\u5230\u6240\u6709\u9876\u70b9\u88ab\u8bbf\u95ee\u5b8c\u6bd5\u540e\u7ed3\u675f\u3002

    \u4e3a\u4e86\u9632\u6b62\u91cd\u590d\u904d\u5386\u9876\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\u3002

    Tip

    \u54c8\u5e0c\u96c6\u5408\u53ef\u4ee5\u770b\u4f5c\u4e00\u4e2a\u53ea\u5b58\u50a8 key \u800c\u4e0d\u5b58\u50a8 value \u7684\u54c8\u5e0c\u8868\uff0c\u5b83\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fdb\u884c key \u7684\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u3002\u6839\u636e key \u7684\u552f\u4e00\u6027\uff0c\u54c8\u5e0c\u96c6\u5408\u901a\u5e38\u7528\u4e8e\u6570\u636e\u53bb\u91cd\u7b49\u573a\u666f\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
    def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]([start_vet])\n    # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while len(que) > 0:\n        vet = que.popleft()  # \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.append(adj_vet)  # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adj_vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n
    graph_bfs.cpp
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited = {startVet};\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push_back(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.push(adjVet);        // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.emplace(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.java
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet);            // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.cs
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [startVet];\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.Add(vet);               // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.Add(adjVet);   // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.go
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS, \u4f7f\u7528\u5207\u7247\u6a21\u62df\u961f\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    for len(queue) > 0 {\n        // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        res = append(res, vet)\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_bfs.swift
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = [startVet]\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.append(adjVet) // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.insert(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_bfs.js
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.ts
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    const que = [startVet];\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (que.length) {\n        const vet = que.shift(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            que.push(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\n            visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.dart
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      }\n      que.add(adjVet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adjVet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    }\n  }\n  // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  return res;\n}\n
    graph_bfs.rs
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited.insert(adj_vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res\n}\n
    graph_bfs.c
    /* \u8282\u70b9\u961f\u5217\u7ed3\u6784\u4f53 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u6784\u9020\u51fd\u6570 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u961f\u64cd\u4f5c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u51fa\u961f\u64cd\u4f5c */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res[(*resSize)++] = vet;      // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n                visited[(*visitedSize)++] = node->vertex; // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n            }\n            node = node->next;\n        }\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(queue);\n}\n
    graph_bfs.kt
    /* \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u961f\u9996\u9876\u70b9\u51fa\u961f\n        res.add(vet)         // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n        // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            que.offer(adjVet)   // \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n            visited.add(adjVet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n        }\n    }\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_bfs.rb
    ### \u5e7f\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_bfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new([start_vet])\n  # \u961f\u5217\u7528\u4e8e\u5b9e\u73b0 BFS\n  que = [start_vet]\n  # \u4ee5\u9876\u70b9 vet \u4e3a\u8d77\u70b9\uff0c\u5faa\u73af\u76f4\u81f3\u8bbf\u95ee\u5b8c\u6240\u6709\u9876\u70b9\n  while que.length > 0\n    vet = que.shift # \u961f\u9996\u9876\u70b9\u51fa\u961f\n    res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n      que << adj_vet # \u53ea\u5165\u961f\u672a\u8bbf\u95ee\u7684\u9876\u70b9\n      visited.add(adj_vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    end\n  end\n  # \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res\nend\n
    graph_bfs.zig
    [class]{}-[func]{graphBFS}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4ee3\u7801\u76f8\u5bf9\u62bd\u8c61\uff0c\u5efa\u8bae\u5bf9\u7167\u56fe 9-10 \u6765\u52a0\u6df1\u7406\u89e3\u3002

    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 9-10 \u00a0 \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u4e0d\u552f\u4e00\u3002\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u8fdc\u201d\u7684\u987a\u5e8f\u904d\u5386\uff0c\u800c\u591a\u4e2a\u76f8\u540c\u8ddd\u79bb\u7684\u9876\u70b9\u7684\u904d\u5386\u987a\u5e8f\u5141\u8bb8\u88ab\u4efb\u610f\u6253\u4e71\u3002\u4ee5\u56fe 9-10 \u4e3a\u4f8b\uff0c\u9876\u70b9 \\(1\\)\u3001\\(3\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\uff0c\u9876\u70b9 \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8bbf\u95ee\u987a\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u6362\u3002

    "},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u5165\u961f\u5e76\u51fa\u961f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u5728\u904d\u5386\u90bb\u63a5\u9876\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u7531\u4e8e\u662f\u65e0\u5411\u56fe\uff0c\u56e0\u6b64\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \uff0c\u961f\u5217 que \u4e2d\u7684\u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

    "},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u4f18\u5148\u904d\u5386","text":"

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u518d\u56de\u5934\u7684\u904d\u5386\u65b9\u5f0f\u3002\u5982\u56fe 9-11 \u6240\u793a\uff0c\u4ece\u5de6\u4e0a\u89d2\u9876\u70b9\u51fa\u53d1\uff0c\u8bbf\u95ee\u5f53\u524d\u9876\u70b9\u7684\u67d0\u4e2a\u90bb\u63a5\u9876\u70b9\uff0c\u76f4\u5230\u8d70\u5230\u5c3d\u5934\u65f6\u8fd4\u56de\uff0c\u518d\u7ee7\u7eed\u8d70\u5230\u5c3d\u5934\u5e76\u8fd4\u56de\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9876\u70b9\u904d\u5386\u5b8c\u6210\u3002

    \u56fe 9-11 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386

    "},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u7b97\u6cd5\u5b9e\u73b0","text":"

    \u8fd9\u79cd\u201c\u8d70\u5230\u5c3d\u5934\u518d\u8fd4\u56de\u201d\u7684\u7b97\u6cd5\u8303\u5f0f\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002\u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u5728\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u4e2d\uff0c\u6211\u4eec\u4e5f\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u96c6\u5408 visited \u6765\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\uff0c\u4ee5\u907f\u514d\u91cd\u590d\u8bbf\u95ee\u9876\u70b9\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
    def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570\"\"\"\n    res.append(vet)  # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet)  # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n    # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res = []\n    # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
    graph_dfs.cpp
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.emplace(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.java
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.cs
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.Add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9                             \n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.go
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u4f1a\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u987b\u8ba9\u539f\u5f15\u7528\u91cd\u65b0\u8d4b\u503c\u4e3a\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9876\u70b9\u904d\u5386\u5e8f\u5217\n    return res\n}\n
    graph_dfs.swift
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
    graph_dfs.js
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph, startVet) {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.ts
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        }\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.dart
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    }\n    // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
    graph_dfs.rs
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.insert(vet); // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n                         // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n            }\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    let mut res = vec![];\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
    graph_dfs.c
    /* \u68c0\u67e5\u9876\u70b9\u662f\u5426\u5df2\u88ab\u8bbf\u95ee */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u904d\u5386\u67e5\u627e\u8282\u70b9\uff0c\u4f7f\u7528 O(n) \u65f6\u95f4\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    res[(*resSize)++] = vet;\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
    graph_dfs.kt
    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n    visited.add(vet) // \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n    // \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n        // \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n// \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9876\u70b9\u904d\u5386\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
    graph_dfs.rb
    ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u8f85\u52a9\u51fd\u6570 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u8bb0\u5f55\u8bbf\u95ee\u9876\u70b9\n  visited.add(vet) # \u6807\u8bb0\u8be5\u9876\u70b9\u5df2\u88ab\u8bbf\u95ee\n  # \u904d\u5386\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u8df3\u8fc7\u5df2\u88ab\u8bbf\u95ee\u7684\u9876\u70b9\n    # \u9012\u5f52\u8bbf\u95ee\u90bb\u63a5\u9876\u70b9\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\ndef graph_dfs(graph, start_vet)\n  # \u4f7f\u7528\u90bb\u63a5\u8868\u6765\u8868\u793a\u56fe\uff0c\u4ee5\u4fbf\u83b7\u53d6\u6307\u5b9a\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\n  # \u9876\u70b9\u904d\u5386\u5e8f\u5217\n  res = []\n  # \u54c8\u5e0c\u96c6\u5408\uff0c\u7528\u4e8e\u8bb0\u5f55\u5df2\u88ab\u8bbf\u95ee\u8fc7\u7684\u9876\u70b9\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 9-12 \u6240\u793a\u3002

    • \u76f4\u865a\u7ebf\u4ee3\u8868\u5411\u4e0b\u9012\u63a8\uff0c\u8868\u793a\u5f00\u542f\u4e86\u4e00\u4e2a\u65b0\u7684\u9012\u5f52\u65b9\u6cd5\u6765\u8bbf\u95ee\u65b0\u9876\u70b9\u3002
    • \u66f2\u865a\u7ebf\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u9012\u5f52\u65b9\u6cd5\u5df2\u7ecf\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u5f00\u542f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

    \u4e3a\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8bae\u5c06\u56fe 9-12 \u4e0e\u4ee3\u7801\u7ed3\u5408\u8d77\u6765\uff0c\u5728\u8111\u4e2d\u6a21\u62df\uff08\u6216\u8005\u7528\u7b14\u753b\u4e0b\u6765\uff09\u6574\u4e2a DFS \u8fc7\u7a0b\uff0c\u5305\u62ec\u6bcf\u4e2a\u9012\u5f52\u65b9\u6cd5\u4f55\u65f6\u5f00\u542f\u3001\u4f55\u65f6\u8fd4\u56de\u3002

    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 9-12 \u00a0 \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u6b65\u9aa4

    \u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u4e0e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u7c7b\u4f3c\uff0c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5e8f\u5217\u7684\u987a\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7ed9\u5b9a\u67d0\u9876\u70b9\uff0c\u5148\u5f80\u54ea\u4e2a\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u90bb\u63a5\u9876\u70b9\u7684\u987a\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e71\uff0c\u90fd\u662f\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

    \u4ee5\u6811\u7684\u904d\u5386\u4e3a\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\uff0c\u5b83\u4eec\u5c55\u793a\u4e86\u4e09\u79cd\u904d\u5386\u4f18\u5148\u7ea7\uff0c\u7136\u800c\u8fd9\u4e09\u8005\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u3002

    "},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u65f6\u95f4\u590d\u6742\u5ea6\uff1a\u6240\u6709\u9876\u70b9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u65f6\u95f4\uff1b\u6240\u6709\u8fb9\u90fd\u4f1a\u88ab\u8bbf\u95ee \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u65f6\u95f4\uff1b\u603b\u4f53\u4f7f\u7528 \\(O(|V| + |E|)\\) \u65f6\u95f4\u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6\uff1a\u5217\u8868 res \uff0c\u54c8\u5e0c\u96c6\u5408 visited \u9876\u70b9\u6570\u91cf\u6700\u591a\u4e3a \\(|V|\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u6700\u5927\u4e3a \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u95f4\u3002

    "},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u56fe\u7531\u9876\u70b9\u548c\u8fb9\u7ec4\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u4e3a\u4e00\u7ec4\u9876\u70b9\u548c\u4e00\u7ec4\u8fb9\u6784\u6210\u7684\u96c6\u5408\u3002
    • \u76f8\u8f83\u4e8e\u7ebf\u6027\u5173\u7cfb\uff08\u94fe\u8868\uff09\u548c\u5206\u6cbb\u5173\u7cfb\uff08\u6811\uff09\uff0c\u7f51\u7edc\u5173\u7cfb\uff08\u56fe\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u4e3a\u590d\u6742\u3002
    • \u6709\u5411\u56fe\u7684\u8fb9\u5177\u6709\u65b9\u5411\u6027\uff0c\u8fde\u901a\u56fe\u4e2d\u7684\u4efb\u610f\u9876\u70b9\u5747\u53ef\u8fbe\uff0c\u6709\u6743\u56fe\u7684\u6bcf\u6761\u8fb9\u90fd\u5305\u542b\u6743\u91cd\u53d8\u91cf\u3002
    • \u90bb\u63a5\u77e9\u9635\u5229\u7528\u77e9\u9635\u6765\u8868\u793a\u56fe\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u4e2a\u9876\u70b9\uff0c\u77e9\u9635\u5143\u7d20\u4ee3\u8868\u8fb9\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u6709\u8fb9\u6216\u65e0\u8fb9\u3002\u90bb\u63a5\u77e9\u9635\u5728\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u95f4\u5360\u7528\u8f83\u591a\u3002
    • \u90bb\u63a5\u8868\u4f7f\u7528\u591a\u4e2a\u94fe\u8868\u6765\u8868\u793a\u56fe\uff0c\u7b2c \\(i\\) \u4e2a\u94fe\u8868\u5bf9\u5e94\u9876\u70b9 \\(i\\) \uff0c\u5176\u4e2d\u5b58\u50a8\u4e86\u8be5\u9876\u70b9\u7684\u6240\u6709\u90bb\u63a5\u9876\u70b9\u3002\u90bb\u63a5\u8868\u76f8\u5bf9\u4e8e\u90bb\u63a5\u77e9\u9635\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\uff0c\u4f46\u7531\u4e8e\u9700\u8981\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u8fb9\uff0c\u56e0\u6b64\u65f6\u95f4\u6548\u7387\u8f83\u4f4e\u3002
    • \u5f53\u90bb\u63a5\u8868\u4e2d\u7684\u94fe\u8868\u8fc7\u957f\u65f6\uff0c\u53ef\u4ee5\u5c06\u5176\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6216\u54c8\u5e0c\u8868\uff0c\u4ece\u800c\u63d0\u5347\u67e5\u8be2\u6548\u7387\u3002
    • \u4ece\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u90bb\u63a5\u77e9\u9635\u4f53\u73b0\u4e86\u201c\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4\u201d\uff0c\u90bb\u63a5\u8868\u4f53\u73b0\u4e86\u201c\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4\u201d\u3002
    • \u56fe\u53ef\u7528\u4e8e\u5efa\u6a21\u5404\u7c7b\u73b0\u5b9e\u7cfb\u7edf\uff0c\u5982\u793e\u4ea4\u7f51\u7edc\u3001\u5730\u94c1\u7ebf\u8def\u7b49\u3002
    • \u6811\u662f\u56fe\u7684\u4e00\u79cd\u7279\u4f8b\uff0c\u6811\u7684\u904d\u5386\u4e5f\u662f\u56fe\u7684\u904d\u5386\u7684\u4e00\u79cd\u7279\u4f8b\u3002
    • \u56fe\u7684\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u7531\u8fd1\u53ca\u8fdc\u3001\u5c42\u5c42\u6269\u5f20\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u901a\u5e38\u501f\u52a9\u961f\u5217\u5b9e\u73b0\u3002
    • \u56fe\u7684\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u662f\u4e00\u79cd\u4f18\u5148\u8d70\u5230\u5e95\u3001\u65e0\u8def\u53ef\u8d70\u65f6\u518d\u56de\u6eaf\u7684\u641c\u7d22\u65b9\u5f0f\uff0c\u5e38\u57fa\u4e8e\u9012\u5f52\u6765\u5b9e\u73b0\u3002
    "},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u8def\u5f84\u7684\u5b9a\u4e49\u662f\u9876\u70b9\u5e8f\u5217\u8fd8\u662f\u8fb9\u5e8f\u5217\uff1f

    \u7ef4\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8bed\u8a00\u7248\u672c\u7684\u5b9a\u4e49\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u8fb9\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f84\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u201d\u3002\u4ee5\u4e0b\u662f\u82f1\u6587\u7248\u539f\u6587\uff1aIn graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

    \u5728\u672c\u6587\u4e2d\uff0c\u8def\u5f84\u88ab\u89c6\u4e3a\u4e00\u4e2a\u8fb9\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u4e2a\u9876\u70b9\u5e8f\u5217\u3002\u8fd9\u662f\u56e0\u4e3a\u4e24\u4e2a\u9876\u70b9\u4e4b\u95f4\u53ef\u80fd\u5b58\u5728\u591a\u6761\u8fb9\u8fde\u63a5\uff0c\u6b64\u65f6\u6bcf\u6761\u8fb9\u90fd\u5bf9\u5e94\u4e00\u6761\u8def\u5f84\u3002

    Q\uff1a\u975e\u8fde\u901a\u56fe\u4e2d\u662f\u5426\u4f1a\u6709\u65e0\u6cd5\u904d\u5386\u5230\u7684\u70b9\uff1f

    \u5728\u975e\u8fde\u901a\u56fe\u4e2d\uff0c\u4ece\u67d0\u4e2a\u9876\u70b9\u51fa\u53d1\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u9876\u70b9\u65e0\u6cd5\u5230\u8fbe\u3002\u904d\u5386\u975e\u8fde\u901a\u56fe\u9700\u8981\u8bbe\u7f6e\u591a\u4e2a\u8d77\u70b9\uff0c\u4ee5\u904d\u5386\u5230\u56fe\u7684\u6240\u6709\u8fde\u901a\u5206\u91cf\u3002

    Q\uff1a\u5728\u90bb\u63a5\u8868\u4e2d\uff0c\u201c\u4e0e\u8be5\u9876\u70b9\u76f8\u8fde\u7684\u6240\u6709\u9876\u70b9\u201d\u7684\u9876\u70b9\u987a\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

    \u53ef\u4ee5\u662f\u4efb\u610f\u987a\u5e8f\u3002\u4f46\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u89c4\u5219\u6765\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9876\u70b9\u6dfb\u52a0\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9876\u70b9\u503c\u5927\u5c0f\u7684\u987a\u5e8f\u7b49\uff0c\u8fd9\u6837\u6709\u52a9\u4e8e\u5feb\u901f\u67e5\u627e\u201c\u5e26\u6709\u67d0\u79cd\u6781\u503c\u201d\u7684\u9876\u70b9\u3002

    "},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8d2a\u5fc3","text":"

    Abstract

    \u5411\u65e5\u8475\u671d\u7740\u592a\u9633\u8f6c\u52a8\uff0c\u65f6\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u957f\u7684\u6700\u5927\u53ef\u80fd\u3002

    \u8d2a\u5fc3\u7b56\u7565\u5728\u4e00\u8f6e\u8f6e\u7684\u7b80\u5355\u9009\u62e9\u4e2d\uff0c\u9010\u6b65\u5bfc\u5411\u6700\u4f73\u7b54\u6848\u3002

    "},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5
    • 15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898
    • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898
    • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898
    • 15.5 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a \\(n\\) \u4e2a\u7269\u54c1\uff0c\u7b2c \\(i\\) \u4e2a\u7269\u54c1\u7684\u91cd\u91cf\u4e3a \\(wgt[i-1]\\)\u3001\u4ef7\u503c\u4e3a \\(val[i-1]\\) \uff0c\u548c\u4e00\u4e2a\u5bb9\u91cf\u4e3a \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u4e2a\u7269\u54c1\u53ea\u80fd\u9009\u62e9\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u4ef7\u503c\u6839\u636e\u9009\u62e9\u7684\u91cd\u91cf\u6bd4\u4f8b\u8ba1\u7b97\uff0c\u95ee\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u4ef7\u503c\u3002\u793a\u4f8b\u5982\u56fe 15-3 \u6240\u793a\u3002

    \u56fe 15-3 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    \u5206\u6570\u80cc\u5305\u95ee\u9898\u548c 0-1 \u80cc\u5305\u95ee\u9898\u6574\u4f53\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72b6\u6001\u5305\u542b\u5f53\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6807\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u4ef7\u503c\u3002

    \u4e0d\u540c\u70b9\u5728\u4e8e\uff0c\u672c\u9898\u5141\u8bb8\u53ea\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u56fe 15-4 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u7269\u54c1\u4efb\u610f\u5730\u8fdb\u884c\u5207\u5206\uff0c\u5e76\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u6765\u8ba1\u7b97\u76f8\u5e94\u4ef7\u503c\u3002

    1. \u5bf9\u4e8e\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c\u4e3a \\(val[i-1] / wgt[i-1]\\) \uff0c\u7b80\u79f0\u5355\u4f4d\u4ef7\u503c\u3002
    2. \u5047\u8bbe\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u4e3a \\(w\\) \uff0c\u5219\u80cc\u5305\u589e\u52a0\u7684\u4ef7\u503c\u4e3a \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

    \u56fe 15-4 \u00a0 \u7269\u54c1\u5728\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u4ef7\u503c

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

    \u6700\u5927\u5316\u80cc\u5305\u5185\u7269\u54c1\u603b\u4ef7\u503c\uff0c\u672c\u8d28\u4e0a\u662f\u6700\u5927\u5316\u5355\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u4ef7\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u56fe 15-5 \u6240\u793a\u7684\u8d2a\u5fc3\u7b56\u7565\u3002

    1. \u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\u3002
    2. \u904d\u5386\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f6e\u8d2a\u5fc3\u5730\u9009\u62e9\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
    3. \u82e5\u5269\u4f59\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u4f7f\u7528\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6ee1\u80cc\u5305\u3002

    \u56fe 15-5 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u6211\u4eec\u5efa\u7acb\u4e86\u4e00\u4e2a\u7269\u54c1\u7c7b Item \uff0c\u4ee5\u4fbf\u5c06\u7269\u54c1\u6309\u7167\u5355\u4f4d\u4ef7\u503c\u8fdb\u884c\u6392\u5e8f\u3002\u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u5f53\u80cc\u5305\u5df2\u6ee1\u65f6\u8df3\u51fa\u5e76\u8fd4\u56de\u89e3\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig fractional_knapsack.py
    class Item:\n    \"\"\"\u7269\u54c1\"\"\"\n\n    def __init__(self, w: int, v: int):\n        self.w = w  # \u7269\u54c1\u91cd\u91cf\n        self.v = v  # \u7269\u54c1\u4ef7\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n    return res\n
    fractional_knapsack.cpp
    /* \u7269\u54c1 */\nclass Item {\n  public:\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    vector<Item> items;\n    for (int i = 0; i < wgt.size(); i++) {\n        items.push_back(Item(wgt[i], val[i]));\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.java
    /* \u7269\u54c1 */\nclass Item {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.length];\n    for (int i = 0; i < wgt.length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.cs
    /* \u7269\u54c1 */\nclass Item(int w, int v) {\n    public int w = w; // \u7269\u54c1\u91cd\u91cf\n    public int v = v; // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item[] items = new Item[wgt.Length];\n    for (int i = 0; i < wgt.Length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.go
    /* \u7269\u54c1 */\ntype Item struct {\n    w int // \u7269\u54c1\u91cd\u91cf\n    v int // \u7269\u54c1\u4ef7\u503c\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    items := make([]Item, len(wgt))\n    for i := 0; i < len(wgt); i++ {\n        items[i] = Item{wgt[i], val[i]}\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    sort.Slice(items, func(i, j int) bool {\n        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)\n    })\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.swift
    /* \u7269\u54c1 */\nclass Item {\n    var w: Int // \u7269\u54c1\u91cd\u91cf\n    var v: Int // \u7269\u54c1\u4ef7\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.js
    /* \u7269\u54c1 */\nclass Item {\n    constructor(w, v) {\n        this.w = w; // \u7269\u54c1\u91cd\u91cf\n        this.v = v; // \u7269\u54c1\u4ef7\u503c\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.ts
    /* \u7269\u54c1 */\nclass Item {\n    w: number; // \u7269\u54c1\u91cd\u91cf\n    v: number; // \u7269\u54c1\u4ef7\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.dart
    /* \u7269\u54c1 */\nclass Item {\n  int w; // \u7269\u54c1\u91cd\u91cf\n  int v; // \u7269\u54c1\u4ef7\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n      break;\n    }\n  }\n  return res;\n}\n
    fractional_knapsack.rs
    /* \u7269\u54c1 */\nstruct Item {\n    w: i32, // \u7269\u54c1\u91cd\u91cf\n    v: i32, // \u7269\u54c1\u4ef7\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    let mut items = wgt\n        .iter()\n        .zip(val.iter())\n        .map(|(&w, &v)| Item::new(w, v))\n        .collect::<Vec<Item>>();\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sort_by(|a, b| {\n        (b.v as f64 / b.w as f64)\n            .partial_cmp(&(a.v as f64 / a.w as f64))\n            .unwrap()\n    });\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    res\n}\n
    fractional_knapsack.c
    /* \u7269\u54c1 */\ntypedef struct {\n    int w; // \u7269\u54c1\u91cd\u91cf\n    int v; // \u7269\u54c1\u4ef7\u503c\n} Item;\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    Item *items = malloc(sizeof(Item) * itemCount);\n    for (int i = 0; i < itemCount; i++) {\n        items[i] = (Item){.w = wgt[i], .v = val[i]};\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += (float)cap / items[i].w * items[i].v;\n            cap = 0;\n            break;\n        }\n    }\n    free(items);\n    return res;\n}\n
    fractional_knapsack.kt
    /* \u7269\u54c1 */\nclass Item(\n    val w: Int, // \u7269\u54c1\n    val v: Int  // \u7269\u54c1\u4ef7\u503c\n)\n\n/* \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\u3001\u4ef7\u503c\n    var cap = c\n    val items = arrayOfNulls<Item>(wgt.size)\n    for (i in wgt.indices) {\n        items[i] = Item(wgt[i], _val[i])\n    }\n    // \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.rb
    ### \u7269\u54c1 ###\nclass Item\n  attr_accessor :w # \u7269\u54c1\u91cd\u91cf\n  attr_accessor :v # \u7269\u54c1\u4ef7\u503c\n\n  def initialize(w, v)\n    @w = w\n    @v = v\n  end\nend\n\n### \u5206\u6570\u80cc\u5305\uff1a\u8d2a\u5fc3 ###\ndef fractional_knapsack(wgt, val, cap)\n  # \u521b\u5efa\u7269\u54c1\u5217\u8868\uff0c\u5305\u542b\u4e24\u4e2a\u5c5e\u6027\uff1a\u91cd\u91cf\uff0c\u4ef7\u503c\n  items = wgt.each_with_index.map { |w, i| Item.new(w, val[i]) }\n  # \u6309\u7167\u5355\u4f4d\u4ef7\u503c item.v / item.w \u4ece\u9ad8\u5230\u4f4e\u8fdb\u884c\u6392\u5e8f\n  items.sort! { |a, b| (b.v.to_f / b.w) <=> (a.v.to_f / a.w) }\n  # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\n  res = 0\n  for item in items\n    if item.w <= cap\n      # \u82e5\u5269\u4f59\u5bb9\u91cf\u5145\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u6574\u4e2a\u88c5\u8fdb\u80cc\u5305\n      res += item.v\n      cap -= item.w\n    else\n      # \u82e5\u5269\u4f59\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5219\u5c06\u5f53\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88c5\u8fdb\u80cc\u5305\n      res += (item.v.to_f / item.w) * cap\n      # \u5df2\u65e0\u5269\u4f59\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u5faa\u73af\n      break\n    end\n  end\n  res\nend\n
    fractional_knapsack.zig
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u9700\u8981\u904d\u5386\u6574\u4e2a\u7269\u54c1\u5217\u8868\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u7269\u54c1\u6570\u91cf\u3002

    \u7531\u4e8e\u521d\u59cb\u5316\u4e86\u4e00\u4e2a Item \u5bf9\u8c61\u5217\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

    \u91c7\u7528\u53cd\u8bc1\u6cd5\u3002\u5047\u8bbe\u7269\u54c1 \\(x\\) \u662f\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u4ef7\u503c\u4e3a res \uff0c\u4f46\u8be5\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u73b0\u5728\u4ece\u80cc\u5305\u4e2d\u62ff\u51fa\u5355\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u5e76\u66ff\u6362\u4e3a\u5355\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u4e8e\u7269\u54c1 \\(x\\) \u7684\u5355\u4f4d\u4ef7\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u6362\u540e\u7684\u603b\u4ef7\u503c\u4e00\u5b9a\u5927\u4e8e res \u3002\u8fd9\u4e0e res \u662f\u6700\u4f18\u89e3\u77db\u76fe\uff0c\u8bf4\u660e\u6700\u4f18\u89e3\u4e2d\u5fc5\u987b\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u5bf9\u4e8e\u8be5\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u6784\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u603b\u800c\u8a00\u4e4b\uff0c\u5355\u4f4d\u4ef7\u503c\u66f4\u5927\u7684\u7269\u54c1\u603b\u662f\u66f4\u4f18\u9009\u62e9\uff0c\u8fd9\u8bf4\u660e\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    \u5982\u56fe 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c06\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u5355\u4f4d\u4ef7\u503c\u5206\u522b\u770b\u4f5c\u4e00\u5f20\u4e8c\u7ef4\u56fe\u8868\u7684\u6a2a\u8f74\u548c\u7eb5\u8f74\uff0c\u5219\u5206\u6570\u80cc\u5305\u95ee\u9898\u53ef\u8f6c\u5316\u4e3a\u201c\u6c42\u5728\u6709\u9650\u6a2a\u8f74\u533a\u95f4\u4e0b\u56f4\u6210\u7684\u6700\u5927\u9762\u79ef\u201d\u3002\u8fd9\u4e2a\u7c7b\u6bd4\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u4ece\u51e0\u4f55\u89d2\u5ea6\u7406\u89e3\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

    \u56fe 15-6 \u00a0 \u5206\u6570\u80cc\u5305\u95ee\u9898\u7684\u51e0\u4f55\u8868\u793a

    "},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5","text":"

    \u8d2a\u5fc3\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u7684\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u95ee\u9898\u7684\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\uff0c\u90fd\u9009\u62e9\u5f53\u524d\u770b\u8d77\u6765\u6700\u4f18\u7684\u9009\u62e9\uff0c\u5373\u8d2a\u5fc3\u5730\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002\u8d2a\u5fc3\u7b97\u6cd5\u7b80\u6d01\u4e14\u9ad8\u6548\uff0c\u5728\u8bb8\u591a\u5b9e\u9645\u95ee\u9898\u4e2d\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\u3002

    \u8d2a\u5fc3\u7b97\u6cd5\u548c\u52a8\u6001\u89c4\u5212\u90fd\u5e38\u7528\u4e8e\u89e3\u51b3\u4f18\u5316\u95ee\u9898\u3002\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u5904\uff0c\u6bd4\u5982\u90fd\u4f9d\u8d56\u6700\u4f18\u5b50\u7ed3\u6784\u6027\u8d28\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

    • \u52a8\u6001\u89c4\u5212\u4f1a\u6839\u636e\u4e4b\u524d\u9636\u6bb5\u7684\u6240\u6709\u51b3\u7b56\u6765\u8003\u8651\u5f53\u524d\u51b3\u7b56\uff0c\u5e76\u4f7f\u7528\u8fc7\u53bb\u5b50\u95ee\u9898\u7684\u89e3\u6765\u6784\u5efa\u5f53\u524d\u5b50\u95ee\u9898\u7684\u89e3\u3002
    • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4f1a\u8003\u8651\u8fc7\u53bb\u7684\u51b3\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u4e0d\u65ad\u7f29\u5c0f\u95ee\u9898\u8303\u56f4\uff0c\u76f4\u81f3\u95ee\u9898\u88ab\u89e3\u51b3\u3002

    \u6211\u4eec\u5148\u901a\u8fc7\u4f8b\u9898\u201c\u96f6\u94b1\u5151\u6362\u201d\u4e86\u89e3\u8d2a\u5fc3\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u8fd9\u9053\u9898\u5df2\u7ecf\u5728\u201c\u5b8c\u5168\u80cc\u5305\u95ee\u9898\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u76f8\u4fe1\u4f60\u5bf9\u5b83\u5e76\u4e0d\u964c\u751f\u3002

    Question

    \u7ed9\u5b9a \\(n\\) \u79cd\u786c\u5e01\uff0c\u7b2c \\(i\\) \u79cd\u786c\u5e01\u7684\u9762\u503c\u4e3a \\(coins[i - 1]\\) \uff0c\u76ee\u6807\u91d1\u989d\u4e3a \\(amt\\) \uff0c\u6bcf\u79cd\u786c\u5e01\u53ef\u4ee5\u91cd\u590d\u9009\u53d6\uff0c\u95ee\u80fd\u591f\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002\u5982\u679c\u65e0\u6cd5\u51d1\u51fa\u76ee\u6807\u91d1\u989d\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    \u672c\u9898\u91c7\u53d6\u7684\u8d2a\u5fc3\u7b56\u7565\u5982\u56fe 15-1 \u6240\u793a\u3002\u7ed9\u5b9a\u76ee\u6807\u91d1\u989d\uff0c\u6211\u4eec\u8d2a\u5fc3\u5730\u9009\u62e9\u4e0d\u5927\u4e8e\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e01\uff0c\u4e0d\u65ad\u5faa\u73af\u8be5\u6b65\u9aa4\uff0c\u76f4\u81f3\u51d1\u51fa\u76ee\u6807\u91d1\u989d\u4e3a\u6b62\u3002

    \u56fe 15-1 \u00a0 \u96f6\u94b1\u5151\u6362\u7684\u8d2a\u5fc3\u7b56\u7565

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
    def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
    coin_change_greedy.cpp
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.java
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.cs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.go
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
    coin_change_greedy.swift
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
    coin_change_greedy.js
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.ts
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8bbe coins \u6570\u7ec4\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.dart
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9009\u62e9 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.rs
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
    coin_change_greedy.c
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9009\u62e9 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.kt
    /* \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9009\u62e9 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5219\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
    coin_change_greedy.rb
    ### \u96f6\u94b1\u5151\u6362\uff1a\u8d2a\u5fc3 ###\ndef coin_change_greedy(coins, amt)\n  # \u5047\u8bbe coins \u5217\u8868\u6709\u5e8f\n  i = coins.length - 1\n  count = 0\n  # \u5faa\u73af\u8fdb\u884c\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u5230\u65e0\u5269\u4f59\u91d1\u989d\n  while amt > 0\n    # \u627e\u5230\u5c0f\u4e8e\u4e14\u6700\u63a5\u8fd1\u5269\u4f59\u91d1\u989d\u7684\u786c\u5e01\n    while i > 0 && coins[i] > amt\n      i -= 1\n    end\n    # \u9009\u62e9 coins[i]\n    amt -= coins[i]\n    count += 1\n  end\n  # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c \u5219\u8fd4\u56de -1\n  amt == 0 ? count : -1\nend\n
    coin_change_greedy.zig
    [class]{}-[func]{coinChangeGreedy}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4f60\u53ef\u80fd\u4f1a\u4e0d\u7531\u5730\u53d1\u51fa\u611f\u53f9\uff1aSo clean \uff01\u8d2a\u5fc3\u7b97\u6cd5\u4ec5\u7528\u7ea6\u5341\u884c\u4ee3\u7801\u5c31\u89e3\u51b3\u4e86\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u64cd\u4f5c\u76f4\u63a5\u3001\u5b9e\u73b0\u7b80\u5355\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u4ee3\u7801\u4e2d\uff0c\u8bb0\u786c\u5e01\u6700\u5c0f\u9762\u503c\u4e3a \\(\\min(coins)\\) \uff0c\u5219\u8d2a\u5fc3\u9009\u62e9\u6700\u591a\u5faa\u73af \\(amt / \\min(coins)\\) \u6b21\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(amt / \\min(coins))\\) \u3002\u8fd9\u6bd4\u52a8\u6001\u89c4\u5212\u89e3\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u4e2a\u6570\u91cf\u7ea7\u3002

    \u7136\u800c\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u9762\u503c\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5e76\u4e0d\u80fd\u627e\u5230\u6700\u4f18\u89e3\u3002\u56fe 15-2 \u7ed9\u51fa\u4e86\u4e24\u4e2a\u793a\u4f8b\u3002

    • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8be5\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u7ed9\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3\u3002
    • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8bbe \\(amt = 60\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(11\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(20 + 20 + 20\\) \uff0c\u4ec5\u9700 \\(3\\) \u679a\u786c\u5e01\u3002
    • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8bbe \\(amt = 98\\) \uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u5151\u6362\u7ec4\u5408\uff0c\u5171\u8ba1 \\(49\\) \u679a\u786c\u5e01\uff0c\u4f46\u52a8\u6001\u89c4\u5212\u53ef\u4ee5\u627e\u5230\u6700\u4f18\u89e3 \\(49 + 49\\) \uff0c\u4ec5\u9700 \\(2\\) \u679a\u786c\u5e01\u3002

    \u56fe 15-2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u627e\u51fa\u6700\u4f18\u89e3\u7684\u793a\u4f8b

    \u4e5f\u5c31\u662f\u8bf4\uff0c\u5bf9\u4e8e\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u65e0\u6cd5\u4fdd\u8bc1\u627e\u5230\u5168\u5c40\u6700\u4f18\u89e3\uff0c\u5e76\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9002\u5408\u7528\u52a8\u6001\u89c4\u5212\u89e3\u51b3\u3002

    \u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u9002\u7528\u60c5\u51b5\u5206\u4ee5\u4e0b\u4e24\u79cd\u3002

    1. \u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u5f80\u5f80\u662f\u6700\u4f18\u9009\u62e9\uff0c\u56e0\u4e3a\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u66f4\u9ad8\u6548\u3002
    2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u4f18\u89e3\uff1a\u8d2a\u5fc3\u7b97\u6cd5\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5bf9\u4e8e\u5f88\u591a\u590d\u6742\u95ee\u9898\u6765\u8bf4\uff0c\u5bfb\u627e\u5168\u5c40\u6700\u4f18\u89e3\u975e\u5e38\u56f0\u96be\uff0c\u80fd\u4ee5\u8f83\u9ad8\u6548\u7387\u627e\u5230\u6b21\u4f18\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u9519\u7684\u3002
    "},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u7279\u6027","text":"

    \u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff0c\u4ec0\u4e48\u6837\u7684\u95ee\u9898\u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8bf4\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1f

    \u76f8\u8f83\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u4f7f\u7528\u6761\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u5173\u6ce8\u95ee\u9898\u7684\u4e24\u4e2a\u6027\u8d28\u3002

    • \u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\uff1a\u53ea\u6709\u5f53\u5c40\u90e8\u6700\u4f18\u9009\u62e9\u59cb\u7ec8\u53ef\u4ee5\u5bfc\u81f4\u5168\u5c40\u6700\u4f18\u89e3\u65f6\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u624d\u80fd\u4fdd\u8bc1\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u6700\u4f18\u5b50\u7ed3\u6784\uff1a\u539f\u95ee\u9898\u7684\u6700\u4f18\u89e3\u5305\u542b\u5b50\u95ee\u9898\u7684\u6700\u4f18\u89e3\u3002

    \u6700\u4f18\u5b50\u7ed3\u6784\u5df2\u7ecf\u5728\u201c\u52a8\u6001\u89c4\u5212\u201d\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u95ee\u9898\u7684\u6700\u4f18\u5b50\u7ed3\u6784\u5e76\u4e0d\u660e\u663e\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u89e3\u51b3\u3002

    \u6211\u4eec\u4e3b\u8981\u63a2\u7a76\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u5224\u65ad\u65b9\u6cd5\u3002\u867d\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f83\u7b80\u5355\uff0c\u4f46\u5b9e\u9645\u4e0a\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\uff0c\u8bc1\u660e\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u5e76\u975e\u6613\u4e8b\u3002

    \u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\uff0c\u6211\u4eec\u867d\u7136\u80fd\u591f\u5bb9\u6613\u5730\u4e3e\u51fa\u53cd\u4f8b\uff0c\u5bf9\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u8fdb\u884c\u8bc1\u4f2a\uff0c\u4f46\u8bc1\u5b9e\u7684\u96be\u5ea6\u8f83\u5927\u3002\u5982\u679c\u95ee\uff1a\u6ee1\u8db3\u4ec0\u4e48\u6761\u4ef6\u7684\u786c\u5e01\u7ec4\u5408\u53ef\u4ee5\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u4eec\u5f80\u5f80\u53ea\u80fd\u51ed\u501f\u76f4\u89c9\u6216\u4e3e\u4f8b\u5b50\u6765\u7ed9\u51fa\u4e00\u4e2a\u6a21\u68f1\u4e24\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96be\u4ee5\u7ed9\u51fa\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\u3002

    Quote

    \u6709\u4e00\u7bc7\u8bba\u6587\u7ed9\u51fa\u4e86\u4e00\u4e2a \\(O(n^3)\\) \u65f6\u95f4\u590d\u6742\u5ea6\u7684\u7b97\u6cd5\uff0c\u7528\u4e8e\u5224\u65ad\u4e00\u4e2a\u786c\u5e01\u7ec4\u5408\u80fd\u5426\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u989d\u7684\u6700\u4f18\u89e3\u3002

    Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

    "},{"location":"chapter_greedy/greedy_algorithm/#1513","title":"15.1.3 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u89e3\u9898\u6b65\u9aa4","text":"

    \u8d2a\u5fc3\u95ee\u9898\u7684\u89e3\u51b3\u6d41\u7a0b\u5927\u4f53\u53ef\u5206\u4e3a\u4ee5\u4e0b\u4e09\u6b65\u3002

    1. \u95ee\u9898\u5206\u6790\uff1a\u68b3\u7406\u4e0e\u7406\u89e3\u95ee\u9898\u7279\u6027\uff0c\u5305\u62ec\u72b6\u6001\u5b9a\u4e49\u3001\u4f18\u5316\u76ee\u6807\u548c\u7ea6\u675f\u6761\u4ef6\u7b49\u3002\u8fd9\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52a8\u6001\u89c4\u5212\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
    2. \u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\uff1a\u786e\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8d2a\u5fc3\u9009\u62e9\u3002\u8fd9\u4e2a\u7b56\u7565\u80fd\u591f\u5728\u6bcf\u4e00\u6b65\u51cf\u5c0f\u95ee\u9898\u7684\u89c4\u6a21\uff0c\u5e76\u6700\u7ec8\u89e3\u51b3\u6574\u4e2a\u95ee\u9898\u3002
    3. \u6b63\u786e\u6027\u8bc1\u660e\uff1a\u901a\u5e38\u9700\u8981\u8bc1\u660e\u95ee\u9898\u5177\u6709\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8fd9\u4e2a\u6b65\u9aa4\u53ef\u80fd\u9700\u8981\u7528\u5230\u6570\u5b66\u8bc1\u660e\uff0c\u4f8b\u5982\u5f52\u7eb3\u6cd5\u6216\u53cd\u8bc1\u6cd5\u7b49\u3002

    \u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6c42\u89e3\u95ee\u9898\u7684\u6838\u5fc3\u6b65\u9aa4\uff0c\u4f46\u5b9e\u65bd\u8d77\u6765\u53ef\u80fd\u5e76\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e0d\u540c\u95ee\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\u7684\u5dee\u5f02\u8f83\u5927\u3002\u5bf9\u4e8e\u8bb8\u591a\u95ee\u9898\u6765\u8bf4\uff0c\u8d2a\u5fc3\u7b56\u7565\u6bd4\u8f83\u6d45\u663e\uff0c\u6211\u4eec\u901a\u8fc7\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u4e0e\u5c1d\u8bd5\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5bf9\u4e8e\u4e00\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u9690\u853d\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u975e\u5e38\u8003\u9a8c\u4e2a\u4eba\u7684\u89e3\u9898\u7ecf\u9a8c\u4e0e\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
    • \u67d0\u4e9b\u8d2a\u5fc3\u7b56\u7565\u5177\u6709\u8f83\u5f3a\u7684\u8ff7\u60d1\u6027\u3002\u5f53\u6211\u4eec\u6ee1\u6000\u4fe1\u5fc3\u8bbe\u8ba1\u597d\u8d2a\u5fc3\u7b56\u7565\uff0c\u5199\u51fa\u89e3\u9898\u4ee3\u7801\u5e76\u63d0\u4ea4\u8fd0\u884c\uff0c\u5f88\u53ef\u80fd\u53d1\u73b0\u90e8\u5206\u6d4b\u8bd5\u6837\u4f8b\u65e0\u6cd5\u901a\u8fc7\u3002\u8fd9\u662f\u56e0\u4e3a\u8bbe\u8ba1\u7684\u8d2a\u5fc3\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u786e\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7ecd\u7684\u96f6\u94b1\u5151\u6362\u5c31\u662f\u4e00\u4e2a\u5178\u578b\u6848\u4f8b\u3002

    \u4e3a\u4e86\u4fdd\u8bc1\u6b63\u786e\u6027\uff0c\u6211\u4eec\u5e94\u8be5\u5bf9\u8d2a\u5fc3\u7b56\u7565\u8fdb\u884c\u4e25\u8c28\u7684\u6570\u5b66\u8bc1\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8bc1\u6cd5\u6216\u6570\u5b66\u5f52\u7eb3\u6cd5\u3002

    \u7136\u800c\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6ca1\u6709\u5934\u7eea\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u9009\u62e9\u9762\u5411\u6d4b\u8bd5\u7528\u4f8b\u8fdb\u884c\u4ee3\u7801\u8c03\u8bd5\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u4e0e\u9a8c\u8bc1\u8d2a\u5fc3\u7b56\u7565\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8d2a\u5fc3\u7b97\u6cd5\u5178\u578b\u4f8b\u9898","text":"

    \u8d2a\u5fc3\u7b97\u6cd5\u5e38\u5e38\u5e94\u7528\u5728\u6ee1\u8db3\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u7684\u4f18\u5316\u95ee\u9898\u4e2d\uff0c\u4ee5\u4e0b\u5217\u4e3e\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8d2a\u5fc3\u7b97\u6cd5\u95ee\u9898\u3002

    • \u786c\u5e01\u627e\u96f6\u95ee\u9898\uff1a\u5728\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\u4e0b\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u603b\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u533a\u95f4\u8c03\u5ea6\u95ee\u9898\uff1a\u5047\u8bbe\u4f60\u6709\u4e00\u4e9b\u4efb\u52a1\uff0c\u6bcf\u4e2a\u4efb\u52a1\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u8fdb\u884c\uff0c\u4f60\u7684\u76ee\u6807\u662f\u5b8c\u6210\u5c3d\u53ef\u80fd\u591a\u7684\u4efb\u52a1\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u7ed3\u675f\u65f6\u95f4\u6700\u65e9\u7684\u4efb\u52a1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u5206\u6570\u80cc\u5305\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u7269\u54c1\u548c\u4e00\u4e2a\u8f7d\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6807\u662f\u9009\u62e9\u4e00\u7ec4\u7269\u54c1\uff0c\u4f7f\u5f97\u603b\u91cd\u91cf\u4e0d\u8d85\u8fc7\u8f7d\u91cd\u91cf\uff0c\u4e14\u603b\u4ef7\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9009\u62e9\u6027\u4ef7\u6bd4\u6700\u9ad8\uff08\u4ef7\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u4e48\u8d2a\u5fc3\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u4f18\u89e3\u3002
    • \u80a1\u7968\u4e70\u5356\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u80a1\u7968\u7684\u5386\u53f2\u4ef7\u683c\uff0c\u4f60\u53ef\u4ee5\u8fdb\u884c\u591a\u6b21\u4e70\u5356\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7ecf\u6301\u6709\u80a1\u7968\uff0c\u90a3\u4e48\u5728\u5356\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u4e70\uff0c\u76ee\u6807\u662f\u83b7\u53d6\u6700\u5927\u5229\u6da6\u3002
    • \u970d\u592b\u66fc\u7f16\u7801\uff1a\u970d\u592b\u66fc\u7f16\u7801\u662f\u4e00\u79cd\u7528\u4e8e\u65e0\u635f\u6570\u636e\u538b\u7f29\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002\u901a\u8fc7\u6784\u5efa\u970d\u592b\u66fc\u6811\uff0c\u6bcf\u6b21\u9009\u62e9\u51fa\u73b0\u9891\u7387\u6700\u4f4e\u7684\u4e24\u4e2a\u8282\u70b9\u5408\u5e76\uff0c\u6700\u540e\u5f97\u5230\u7684\u970d\u592b\u66fc\u6811\u7684\u5e26\u6743\u8def\u5f84\u957f\u5ea6\uff08\u7f16\u7801\u957f\u5ea6\uff09\u6700\u5c0f\u3002
    • Dijkstra \u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u79cd\u89e3\u51b3\u7ed9\u5b9a\u6e90\u9876\u70b9\u5230\u5176\u4f59\u5404\u9876\u70b9\u7684\u6700\u77ed\u8def\u5f84\u95ee\u9898\u7684\u8d2a\u5fc3\u7b97\u6cd5\u3002
    "},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898","text":"

    Question

    \u8f93\u5165\u4e00\u4e2a\u6570\u7ec4 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u4ee3\u8868\u4e00\u4e2a\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u4eec\u4e4b\u95f4\u7684\u7a7a\u95f4\u53ef\u4ee5\u7ec4\u6210\u4e00\u4e2a\u5bb9\u5668\u3002

    \u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u548c\u5bbd\u5ea6\u7684\u4e58\u79ef\uff08\u9762\u79ef\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f83\u77ed\u7684\u9694\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u4e2a\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002

    \u8bf7\u5728\u6570\u7ec4\u4e2d\u9009\u62e9\u4e24\u4e2a\u9694\u677f\uff0c\u4f7f\u5f97\u7ec4\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u56fe 15-7 \u6240\u793a\u3002

    \u56fe 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u793a\u4f8b\u6570\u636e

    \u5bb9\u5668\u7531\u4efb\u610f\u4e24\u4e2a\u9694\u677f\u56f4\u6210\uff0c\u56e0\u6b64\u672c\u9898\u7684\u72b6\u6001\u4e3a\u4e24\u4e2a\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\([i, j]\\) \u3002

    \u6839\u636e\u9898\u610f\uff0c\u5bb9\u91cf\u7b49\u4e8e\u9ad8\u5ea6\u4e58\u4ee5\u5bbd\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u5bbd\u5ea6\u662f\u4e24\u9694\u677f\u7684\u6570\u7ec4\u7d22\u5f15\u4e4b\u5dee\u3002\u8bbe\u5bb9\u91cf\u4e3a \\(cap[i, j]\\) \uff0c\u5219\u53ef\u5f97\u8ba1\u7b97\u516c\u5f0f\uff1a

    \\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

    \u8bbe\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u4e24\u4e2a\u9694\u677f\u7684\u7ec4\u5408\u6570\u91cf\uff08\u72b6\u6001\u603b\u6570\uff09\u4e3a \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u4e2a\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u7a77\u4e3e\u6240\u6709\u72b6\u6001\uff0c\u4ece\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

    \u8fd9\u9053\u9898\u8fd8\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u56fe 15-8 \u6240\u793a\uff0c\u73b0\u9009\u53d6\u4e00\u4e2a\u72b6\u6001 \\([i, j]\\) \uff0c\u5176\u6ee1\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002

    \u56fe 15-8 \u00a0 \u521d\u59cb\u72b6\u6001

    \u5982\u56fe 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u65f6\u5c06\u957f\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5219\u5bb9\u91cf\u4e00\u5b9a\u53d8\u5c0f\u3002

    \u8fd9\u662f\u56e0\u4e3a\u5728\u79fb\u52a8\u957f\u677f \\(j\\) \u540e\uff0c\u5bbd\u5ea6 \\(j-i\\) \u80af\u5b9a\u53d8\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u51b3\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u53d8\uff08 \\(i\\) \u4ecd\u4e3a\u77ed\u677f\uff09\u6216\u53d8\u5c0f\uff08\u79fb\u52a8\u540e\u7684 \\(j\\) \u6210\u4e3a\u77ed\u677f\uff09\u3002

    \u56fe 15-9 \u00a0 \u5411\u5185\u79fb\u52a8\u957f\u677f\u540e\u7684\u72b6\u6001

    \u53cd\u5411\u601d\u8003\uff0c\u6211\u4eec\u53ea\u6709\u5411\u5185\u6536\u7f29\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u53d8\u5927\u3002\u56e0\u4e3a\u867d\u7136\u5bbd\u5ea6\u4e00\u5b9a\u53d8\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u4f1a\u53d8\u5927\uff08\u79fb\u52a8\u540e\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u4f1a\u53d8\u957f\uff09\u3002\u4f8b\u5982\u5728\u56fe 15-10 \u4e2d\uff0c\u79fb\u52a8\u77ed\u677f\u540e\u9762\u79ef\u53d8\u5927\u3002

    \u56fe 15-10 \u00a0 \u5411\u5185\u79fb\u52a8\u77ed\u677f\u540e\u7684\u72b6\u6001

    \u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u9898\u7684\u8d2a\u5fc3\u7b56\u7565\uff1a\u521d\u59cb\u5316\u4e24\u6307\u9488\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u4e24\u7aef\uff0c\u6bcf\u8f6e\u5411\u5185\u6536\u7f29\u77ed\u677f\u5bf9\u5e94\u7684\u6307\u9488\uff0c\u76f4\u81f3\u4e24\u6307\u9488\u76f8\u9047\u3002

    \u56fe 15-11 \u5c55\u793a\u4e86\u8d2a\u5fc3\u7b56\u7565\u7684\u6267\u884c\u8fc7\u7a0b\u3002

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u5217\u6570\u7ec4\u4e24\u7aef\u3002
    2. \u8ba1\u7b97\u5f53\u524d\u72b6\u6001\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u5e76\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
    3. \u6bd4\u8f83\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u5e76\u5c06\u77ed\u677f\u5411\u5185\u79fb\u52a8\u4e00\u683c\u3002
    4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u65f6\u7ed3\u675f\u3002
    <1><2><3><4><5><6><7><8><9>

    \u56fe 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u7684\u8d2a\u5fc3\u8fc7\u7a0b

    "},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u4ee3\u7801\u5faa\u73af\u6700\u591a \\(n\\) \u8f6e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002

    \u53d8\u91cf \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
    def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res = 0\n    # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j:\n        # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        # \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j]:\n            i += 1\n        else:\n            j -= 1\n    return res\n
    max_capacity.cpp
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = min(ht[i], ht[j]) * (j - i);\n        res = max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.java
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.cs
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int cap = Math.Min(ht[i], ht[j]) * (j - i);\n        res = Math.Max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.go
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    res := 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    for i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)\n        res = int(math.Max(float64(res), float64(capacity)))\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.swift
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1\n        } else {\n            j -= 1\n        }\n    }\n    return res\n}\n
    max_capacity.js
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
    max_capacity.ts
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        const cap: number = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
    max_capacity.dart
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n  int res = 0;\n  // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n  while (i < j) {\n    // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    int cap = min(ht[i], ht[j]) * (j - i);\n    res = max(res, cap);\n    // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n    if (ht[i] < ht[j]) {\n      i++;\n    } else {\n      j--;\n    }\n  }\n  return res;\n}\n
    max_capacity.rs
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    let mut res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while i < j {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;\n        res = std::cmp::max(res, cap);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if ht[i] < ht[j] {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    res\n}\n
    max_capacity.c
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    int res = 0;\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        int capacity = myMin(ht[i], ht[j]) * (j - i);\n        res = myMax(res, capacity);\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.kt
    /* \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n    var res = 0\n    // \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n    while (i < j) {\n        // \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n        val cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u5411\u5185\u79fb\u52a8\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.rb
    ### \u6700\u5927\u5bb9\u91cf\uff1a\u8d2a\u5fc3 ###\ndef max_capacity(ht)\n  # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u6570\u7ec4\u4e24\u7aef\n  i, j = 0, ht.length - 1\n  # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u4e3a 0\n  res = 0\n\n  # \u5faa\u73af\u8d2a\u5fc3\u9009\u62e9\uff0c\u76f4\u81f3\u4e24\u677f\u76f8\u9047\n  while i < j\n    # \u66f4\u65b0\u6700\u5927\u5bb9\u91cf\n    cap = [ht[i], ht[j]].min * (j - i)\n    res = [res, cap].max\n    # \u5411\u5185\u79fb\u52a8\u77ed\u677f\n    if ht[i] < ht[j]\n      i += 1\n    else\n      j -= 1\n    end\n  end\n\n  res\nend\n
    max_capacity.zig
    [class]{}-[func]{maxCapacity}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

    \u4e4b\u6240\u4ee5\u8d2a\u5fc3\u6bd4\u7a77\u4e3e\u66f4\u5feb\uff0c\u662f\u56e0\u4e3a\u6bcf\u8f6e\u7684\u8d2a\u5fc3\u9009\u62e9\u90fd\u4f1a\u201c\u8df3\u8fc7\u201d\u4e00\u4e9b\u72b6\u6001\u3002

    \u6bd4\u5982\u5728\u72b6\u6001 \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u4e3a\u77ed\u677f\u3001\\(j\\) \u4e3a\u957f\u677f\u3002\u82e5\u8d2a\u5fc3\u5730\u5c06\u77ed\u677f \\(i\\) \u5411\u5185\u79fb\u52a8\u4e00\u683c\uff0c\u4f1a\u5bfc\u81f4\u56fe 15-12 \u6240\u793a\u7684\u72b6\u6001\u88ab\u201c\u8df3\u8fc7\u201d\u3002\u8fd9\u610f\u5473\u7740\u4e4b\u540e\u65e0\u6cd5\u9a8c\u8bc1\u8fd9\u4e9b\u72b6\u6001\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

    \\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

    \u56fe 15-12 \u00a0 \u79fb\u52a8\u77ed\u677f\u5bfc\u81f4\u88ab\u8df3\u8fc7\u7684\u72b6\u6001

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u8fd9\u4e9b\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u5b9e\u9645\u4e0a\u5c31\u662f\u5c06\u957f\u677f \\(j\\) \u5411\u5185\u79fb\u52a8\u7684\u6240\u6709\u72b6\u6001\u3002\u524d\u9762\u6211\u4eec\u5df2\u7ecf\u8bc1\u660e\u5185\u79fb\u957f\u677f\u4e00\u5b9a\u4f1a\u5bfc\u81f4\u5bb9\u91cf\u53d8\u5c0f\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u88ab\u8df3\u8fc7\u7684\u72b6\u6001\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u4f18\u89e3\uff0c\u8df3\u8fc7\u5b83\u4eec\u4e0d\u4f1a\u5bfc\u81f4\u9519\u8fc7\u6700\u4f18\u89e3\u3002

    \u4ee5\u4e0a\u5206\u6790\u8bf4\u660e\uff0c\u79fb\u52a8\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8d2a\u5fc3\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570 \\(n\\) \uff0c\u5c06\u5176\u5207\u5206\u4e3a\u81f3\u5c11\u4e24\u4e2a\u6b63\u6574\u6570\u7684\u548c\uff0c\u6c42\u5207\u5206\u540e\u6240\u6709\u6574\u6570\u7684\u4e58\u79ef\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u56fe 15-13 \u6240\u793a\u3002

    \u56fe 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u95ee\u9898\u5b9a\u4e49

    \u5047\u8bbe\u6211\u4eec\u5c06 \\(n\\) \u5207\u5206\u4e3a \\(m\\) \u4e2a\u6574\u6570\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u4e2a\u56e0\u5b50\u8bb0\u4e3a \\(n_i\\) \uff0c\u5373

    \\[ n = \\sum_{i=1}^{m}n_i \\]

    \u672c\u9898\u7684\u76ee\u6807\u662f\u6c42\u5f97\u6240\u6709\u6574\u6570\u56e0\u5b50\u7684\u6700\u5927\u4e58\u79ef\uff0c\u5373

    \\[ \\max(\\prod_{i=1}^{m}n_i) \\]

    \u6211\u4eec\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6570\u91cf \\(m\\) \u5e94\u8be5\u591a\u5927\uff0c\u6bcf\u4e2a \\(n_i\\) \u5e94\u8be5\u662f\u591a\u5c11\uff1f

    "},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8d2a\u5fc3\u7b56\u7565\u786e\u5b9a","text":"

    \u6839\u636e\u7ecf\u9a8c\uff0c\u4e24\u4e2a\u6574\u6570\u7684\u4e58\u79ef\u5f80\u5f80\u6bd4\u5b83\u4eec\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8bbe\u4ece \\(n\\) \u4e2d\u5206\u51fa\u4e00\u4e2a\u56e0\u5b50 \\(2\\) \uff0c\u5219\u5b83\u4eec\u7684\u4e58\u79ef\u4e3a \\(2(n-2)\\) \u3002\u6211\u4eec\u5c06\u8be5\u4e58\u79ef\u4e0e \\(n\\) \u4f5c\u6bd4\u8f83\uff1a

    \\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

    \u5982\u56fe 15-14 \u6240\u793a\uff0c\u5f53 \\(n \\geq 4\\) \u65f6\uff0c\u5207\u5206\u51fa\u4e00\u4e2a \\(2\\) \u540e\u4e58\u79ef\u4f1a\u53d8\u5927\uff0c\u8fd9\u8bf4\u660e\u5927\u4e8e\u7b49\u4e8e \\(4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u88ab\u5207\u5206\u3002

    \u8d2a\u5fc3\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u4e48\u5b83\u5c31\u5e94\u8be5\u88ab\u7ee7\u7eed\u5207\u5206\u3002\u6700\u7ec8\u7684\u5207\u5206\u65b9\u6848\u53ea\u5e94\u51fa\u73b0 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u79cd\u56e0\u5b50\u3002

    \u56fe 15-14 \u00a0 \u5207\u5206\u5bfc\u81f4\u4e58\u79ef\u53d8\u5927

    \u63a5\u4e0b\u6765\u601d\u8003\u54ea\u4e2a\u56e0\u5b50\u662f\u6700\u4f18\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u8fd9\u4e09\u4e2a\u56e0\u5b50\u4e2d\uff0c\u663e\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u4e3a \\(1 \\times (n-1) < n\\) \u6052\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u4f1a\u5bfc\u81f4\u4e58\u79ef\u51cf\u5c0f\u3002

    \u5982\u56fe 15-15 \u6240\u793a\uff0c\u5f53 \\(n = 6\\) \u65f6\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u8fd9\u610f\u5473\u7740\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u4f18\u3002

    \u8d2a\u5fc3\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u53ea\u5e94\u5b58\u5728\u4e24\u4e2a \\(2\\) \u3002\u56e0\u4e3a\u4e09\u4e2a \\(2\\) \u603b\u662f\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002

    \u56fe 15-15 \u00a0 \u6700\u4f18\u5207\u5206\u56e0\u5b50

    \u7efc\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8d2a\u5fc3\u7b56\u7565\u3002

    1. \u8f93\u5165\u6574\u6570 \\(n\\) \uff0c\u4ece\u5176\u4e0d\u65ad\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u4f59\u6570\u4e3a \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
    2. \u5f53\u4f59\u6570\u4e3a \\(0\\) \u65f6\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6570\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u5904\u7406\u3002
    3. \u5f53\u4f59\u6570\u4e3a \\(2\\) \u65f6\uff0c\u4e0d\u7ee7\u7eed\u5212\u5206\uff0c\u4fdd\u7559\u3002
    4. \u5f53\u4f59\u6570\u4e3a \\(1\\) \u65f6\uff0c\u7531\u4e8e \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u5e94\u5c06\u6700\u540e\u4e00\u4e2a \\(3\\) \u66ff\u6362\u4e3a \\(2\\) \u3002
    "},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5982\u56fe 15-16 \u6240\u793a\uff0c\u6211\u4eec\u65e0\u987b\u901a\u8fc7\u5faa\u73af\u6765\u5207\u5206\u6574\u6570\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u8fd0\u7b97\u5f97\u5230 \\(3\\) \u7684\u4e2a\u6570 \\(a\\) \uff0c\u7528\u53d6\u6a21\u8fd0\u7b97\u5f97\u5230\u4f59\u6570 \\(b\\) \uff0c\u6b64\u65f6\u6709\uff1a

    \\[ n = 3 a + b \\]

    \u8bf7\u6ce8\u610f\uff0c\u5bf9\u4e8e \\(n \\leq 3\\) \u7684\u8fb9\u754c\u60c5\u51b5\uff0c\u5fc5\u987b\u62c6\u5206\u51fa\u4e00\u4e2a \\(1\\) \uff0c\u4e58\u79ef\u4e3a \\(1 \\times (n - 1)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_product_cutting.py
    def max_product_cutting(n: int) -> int:\n    \"\"\"\u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3\"\"\"\n    # \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.pow(3, a)) * 2\n    # \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.pow(3, a))\n
    max_product_cutting.cpp
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)pow(3, a);\n}\n
    max_product_cutting.java
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int) Math.pow(3, a);\n}\n
    max_product_cutting.cs
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint MaxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (int)Math.Pow(3, a);\n}\n
    max_product_cutting.go
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n int) int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
    max_product_cutting.swift
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a)\n}\n
    max_product_cutting.js
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.ts
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfunction maxProductCutting(n: number): number {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.dart
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n  // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  return pow(3, a).toInt();\n}\n
    max_product_cutting.rs
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
    max_product_cutting.c
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nint maxProductCutting(int n) {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return pow(3, a) * 2;\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return pow(3, a);\n}\n
    max_product_cutting.kt
    /* \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 */\nfun maxProductCutting(n: Int): Int {\n    // \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n    return 3.0.pow(a).toInt()\n}\n
    max_product_cutting.rb
    ### \u6700\u5927\u5207\u5206\u4e58\u79ef\uff1a\u8d2a\u5fc3 ###\ndef max_product_cutting(n)\n  # \u5f53 n <= 3 \u65f6\uff0c\u5fc5\u987b\u5207\u5206\u51fa\u4e00\u4e2a 1\n  return 1 * (n - 1) if n <= 3\n  # \u8d2a\u5fc3\u5730\u5207\u5206\u51fa 3 \uff0ca \u4e3a 3 \u7684\u4e2a\u6570\uff0cb \u4e3a\u4f59\u6570\n  a, b = n / 3, n % 3\n  # \u5f53\u4f59\u6570\u4e3a 1 \u65f6\uff0c\u5c06\u4e00\u5bf9 1 * 3 \u8f6c\u5316\u4e3a 2 * 2\n  return (3.pow(a - 1) * 2 * 2).to_i if b == 1\n  # \u5f53\u4f59\u6570\u4e3a 2 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  return (3.pow(a) * 2).to_i if b == 2\n  # \u5f53\u4f59\u6570\u4e3a 0 \u65f6\uff0c\u4e0d\u505a\u5904\u7406\n  3.pow(a).to_i\nend\n
    max_product_cutting.zig
    [class]{}-[func]{maxProductCutting}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u56fe 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u79ef\u7684\u8ba1\u7b97\u65b9\u6cd5

    \u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u5e42\u8fd0\u7b97\u7684\u5b9e\u73b0\u65b9\u6cd5\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u5e38\u7528\u7684\u5e42\u8ba1\u7b97\u51fd\u6570\u6709\u4e09\u79cd\u3002

    • \u8fd0\u7b97\u7b26 ** \u548c\u51fd\u6570 pow() \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log\u2061 a)\\) \u3002
    • \u51fd\u6570 math.pow() \u5185\u90e8\u8c03\u7528 C \u8bed\u8a00\u5e93\u7684 pow() \u51fd\u6570\uff0c\u5176\u6267\u884c\u6d6e\u70b9\u53d6\u5e42\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    \u53d8\u91cf \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u786e\u6027\u8bc1\u660e","text":"

    \u4f7f\u7528\u53cd\u8bc1\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u51b5\u3002

    1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u5c06\u5176\u7ee7\u7eed\u5212\u5206\u4e3a \\(2(x-2)\\) \uff0c\u4ece\u800c\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
    2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u4e2a\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u4e48\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u5e76\u5165\u53e6\u5916\u4e00\u4e2a\u56e0\u5b50\u4e2d\uff0c\u4ee5\u83b7\u5f97\u66f4\u5927\u7684\u4e58\u79ef\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
    3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u4e24\u4e2a \\(2\\) \uff1a\u5047\u8bbe\u6700\u4f18\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u4e2a \\(2\\) \uff0c\u90a3\u4e48\u4e00\u5b9a\u53ef\u4ee5\u66ff\u6362\u4e3a\u4e24\u4e2a \\(3\\) \uff0c\u4e58\u79ef\u66f4\u5927\u3002\u8fd9\u4e0e\u5047\u8bbe\u77db\u76fe\u3002
    "},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7ed3","text":"
    • \u8d2a\u5fc3\u7b97\u6cd5\u901a\u5e38\u7528\u4e8e\u89e3\u51b3\u6700\u4f18\u5316\u95ee\u9898\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u4e2a\u51b3\u7b56\u9636\u6bb5\u90fd\u505a\u51fa\u5c40\u90e8\u6700\u4f18\u7684\u51b3\u7b56\uff0c\u4ee5\u671f\u83b7\u5f97\u5168\u5c40\u6700\u4f18\u89e3\u3002
    • \u8d2a\u5fc3\u7b97\u6cd5\u4f1a\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u4e2a\u53c8\u4e00\u4e2a\u7684\u8d2a\u5fc3\u9009\u62e9\uff0c\u6bcf\u8f6e\u90fd\u5c06\u95ee\u9898\u8f6c\u5316\u6210\u4e00\u4e2a\u89c4\u6a21\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u76f4\u5230\u95ee\u9898\u88ab\u89e3\u51b3\u3002
    • \u8d2a\u5fc3\u7b97\u6cd5\u4e0d\u4ec5\u5b9e\u73b0\u7b80\u5355\uff0c\u8fd8\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u9898\u6548\u7387\u3002\u76f8\u6bd4\u4e8e\u52a8\u6001\u89c4\u5212\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
    • \u5728\u96f6\u94b1\u5151\u6362\u95ee\u9898\u4e2d\uff0c\u5bf9\u4e8e\u67d0\u4e9b\u786c\u5e01\u7ec4\u5408\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8bc1\u627e\u5230\u6700\u4f18\u89e3\uff1b\u5bf9\u4e8e\u53e6\u5916\u4e00\u4e9b\u786c\u5e01\u7ec4\u5408\u5219\u4e0d\u7136\uff0c\u8d2a\u5fc3\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
    • \u9002\u5408\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u7684\u95ee\u9898\u5177\u6709\u4e24\u5927\u6027\u8d28\uff1a\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u548c\u6700\u4f18\u5b50\u7ed3\u6784\u3002\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u4ee3\u8868\u8d2a\u5fc3\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
    • \u5bf9\u4e8e\u67d0\u4e9b\u590d\u6742\u95ee\u9898\uff0c\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28\u7684\u8bc1\u660e\u5e76\u4e0d\u7b80\u5355\u3002\u76f8\u5bf9\u6765\u8bf4\uff0c\u8bc1\u4f2a\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u94b1\u5151\u6362\u95ee\u9898\u3002
    • \u6c42\u89e3\u8d2a\u5fc3\u95ee\u9898\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\uff1a\u95ee\u9898\u5206\u6790\u3001\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u3001\u6b63\u786e\u6027\u8bc1\u660e\u3002\u5176\u4e2d\uff0c\u786e\u5b9a\u8d2a\u5fc3\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9aa4\uff0c\u6b63\u786e\u6027\u8bc1\u660e\u5f80\u5f80\u662f\u96be\u70b9\u3002
    • \u5206\u6570\u80cc\u5305\u95ee\u9898\u5728 0-1 \u80cc\u5305\u7684\u57fa\u7840\u4e0a\uff0c\u5141\u8bb8\u9009\u62e9\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8d2a\u5fc3\u7b97\u6cd5\u6c42\u89e3\u3002\u8d2a\u5fc3\u7b56\u7565\u7684\u6b63\u786e\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8bc1\u6cd5\u6765\u8bc1\u660e\u3002
    • \u6700\u5927\u5bb9\u91cf\u95ee\u9898\u53ef\u4f7f\u7528\u7a77\u4e3e\u6cd5\u6c42\u89e3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u901a\u8fc7\u8bbe\u8ba1\u8d2a\u5fc3\u7b56\u7565\uff0c\u6bcf\u8f6e\u5411\u5185\u79fb\u52a8\u77ed\u677f\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(n)\\) \u3002
    • \u5728\u6700\u5927\u5207\u5206\u4e58\u79ef\u95ee\u9898\u4e2d\uff0c\u6211\u4eec\u5148\u540e\u63a8\u7406\u51fa\u4e24\u4e2a\u8d2a\u5fc3\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6570\u90fd\u5e94\u8be5\u7ee7\u7eed\u5207\u5206\uff0c\u6700\u4f18\u5207\u5206\u56e0\u5b50\u4e3a \\(3\\) \u3002\u4ee3\u7801\u4e2d\u5305\u542b\u5e42\u8fd0\u7b97\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53d6\u51b3\u4e8e\u5e42\u8fd0\u7b97\u5b9e\u73b0\u65b9\u6cd5\uff0c\u901a\u5e38\u4e3a \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
    "},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u54c8\u5e0c\u8868","text":"

    Abstract

    \u5728\u8ba1\u7b97\u673a\u4e16\u754c\u4e2d\uff0c\u54c8\u5e0c\u8868\u5982\u540c\u4e00\u4f4d\u806a\u6167\u7684\u56fe\u4e66\u7ba1\u7406\u5458\u3002

    \u4ed6\u77e5\u9053\u5982\u4f55\u8ba1\u7b97\u7d22\u4e66\u53f7\uff0c\u4ece\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6807\u56fe\u4e66\u3002

    "},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 6.1 \u00a0 \u54c8\u5e0c\u8868
    • 6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81
    • 6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5
    • 6.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u54c8\u5e0c\u7b97\u6cd5","text":"

    \u524d\u4e24\u8282\u4ecb\u7ecd\u4e86\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u54c8\u5e0c\u51b2\u7a81\u7684\u5904\u7406\u65b9\u6cd5\u3002\u7136\u800c\u65e0\u8bba\u662f\u5f00\u653e\u5bfb\u5740\u8fd8\u662f\u94fe\u5f0f\u5730\u5740\uff0c\u5b83\u4eec\u53ea\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u53d1\u751f\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u65e0\u6cd5\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u3002

    \u5982\u679c\u54c8\u5e0c\u51b2\u7a81\u8fc7\u4e8e\u9891\u7e41\uff0c\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u5219\u4f1a\u6025\u5267\u52a3\u5316\u3002\u5982\u56fe 6-8 \u6240\u793a\uff0c\u5bf9\u4e8e\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\uff0c\u7406\u60f3\u60c5\u51b5\u4e0b\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u5404\u4e2a\u6876\u4e2d\uff0c\u8fbe\u5230\u6700\u4f73\u67e5\u8be2\u6548\u7387\uff1b\u6700\u5dee\u60c5\u51b5\u4e0b\u6240\u6709\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u56fe 6-8 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u7684\u6700\u4f73\u60c5\u51b5\u4e0e\u6700\u5dee\u60c5\u51b5

    \u952e\u503c\u5bf9\u7684\u5206\u5e03\u60c5\u51b5\u7531\u54c8\u5e0c\u51fd\u6570\u51b3\u5b9a\u3002\u56de\u5fc6\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u6b65\u9aa4\uff0c\u5148\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u518d\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\uff1a

    index = hash(key) % capacity\n

    \u89c2\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u5f53\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u65f6\uff0c\u54c8\u5e0c\u7b97\u6cd5 hash() \u51b3\u5b9a\u4e86\u8f93\u51fa\u503c\uff0c\u8fdb\u800c\u51b3\u5b9a\u4e86\u952e\u503c\u5bf9\u5728\u54c8\u5e0c\u8868\u4e2d\u7684\u5206\u5e03\u60c5\u51b5\u3002

    \u8fd9\u610f\u5473\u7740\uff0c\u4e3a\u4e86\u964d\u4f4e\u54c8\u5e0c\u51b2\u7a81\u7684\u53d1\u751f\u6982\u7387\uff0c\u6211\u4eec\u5e94\u5f53\u5c06\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u54c8\u5e0c\u7b97\u6cd5 hash() \u7684\u8bbe\u8ba1\u4e0a\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u76ee\u6807","text":"

    \u4e3a\u4e86\u5b9e\u73b0\u201c\u65e2\u5feb\u53c8\u7a33\u201d\u7684\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u5177\u5907\u4ee5\u4e0b\u7279\u70b9\u3002

    • \u786e\u5b9a\u6027\uff1a\u5bf9\u4e8e\u76f8\u540c\u7684\u8f93\u5165\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5e94\u59cb\u7ec8\u4ea7\u751f\u76f8\u540c\u7684\u8f93\u51fa\u3002\u8fd9\u6837\u624d\u80fd\u786e\u4fdd\u54c8\u5e0c\u8868\u662f\u53ef\u9760\u7684\u3002
    • \u6548\u7387\u9ad8\uff1a\u8ba1\u7b97\u54c8\u5e0c\u503c\u7684\u8fc7\u7a0b\u5e94\u8be5\u8db3\u591f\u5feb\u3002\u8ba1\u7b97\u5f00\u9500\u8d8a\u5c0f\uff0c\u54c8\u5e0c\u8868\u7684\u5b9e\u7528\u6027\u8d8a\u9ad8\u3002
    • \u5747\u5300\u5206\u5e03\uff1a\u54c8\u5e0c\u7b97\u6cd5\u5e94\u4f7f\u5f97\u952e\u503c\u5bf9\u5747\u5300\u5206\u5e03\u5728\u54c8\u5e0c\u8868\u4e2d\u3002\u5206\u5e03\u8d8a\u5747\u5300\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002

    \u5b9e\u9645\u4e0a\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u4e8e\u5b9e\u73b0\u54c8\u5e0c\u8868\uff0c\u8fd8\u5e7f\u6cdb\u5e94\u7528\u4e8e\u5176\u4ed6\u9886\u57df\u4e2d\u3002

    • \u5bc6\u7801\u5b58\u50a8\uff1a\u4e3a\u4e86\u4fdd\u62a4\u7528\u6237\u5bc6\u7801\u7684\u5b89\u5168\uff0c\u7cfb\u7edf\u901a\u5e38\u4e0d\u4f1a\u76f4\u63a5\u5b58\u50a8\u7528\u6237\u7684\u660e\u6587\u5bc6\u7801\uff0c\u800c\u662f\u5b58\u50a8\u5bc6\u7801\u7684\u54c8\u5e0c\u503c\u3002\u5f53\u7528\u6237\u8f93\u5165\u5bc6\u7801\u65f6\uff0c\u7cfb\u7edf\u4f1a\u5bf9\u8f93\u5165\u7684\u5bc6\u7801\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u7136\u540e\u4e0e\u5b58\u50a8\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u5bc6\u7801\u5c31\u88ab\u89c6\u4e3a\u6b63\u786e\u3002
    • \u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5\uff1a\u6570\u636e\u53d1\u9001\u65b9\u53ef\u4ee5\u8ba1\u7b97\u6570\u636e\u7684\u54c8\u5e0c\u503c\u5e76\u5c06\u5176\u4e00\u540c\u53d1\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8ba1\u7b97\u63a5\u6536\u5230\u7684\u6570\u636e\u7684\u54c8\u5e0c\u503c\uff0c\u5e76\u4e0e\u63a5\u6536\u5230\u7684\u54c8\u5e0c\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u5982\u679c\u4e24\u8005\u5339\u914d\uff0c\u90a3\u4e48\u6570\u636e\u5c31\u88ab\u89c6\u4e3a\u5b8c\u6574\u3002

    \u5bf9\u4e8e\u5bc6\u7801\u5b66\u7684\u76f8\u5173\u5e94\u7528\uff0c\u4e3a\u4e86\u9632\u6b62\u4ece\u54c8\u5e0c\u503c\u63a8\u5bfc\u51fa\u539f\u59cb\u5bc6\u7801\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u54c8\u5e0c\u7b97\u6cd5\u9700\u8981\u5177\u5907\u66f4\u9ad8\u7b49\u7ea7\u7684\u5b89\u5168\u7279\u6027\u3002

    • \u5355\u5411\u6027\uff1a\u65e0\u6cd5\u901a\u8fc7\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u5173\u4e8e\u8f93\u5165\u6570\u636e\u7684\u4efb\u4f55\u4fe1\u606f\u3002
    • \u6297\u78b0\u649e\u6027\uff1a\u5e94\u5f53\u6781\u96be\u627e\u5230\u4e24\u4e2a\u4e0d\u540c\u7684\u8f93\u5165\uff0c\u4f7f\u5f97\u5b83\u4eec\u7684\u54c8\u5e0c\u503c\u76f8\u540c\u3002
    • \u96ea\u5d29\u6548\u5e94\uff1a\u8f93\u5165\u7684\u5fae\u5c0f\u53d8\u5316\u5e94\u5f53\u5bfc\u81f4\u8f93\u51fa\u7684\u663e\u8457\u4e14\u4e0d\u53ef\u9884\u6d4b\u7684\u53d8\u5316\u3002

    \u8bf7\u6ce8\u610f\uff0c\u201c\u5747\u5300\u5206\u5e03\u201d\u4e0e\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u6982\u5ff5\uff0c\u6ee1\u8db3\u5747\u5300\u5206\u5e03\u4e0d\u4e00\u5b9a\u6ee1\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u968f\u673a\u8f93\u5165 key \u4e0b\uff0c\u54c8\u5e0c\u51fd\u6570 key % 100 \u53ef\u4ee5\u4ea7\u751f\u5747\u5300\u5206\u5e03\u7684\u8f93\u51fa\u3002\u7136\u800c\u8be5\u54c8\u5e0c\u7b97\u6cd5\u8fc7\u4e8e\u7b80\u5355\uff0c\u6240\u6709\u540e\u4e24\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f93\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u4ece\u54c8\u5e0c\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u4ece\u800c\u7834\u89e3\u5bc6\u7801\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1","text":"

    \u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u662f\u4e00\u4e2a\u9700\u8981\u8003\u8651\u8bb8\u591a\u56e0\u7d20\u7684\u590d\u6742\u95ee\u9898\u3002\u7136\u800c\u5bf9\u4e8e\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u573a\u666f\uff0c\u6211\u4eec\u4e5f\u80fd\u8bbe\u8ba1\u4e00\u4e9b\u7b80\u5355\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

    • \u52a0\u6cd5\u54c8\u5e0c\uff1a\u5bf9\u8f93\u5165\u7684\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u8fdb\u884c\u76f8\u52a0\uff0c\u5c06\u5f97\u5230\u7684\u603b\u548c\u4f5c\u4e3a\u54c8\u5e0c\u503c\u3002
    • \u4e58\u6cd5\u54c8\u5e0c\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u5173\u6027\uff0c\u6bcf\u8f6e\u4e58\u4ee5\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5404\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u54c8\u5e0c\u503c\u4e2d\u3002
    • \u5f02\u6216\u54c8\u5e0c\uff1a\u5c06\u8f93\u5165\u6570\u636e\u7684\u6bcf\u4e2a\u5143\u7d20\u901a\u8fc7\u5f02\u6216\u64cd\u4f5c\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\u3002
    • \u65cb\u8f6c\u54c8\u5e0c\uff1a\u5c06\u6bcf\u4e2a\u5b57\u7b26\u7684 ASCII \u7801\u7d2f\u79ef\u5230\u4e00\u4e2a\u54c8\u5e0c\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u79ef\u4e4b\u524d\u90fd\u4f1a\u5bf9\u54c8\u5e0c\u503c\u8fdb\u884c\u65cb\u8f6c\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
    def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u4e58\u6cd5\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"\u5f02\u6216\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u65cb\u8f6c\u54c8\u5e0c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
    simple_hash.cpp
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
    simple_hash.java
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
    simple_hash.cs
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
    simple_hash.go
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
    simple_hash.swift
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
    simple_hash.js
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
    simple_hash.ts
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
    simple_hash.dart
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
    simple_hash.rs
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
    simple_hash.c
    /* \u52a0\u6cd5\u54c8\u5e0c */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
    simple_hash.kt
    /* \u52a0\u6cd5\u54c8\u5e0c */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u4e58\u6cd5\u54c8\u5e0c */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u5f02\u6216\u54c8\u5e0c */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u65cb\u8f6c\u54c8\u5e0c */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
    simple_hash.rb
    ### \u52a0\u6cd5\u54c8\u5e0c ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n### \u4e58\u6cd5\u54c8\u5e0c ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n### \u5f02\u6216\u54c8\u5e0c ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n### \u65cb\u8f6c\u54c8\u5e0c ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
    simple_hash.zig
    [class]{}-[func]{addHash}\n\n[class]{}-[func]{mulHash}\n\n[class]{}-[func]{xorHash}\n\n[class]{}-[func]{rotHash}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u6bcf\u79cd\u54c8\u5e0c\u7b97\u6cd5\u7684\u6700\u540e\u4e00\u6b65\u90fd\u662f\u5bf9\u5927\u8d28\u6570 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u786e\u4fdd\u54c8\u5e0c\u503c\u5728\u5408\u9002\u7684\u8303\u56f4\u5185\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u4e3a\u4ec0\u4e48\u8981\u5f3a\u8c03\u5bf9\u8d28\u6570\u53d6\u6a21\uff0c\u6216\u8005\u8bf4\u5bf9\u5408\u6570\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u4e48\uff1f\u8fd9\u662f\u4e00\u4e2a\u6709\u8da3\u7684\u95ee\u9898\u3002

    \u5148\u629b\u51fa\u7ed3\u8bba\uff1a\u4f7f\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u7684\u5747\u5300\u5206\u5e03\u3002\u56e0\u4e3a\u8d28\u6570\u4e0d\u4e0e\u5176\u4ed6\u6570\u5b57\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u53ef\u4ee5\u51cf\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u4ea7\u751f\u7684\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u4ece\u800c\u907f\u514d\u54c8\u5e0c\u51b2\u7a81\u3002

    \u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5047\u8bbe\u6211\u4eec\u9009\u62e9\u5408\u6570 \\(9\\) \u4f5c\u4e3a\u6a21\u6570\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u4e48\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u8fd9\u4e09\u4e2a\u54c8\u5e0c\u503c\u3002

    \\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

    \u5982\u679c\u8f93\u5165 key \u6070\u597d\u6ee1\u8db3\u8fd9\u79cd\u7b49\u5dee\u6570\u5217\u7684\u6570\u636e\u5206\u5e03\uff0c\u90a3\u4e48\u54c8\u5e0c\u503c\u5c31\u4f1a\u51fa\u73b0\u805a\u5806\uff0c\u4ece\u800c\u52a0\u91cd\u54c8\u5e0c\u51b2\u7a81\u3002\u73b0\u5728\uff0c\u5047\u8bbe\u5c06 modulus \u66ff\u6362\u4e3a\u8d28\u6570 \\(13\\) \uff0c\u7531\u4e8e key \u548c modulus \u4e4b\u95f4\u4e0d\u5b58\u5728\u516c\u7ea6\u6570\uff0c\u56e0\u6b64\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u7684\u5747\u5300\u6027\u4f1a\u660e\u663e\u63d0\u5347\u3002

    \\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u591f\u4fdd\u8bc1 key \u662f\u968f\u673a\u5747\u5300\u5206\u5e03\u7684\uff0c\u90a3\u4e48\u9009\u62e9\u8d28\u6570\u6216\u8005\u5408\u6570\u4f5c\u4e3a\u6a21\u6570\u90fd\u53ef\u4ee5\uff0c\u5b83\u4eec\u90fd\u80fd\u8f93\u51fa\u5747\u5300\u5206\u5e03\u7684\u54c8\u5e0c\u503c\u3002\u800c\u5f53 key \u7684\u5206\u5e03\u5b58\u5728\u67d0\u79cd\u5468\u671f\u6027\u65f6\uff0c\u5bf9\u5408\u6570\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73b0\u805a\u96c6\u73b0\u8c61\u3002

    \u603b\u800c\u8a00\u4e4b\uff0c\u6211\u4eec\u901a\u5e38\u9009\u53d6\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u5e76\u4e14\u8fd9\u4e2a\u8d28\u6570\u6700\u597d\u8db3\u591f\u5927\uff0c\u4ee5\u5c3d\u53ef\u80fd\u6d88\u9664\u5468\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u89c1\u54c8\u5e0c\u7b97\u6cd5","text":"

    \u4e0d\u96be\u53d1\u73b0\uff0c\u4ee5\u4e0a\u4ecb\u7ecd\u7684\u7b80\u5355\u54c8\u5e0c\u7b97\u6cd5\u90fd\u6bd4\u8f83\u201c\u8106\u5f31\u201d\uff0c\u8fdc\u8fdc\u6ca1\u6709\u8fbe\u5230\u54c8\u5e0c\u7b97\u6cd5\u7684\u8bbe\u8ba1\u76ee\u6807\u3002\u4f8b\u5982\uff0c\u7531\u4e8e\u52a0\u6cd5\u548c\u5f02\u6216\u6ee1\u8db3\u4ea4\u6362\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u54c8\u5e0c\u548c\u5f02\u6216\u54c8\u5e0c\u65e0\u6cd5\u533a\u5206\u5185\u5bb9\u76f8\u540c\u4f46\u987a\u5e8f\u4e0d\u540c\u7684\u5b57\u7b26\u4e32\uff0c\u8fd9\u53ef\u80fd\u4f1a\u52a0\u5267\u54c8\u5e0c\u51b2\u7a81\uff0c\u5e76\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u95ee\u9898\u3002

    \u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u7528\u4e00\u4e9b\u6807\u51c6\u54c8\u5e0c\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u4eec\u53ef\u4ee5\u5c06\u4efb\u610f\u957f\u5ea6\u7684\u8f93\u5165\u6570\u636e\u6620\u5c04\u5230\u6052\u5b9a\u957f\u5ea6\u7684\u54c8\u5e0c\u503c\u3002

    \u8fd1\u4e00\u4e2a\u4e16\u7eaa\u4ee5\u6765\uff0c\u54c8\u5e0c\u7b97\u6cd5\u5904\u5728\u4e0d\u65ad\u5347\u7ea7\u4e0e\u4f18\u5316\u7684\u8fc7\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u52aa\u529b\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u6027\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u5458\u548c\u9ed1\u5ba2\u5219\u81f4\u529b\u4e8e\u5bfb\u627e\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u95ee\u9898\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u3002

    • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u51fb\uff0c\u56e0\u6b64\u5b83\u4eec\u88ab\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u5f03\u7528\u3002
    • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u54c8\u5e0c\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73b0\u6210\u529f\u7684\u653b\u51fb\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u7c7b\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u4e2d\u3002
    • SHA-3 \u76f8\u8f83 SHA-2 \u7684\u5b9e\u73b0\u5f00\u9500\u66f4\u4f4e\u3001\u8ba1\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u76d6\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

    \u8868 6-2 \u00a0 \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5

    MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u65f6\u95f4 1992 1995 2002 2008 \u8f93\u51fa\u957f\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u54c8\u5e0c\u51b2\u7a81 \u8f83\u591a \u8f83\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7ea7 \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u51fb \u9ad8 \u9ad8 \u5e94\u7528 \u5df2\u88ab\u5f03\u7528\uff0c\u4ecd\u7528\u4e8e\u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5 \u5df2\u88ab\u5f03\u7528 \u52a0\u5bc6\u8d27\u5e01\u4ea4\u6613\u9a8c\u8bc1\u3001\u6570\u5b57\u7b7e\u540d\u7b49 \u53ef\u7528\u4e8e\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u6570\u636e\u7ed3\u6784\u7684\u54c8\u5e0c\u503c","text":"

    \u6211\u4eec\u77e5\u9053\uff0c\u54c8\u5e0c\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6570\u3001\u5c0f\u6570\u6216\u5b57\u7b26\u4e32\u7b49\u6570\u636e\u7c7b\u578b\u3002\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u8fd9\u4e9b\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u7684\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u4e3a\u4f8b\uff0c\u6211\u4eec\u53ef\u4ee5\u8c03\u7528 hash() \u51fd\u6570\u6765\u8ba1\u7b97\u5404\u79cd\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u3002

    • \u6574\u6570\u548c\u5e03\u5c14\u91cf\u7684\u54c8\u5e0c\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
    • \u6d6e\u70b9\u6570\u548c\u5b57\u7b26\u4e32\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u8f83\u4e3a\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u8bf7\u81ea\u884c\u5b66\u4e60\u3002
    • \u5143\u7ec4\u7684\u54c8\u5e0c\u503c\u662f\u5bf9\u5176\u4e2d\u6bcf\u4e00\u4e2a\u5143\u7d20\u8fdb\u884c\u54c8\u5e0c\uff0c\u7136\u540e\u5c06\u8fd9\u4e9b\u54c8\u5e0c\u503c\u7ec4\u5408\u8d77\u6765\uff0c\u5f97\u5230\u5355\u4e00\u7684\u54c8\u5e0c\u503c\u3002
    • \u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u57fa\u4e8e\u5176\u5185\u5b58\u5730\u5740\u751f\u6210\u3002\u901a\u8fc7\u91cd\u5199\u5bf9\u8c61\u7684\u54c8\u5e0c\u65b9\u6cd5\uff0c\u53ef\u5b9e\u73b0\u57fa\u4e8e\u5185\u5bb9\u751f\u6210\u54c8\u5e0c\u503c\u3002

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u54c8\u5e0c\u503c\u8ba1\u7b97\u51fd\u6570\u7684\u5b9a\u4e49\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
    num = 3\nhash_num = hash(num)\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u5c14\u91cf True \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u8282\u70b9\u5bf9\u8c61 <ListNode object at 0x1058fd810> \u7684\u54c8\u5e0c\u503c\u4e3a 274267521\n
    built_in_hash.cpp
    int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u5c14\u91cf 1 \u7684\u54c8\u5e0c\u503c\u4e3a 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5185\u7f6e std:hash() \u4ec5\u63d0\u4f9b\u57fa\u672c\u6570\u636e\u7c7b\u578b\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\n// \u6570\u7ec4\u3001\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u8ba1\u7b97\u9700\u8981\u81ea\u884c\u5b9e\u73b0\n
    built_in_hash.java
    int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@7dc5e7b4 \u7684\u54c8\u5e0c\u503c\u4e3a 2110121908\n
    built_in_hash.cs
    int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u8282\u70b9\u5bf9\u8c61 0 \u7684\u54c8\u5e0c\u503c\u4e3a 39053774;\n
    built_in_hash.go
    // Go \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.swift
    let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u6570\u7ec4 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u54c8\u5e0c\u503c\u4e3a -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode \u7684\u54c8\u5e0c\u503c\u4e3a -2434780518035996159\n
    built_in_hash.js
    // JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.ts
    // TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.dart
    int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u5c14\u503c true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u8282\u70b9\u5bf9\u8c61 Instance of 'ListNode' \u7684\u54c8\u5e0c\u503c\u4e3a 1033450432\n
    built_in_hash.rs
    use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a 2566941990314602357\n\nlet str = \"Hello \u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a 16092673739211250988\n\nlet arr = (&12836, &\"\u5c0f\u54c8\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// \u5143\u7ec4 (12836, \"\u5c0f\u54c8\") \u7684\u54c8\u5e0c\u503c\u4e3a 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u8282\u70b9\u5bf9\u8c61 RefCell { value: ListNode { val: 42, next: None } } \u7684\u54c8\u5e0c\u503c\u4e3a15387811073369036852\n
    built_in_hash.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e hash code \u51fd\u6570\n
    built_in_hash.kt
    val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1340954729\n\nval str = \"Hello \u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u6570\u7ec4 [12836, \u5c0f\u54c8] \u7684\u54c8\u5e0c\u503c\u4e3a 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u8282\u70b9\u5bf9\u8c61 utils.ListNode@1d81eb93 \u7684\u54c8\u5e0c\u503c\u4e3a 495053715\n
    built_in_hash.rb
    num = 3\nhash_num = num.hash\n# \u6574\u6570 3 \u7684\u54c8\u5e0c\u503c\u4e3a -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u5c14\u91cf true \u7684\u54c8\u5e0c\u503c\u4e3a -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6570 3.14159 \u7684\u54c8\u5e0c\u503c\u4e3a -1479186995943067893\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u7b26\u4e32\u201cHello \u7b97\u6cd5\u201d\u7684\u54c8\u5e0c\u503c\u4e3a -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7ec4 (12836, '\u5c0f\u54c8') \u7684\u54c8\u5e0c\u503c\u4e3a 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u8282\u70b9\u5bf9\u8c61 #<ListNode:0x000078133140ab70> \u7684\u54c8\u5e0c\u503c\u4e3a 4302940560806366381\n
    built_in_hash.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5728\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u624d\u53ef\u4f5c\u4e3a\u54c8\u5e0c\u8868\u7684 key \u3002\u5047\u5982\u6211\u4eec\u5c06\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4f5c\u4e3a key \uff0c\u5f53\u5217\u8868\u7684\u5185\u5bb9\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u5b83\u7684\u54c8\u5e0c\u503c\u4e5f\u968f\u4e4b\u6539\u53d8\uff0c\u6211\u4eec\u5c31\u65e0\u6cd5\u5728\u54c8\u5e0c\u8868\u4e2d\u67e5\u8be2\u5230\u539f\u5148\u7684 value \u4e86\u3002

    \u867d\u7136\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff08\u6bd4\u5982\u94fe\u8868\u8282\u70b9\uff09\u7684\u6210\u5458\u53d8\u91cf\u662f\u53ef\u53d8\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u54c8\u5e0c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\u5bf9\u8c61\u7684\u54c8\u5e0c\u503c\u901a\u5e38\u662f\u57fa\u4e8e\u5185\u5b58\u5730\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u5bf9\u8c61\u7684\u5185\u5bb9\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u4f46\u5b83\u7684\u5185\u5b58\u5730\u5740\u4e0d\u53d8\uff0c\u54c8\u5e0c\u503c\u4ecd\u7136\u662f\u4e0d\u53d8\u7684\u3002

    \u7ec6\u5fc3\u7684\u4f60\u53ef\u80fd\u53d1\u73b0\u5728\u4e0d\u540c\u63a7\u5236\u53f0\u4e2d\u8fd0\u884c\u7a0b\u5e8f\u65f6\uff0c\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u662f\u4e0d\u540c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a Python \u89e3\u91ca\u5668\u5728\u6bcf\u6b21\u542f\u52a8\u65f6\uff0c\u90fd\u4f1a\u4e3a\u5b57\u7b26\u4e32\u54c8\u5e0c\u51fd\u6570\u52a0\u5165\u4e00\u4e2a\u968f\u673a\u7684\u76d0\uff08salt\uff09\u503c\u3002\u8fd9\u79cd\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u51fb\uff0c\u63d0\u5347\u54c8\u5e0c\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

    "},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u54c8\u5e0c\u51b2\u7a81","text":"

    \u4e0a\u4e00\u8282\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u5165\u7a7a\u95f4\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff0c\u56e0\u6b64\u7406\u8bba\u4e0a\u54c8\u5e0c\u51b2\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f93\u5165\u7a7a\u95f4\u4e3a\u5168\u4f53\u6574\u6570\uff0c\u8f93\u51fa\u7a7a\u95f4\u4e3a\u6570\u7ec4\u5bb9\u91cf\u5927\u5c0f\uff0c\u5219\u5fc5\u7136\u6709\u591a\u4e2a\u6574\u6570\u6620\u5c04\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

    \u54c8\u5e0c\u51b2\u7a81\u4f1a\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u9519\u8bef\uff0c\u4e25\u91cd\u5f71\u54cd\u54c8\u5e0c\u8868\u7684\u53ef\u7528\u6027\u3002\u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6bcf\u5f53\u9047\u5230\u54c8\u5e0c\u51b2\u7a81\u65f6\uff0c\u6211\u4eec\u5c31\u8fdb\u884c\u54c8\u5e0c\u8868\u6269\u5bb9\uff0c\u76f4\u81f3\u51b2\u7a81\u6d88\u5931\u4e3a\u6b62\u3002\u6b64\u65b9\u6cd5\u7b80\u5355\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u8981\u8fdb\u884c\u5927\u91cf\u7684\u6570\u636e\u642c\u8fd0\u4e0e\u54c8\u5e0c\u503c\u8ba1\u7b97\u3002\u4e3a\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

    1. \u6539\u826f\u54c8\u5e0c\u8868\u6570\u636e\u7ed3\u6784\uff0c\u4f7f\u5f97\u54c8\u5e0c\u8868\u53ef\u4ee5\u5728\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u65f6\u6b63\u5e38\u5de5\u4f5c\u3002
    2. \u4ec5\u5728\u5fc5\u8981\u65f6\uff0c\u5373\u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u624d\u6267\u884c\u6269\u5bb9\u64cd\u4f5c\u3002

    \u54c8\u5e0c\u8868\u7684\u7ed3\u6784\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u94fe\u5f0f\u5730\u5740\u201d\u548c\u201c\u5f00\u653e\u5bfb\u5740\u201d\u3002

    "},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u94fe\u5f0f\u5730\u5740","text":"

    \u5728\u539f\u59cb\u54c8\u5e0c\u8868\u4e2d\uff0c\u6bcf\u4e2a\u6876\u4ec5\u80fd\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u94fe\u5f0f\u5730\u5740\uff08separate chaining\uff09\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u6362\u4e3a\u94fe\u8868\uff0c\u5c06\u952e\u503c\u5bf9\u4f5c\u4e3a\u94fe\u8868\u8282\u70b9\uff0c\u5c06\u6240\u6709\u53d1\u751f\u51b2\u7a81\u7684\u952e\u503c\u5bf9\u90fd\u5b58\u50a8\u5728\u540c\u4e00\u94fe\u8868\u4e2d\u3002\u56fe 6-5 \u5c55\u793a\u4e86\u4e00\u4e2a\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u4f8b\u5b50\u3002

    \u56fe 6-5 \u00a0 \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868

    \u57fa\u4e8e\u94fe\u5f0f\u5730\u5740\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u53d1\u751f\u4e86\u4ee5\u4e0b\u53d8\u5316\u3002

    • \u67e5\u8be2\u5143\u7d20\uff1a\u8f93\u5165 key \uff0c\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u904d\u5386\u94fe\u8868\u5e76\u5bf9\u6bd4 key \u4ee5\u67e5\u627e\u76ee\u6807\u952e\u503c\u5bf9\u3002
    • \u6dfb\u52a0\u5143\u7d20\uff1a\u9996\u5148\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8bbf\u95ee\u94fe\u8868\u5934\u8282\u70b9\uff0c\u7136\u540e\u5c06\u8282\u70b9\uff08\u952e\u503c\u5bf9\uff09\u6dfb\u52a0\u5230\u94fe\u8868\u4e2d\u3002
    • \u5220\u9664\u5143\u7d20\uff1a\u6839\u636e\u54c8\u5e0c\u51fd\u6570\u7684\u7ed3\u679c\u8bbf\u95ee\u94fe\u8868\u5934\u90e8\uff0c\u63a5\u7740\u904d\u5386\u94fe\u8868\u4ee5\u67e5\u627e\u76ee\u6807\u8282\u70b9\u5e76\u5c06\u5176\u5220\u9664\u3002

    \u94fe\u5f0f\u5730\u5740\u5b58\u5728\u4ee5\u4e0b\u5c40\u9650\u6027\u3002

    • \u5360\u7528\u7a7a\u95f4\u589e\u5927\uff1a\u94fe\u8868\u5305\u542b\u8282\u70b9\u6307\u9488\uff0c\u5b83\u76f8\u6bd4\u6570\u7ec4\u66f4\u52a0\u8017\u8d39\u5185\u5b58\u7a7a\u95f4\u3002
    • \u67e5\u8be2\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u4e3a\u9700\u8981\u7ebf\u6027\u904d\u5386\u94fe\u8868\u6765\u67e5\u627e\u5bf9\u5e94\u5143\u7d20\u3002

    \u4ee5\u4e0b\u4ee3\u7801\u7ed9\u51fa\u4e86\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\u7684\u7b80\u5355\u5b9e\u73b0\uff0c\u9700\u8981\u6ce8\u610f\u4e24\u70b9\u3002

    • \u4f7f\u7528\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\u4ee3\u66ff\u94fe\u8868\uff0c\u4ece\u800c\u7b80\u5316\u4ee3\u7801\u3002\u5728\u8fd9\u79cd\u8bbe\u5b9a\u4e0b\uff0c\u54c8\u5e0c\u8868\uff08\u6570\u7ec4\uff09\u5305\u542b\u591a\u4e2a\u6876\uff0c\u6bcf\u4e2a\u6876\u90fd\u662f\u4e00\u4e2a\u5217\u8868\u3002
    • \u4ee5\u4e0b\u5b9e\u73b0\u5305\u542b\u54c8\u5e0c\u8868\u6269\u5bb9\u65b9\u6cd5\u3002\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(\\frac{2}{3}\\) \u65f6\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
    class HashMapChaining:\n    \"\"\"\u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u6570\u7ec4\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
    hash_map_chaining.cpp
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;                   // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres;               // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;                // \u6269\u5bb9\u500d\u6570\n    vector<vector<Pair *>> buckets; // \u6876\u6570\u7ec4\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n                delete tmp;                       // \u91ca\u653e\u5185\u5b58\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91ca\u653e\u5185\u5b58\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
    hash_map_chaining.java
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
    hash_map_chaining.cs
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio; // \u6269\u5bb9\u500d\u6570\n    List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
    hash_map_chaining.go
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int      // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int      // \u6269\u5bb9\u500d\u6570\n    buckets     [][]pair // \u6876\u6570\u7ec4\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u5220\u9664\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
    hash_map_chaining.swift
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [[Pair]] // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
    hash_map_chaining.js
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
    hash_map_chaining.ts
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    #size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    #buckets: Pair[][]; // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
    hash_map_chaining.dart
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n  late int size; // \u952e\u503c\u5bf9\u6570\u91cf\n  late int capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  late double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  late int extendRatio; // \u6269\u5bb9\u500d\u6570\n  late List<List<Pair>> buckets; // \u6876\u6570\u7ec4\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
    hash_map_chaining.rs
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapChaining {\n    size: i32,\n    capacity: i32,\n    load_thres: f32,\n    extend_ratio: i32,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for i in 0..bucket.len() {\n            if bucket[i].key == key {\n                let pair = bucket.remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n        let bucket = &mut self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n        let bucket = &mut self.buckets[index];\n\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n        let bucket = &self.buckets[index];\n\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for pair in bucket {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de None\n        None\n    }\n}\n
    hash_map_chaining.c
    /* \u94fe\u8868\u8282\u70b9 */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Node **buckets;   // \u6876\u6570\u7ec4\n} HashMapChaining;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u91ca\u653e\u5185\u5b58\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91ca\u653e\u5185\u5b58\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
    hash_map_chaining.kt
    /* \u94fe\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 */\nclass HashMapChaining {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    val extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u6570\u7ec4\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        // mutablelist \u65e0\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
    hash_map_chaining.rb
    ### \u952e\u5f0f\u5730\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapChaining\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) { [] } # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5219\u66f4\u65b0\u5bf9\u5e94 val \u5e76\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u65e0\u8be5 key \uff0c\u5219\u5c06\u952e\u503c\u5bf9\u6dfb\u52a0\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u904d\u5386\u6876\uff0c\u4ece\u4e2d\u5220\u9664\u952e\u503c\u5bf9\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
    hash_map_chaining.zig
    [class]{HashMapChaining}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5f53\u94fe\u8868\u5f88\u957f\u65f6\uff0c\u67e5\u8be2\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u65f6\u53ef\u4ee5\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u201cAVL \u6811\u201d\u6216\u201c\u7ea2\u9ed1\u6811\u201d\uff0c\u4ece\u800c\u5c06\u67e5\u8be2\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u5f00\u653e\u5bfb\u5740","text":"

    \u5f00\u653e\u5bfb\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u800c\u662f\u901a\u8fc7\u201c\u591a\u6b21\u63a2\u6d4b\u201d\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\uff0c\u63a2\u6d4b\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\u7b49\u3002

    \u4e0b\u9762\u4ee5\u7ebf\u6027\u63a2\u6d4b\u4e3a\u4f8b\uff0c\u4ecb\u7ecd\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u7684\u5de5\u4f5c\u673a\u5236\u3002

    "},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7ebf\u6027\u63a2\u6d4b","text":"

    \u7ebf\u6027\u63a2\u6d4b\u91c7\u7528\u56fa\u5b9a\u6b65\u957f\u7684\u7ebf\u6027\u641c\u7d22\u6765\u8fdb\u884c\u63a2\u6d4b\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u4e0e\u666e\u901a\u54c8\u5e0c\u8868\u6709\u6240\u4e0d\u540c\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u53d1\u73b0\u6876\u5185\u5df2\u6709\u5143\u7d20\uff0c\u5219\u4ece\u51b2\u7a81\u4f4d\u7f6e\u5411\u540e\u7ebf\u6027\u904d\u5386\uff08\u6b65\u957f\u901a\u5e38\u4e3a \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c06\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
    • \u67e5\u627e\u5143\u7d20\uff1a\u82e5\u53d1\u73b0\u54c8\u5e0c\u51b2\u7a81\uff0c\u5219\u4f7f\u7528\u76f8\u540c\u6b65\u957f\u5411\u540e\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u76f4\u5230\u627e\u5230\u5bf9\u5e94\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8bf4\u660e\u76ee\u6807\u5143\u7d20\u4e0d\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

    \u56fe 6-6 \u5c55\u793a\u4e86\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03\u3002\u6839\u636e\u6b64\u54c8\u5e0c\u51fd\u6570\uff0c\u6700\u540e\u4e24\u4f4d\u76f8\u540c\u7684 key \u90fd\u4f1a\u88ab\u6620\u5c04\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u901a\u8fc7\u7ebf\u6027\u63a2\u6d4b\uff0c\u5b83\u4eec\u88ab\u4f9d\u6b21\u5b58\u50a8\u5728\u8be5\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

    \u56fe 6-6 \u00a0 \u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u7684\u952e\u503c\u5bf9\u5206\u5e03

    \u7136\u800c\uff0c\u7ebf\u6027\u63a2\u6d4b\u5bb9\u6613\u4ea7\u751f\u201c\u805a\u96c6\u73b0\u8c61\u201d\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u6570\u7ec4\u4e2d\u8fde\u7eed\u88ab\u5360\u7528\u7684\u4f4d\u7f6e\u8d8a\u957f\uff0c\u8fd9\u4e9b\u8fde\u7eed\u4f4d\u7f6e\u53d1\u751f\u54c8\u5e0c\u51b2\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u4ece\u800c\u8fdb\u4e00\u6b65\u4fc3\u4f7f\u8be5\u4f4d\u7f6e\u7684\u805a\u5806\u751f\u957f\uff0c\u5f62\u6210\u6076\u6027\u5faa\u73af\uff0c\u6700\u7ec8\u5bfc\u81f4\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u4eec\u4e0d\u80fd\u5728\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\u4e2d\u76f4\u63a5\u5220\u9664\u5143\u7d20\u3002\u8fd9\u662f\u56e0\u4e3a\u5220\u9664\u5143\u7d20\u4f1a\u5728\u6570\u7ec4\u5185\u4ea7\u751f\u4e00\u4e2a\u7a7a\u6876 None \uff0c\u800c\u5f53\u67e5\u8be2\u5143\u7d20\u65f6\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230\u8be5\u7a7a\u6876\u5c31\u4f1a\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8be5\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u65e0\u6cd5\u518d\u88ab\u8bbf\u95ee\u5230\uff0c\u7a0b\u5e8f\u53ef\u80fd\u8bef\u5224\u8fd9\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u56fe 6-7 \u6240\u793a\u3002

    \u56fe 6-7 \u00a0 \u5728\u5f00\u653e\u5bfb\u5740\u4e2d\u5220\u9664\u5143\u7d20\u5bfc\u81f4\u7684\u67e5\u8be2\u95ee\u9898

    \u4e3a\u4e86\u89e3\u51b3\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u61d2\u5220\u9664\uff08lazy deletion\uff09\u673a\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u4ece\u54c8\u5e0c\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u4e2a\u5e38\u91cf TOMBSTONE \u6765\u6807\u8bb0\u8fd9\u4e2a\u6876\u3002\u5728\u8be5\u673a\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u952e\u503c\u5bf9\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7ebf\u6027\u63a2\u6d4b\u5230 TOMBSTONE \u65f6\u5e94\u8be5\u7ee7\u7eed\u904d\u5386\uff0c\u56e0\u4e3a\u5176\u4e4b\u4e0b\u53ef\u80fd\u8fd8\u5b58\u5728\u952e\u503c\u5bf9\u3002

    \u7136\u800c\uff0c\u61d2\u5220\u9664\u53ef\u80fd\u4f1a\u52a0\u901f\u54c8\u5e0c\u8868\u7684\u6027\u80fd\u9000\u5316\u3002\u8fd9\u662f\u56e0\u4e3a\u6bcf\u6b21\u5220\u9664\u64cd\u4f5c\u90fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u5220\u9664\u6807\u8bb0\uff0c\u968f\u7740 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u7d22\u65f6\u95f4\u4e5f\u4f1a\u589e\u52a0\uff0c\u56e0\u4e3a\u7ebf\u6027\u63a2\u6d4b\u53ef\u80fd\u9700\u8981\u8df3\u8fc7\u591a\u4e2a TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6807\u5143\u7d20\u3002

    \u4e3a\u6b64\uff0c\u8003\u8651\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a TOMBSTONE \u7684\u7d22\u5f15\uff0c\u5e76\u5c06\u641c\u7d22\u5230\u7684\u76ee\u6807\u5143\u7d20\u4e0e\u8be5 TOMBSTONE \u4ea4\u6362\u4f4d\u7f6e\u3002\u8fd9\u6837\u505a\u7684\u597d\u5904\u662f\u5f53\u6bcf\u6b21\u67e5\u8be2\u6216\u6dfb\u52a0\u5143\u7d20\u65f6\uff0c\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u81f3\u8ddd\u79bb\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6d4b\u8d77\u59cb\u70b9\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u4ece\u800c\u4f18\u5316\u67e5\u8be2\u6548\u7387\u3002

    \u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u5305\u542b\u61d2\u5220\u9664\u7684\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\uff09\u54c8\u5e0c\u8868\u3002\u4e3a\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\uff0c\u6211\u4eec\u5c06\u54c8\u5e0c\u8868\u770b\u4f5c\u4e00\u4e2a\u201c\u73af\u5f62\u6570\u7ec4\u201d\uff0c\u5f53\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
    class HashMapOpenAddressing:\n    \"\"\"\u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.size = 0  # \u952e\u503c\u5bf9\u6570\u91cf\n        self.capacity = 4  # \u54c8\u5e0c\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        self.extend_ratio = 2  # \u6269\u5bb9\u500d\u6570\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u6570\u7ec4\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u5220\u9664\u6807\u8bb0\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8d1f\u8f7d\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u6269\u5bb9\u54c8\u5e0c\u8868\"\"\"\n        # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
    hash_map_open_addressing.cpp
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4;                     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    const int extendRatio = 2;            // \u6269\u5bb9\u500d\u6570\n    vector<Pair *> buckets;               // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n        return \"\";\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
    hash_map_open_addressing.java
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    private int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private final int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    private Pair[] buckets; // \u6876\u6570\u7ec4\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private void extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.cs
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n    Pair[] buckets; // \u6876\u6570\u7ec4\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    void Extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.go
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity    int     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extendRatio int     // \u6269\u5bb9\u500d\u6570\n    buckets     []*pair // \u6876\u6570\u7ec4\n    TOMBSTONE   *pair   // \u5220\u9664\u6807\u8bb0\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u636e\u952e\u8ba1\u7b97\u54c8\u5e0c\u503c\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8ba1\u7b97\u5f53\u524d\u8d1f\u8f7d\u56e0\u5b50\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u83b7\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8bb0\u5f55\u9047\u5230\u7684\u7b2c\u4e00\u4e2aTOMBSTONE\u7684\u4f4d\u7f6e\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index // \u8fd4\u56de\u627e\u5230\u7684\u7d22\u5f15\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7ebf\u6027\u63a2\u6d4b\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    }\n    return \"\" // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de \"\"\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val\n    }\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        h.size--\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
    hash_map_open_addressing.swift
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u952e\u503c\u5bf9\u6570\u91cf\n    var capacity: Int // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    var extendRatio: Int // \u6269\u5bb9\u500d\u6570\n    var buckets: [Pair?] // \u6876\u6570\u7ec4\n    var TOMBSTONE: Pair // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    func extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.js
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u952e\u503c\u5bf9\u6570\u91cf\n    #capacity; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    #loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    #extendRatio; // \u6269\u5bb9\u500d\u6570\n    #buckets; // \u6876\u6570\u7ec4\n    #TOMBSTONE; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.#size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.#capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.#extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u6570\u7ec4\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key, val) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    #extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.ts
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u952e\u503c\u5bf9\u6570\u91cf\n    private capacity: number; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private extendRatio: number; // \u6269\u5bb9\u500d\u6570\n    private buckets: Array<Pair | null>; // \u6876\u6570\u7ec4\n    private TOMBSTONE: Pair; // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor() {\n        this.size = 0; // \u952e\u503c\u5bf9\u6570\u91cf\n        this.capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n        this.extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u6570\u7ec4\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u5220\u9664\u6807\u8bb0\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    private extend(): void {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.dart
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u952e\u503c\u5bf9\u6570\u91cf\n  int _capacity = 4; // \u54c8\u5e0c\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n  int _extendRatio = 2; // \u6269\u5bb9\u500d\u6570\n  late List<Pair?> _buckets; // \u6876\u6570\u7ec4\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u5220\u9664\u6807\u8bb0\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8d1f\u8f7d\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n  void extend() {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
    hash_map_open_addressing.rs
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u952e\u503c\u5bf9\u6570\u91cf\n    capacity: usize,            // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    extend_ratio: usize,        // \u6269\u5bb9\u500d\u6570\n    buckets: Vec<Option<Pair>>, // \u6876\u6570\u7ec4\n    TOMBSTONE: Option<Pair>,    // \u5220\u9664\u6807\u8bb0\n}\n\nimpl HashMapOpenAddressing {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u5efa\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        None\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fn extend(&mut self) {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.c
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\ntypedef struct {\n    int size;         // \u952e\u503c\u5bf9\u6570\u91cf\n    int capacity;     // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    double loadThres; // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    int extendRatio;  // \u6269\u5bb9\u500d\u6570\n    Pair **buckets;   // \u6876\u6570\u7ec4\n    Pair *TOMBSTONE;  // \u5220\u9664\u6807\u8bb0\n} HashMapOpenAddressing;\n\n/* \u6784\u9020\u51fd\u6570 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8d1f\u8f7d\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\n    return \"\";\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u6269\u5bb9\u54c8\u5e0c\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->size = 0;\n    // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
    hash_map_open_addressing.kt
    /* \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u952e\u503c\u5bf9\u6570\u91cf\n    private var capacity: Int           // \u54c8\u5e0c\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    private val extendRatio: Int        // \u6269\u5bb9\u500d\u6570\n    private var buckets: Array<Pair?>   // \u6876\u6570\u7ec4\n    private val TOMBSTONE: Pair         // \u5220\u9664\u6807\u8bb0\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8d1f\u8f7d\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de null\n        return null\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5e76\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u6269\u5bb9\u54c8\u5e0c\u8868 */\n    fun extend() {\n        // \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.rb
    ### \u5f00\u653e\u5bfb\u5740\u54c8\u5e0c\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u5220\u9664\u6807\u8bb0\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0 # \u952e\u503c\u5bf9\u6570\u91cf\n    @capacity = 4 # \u54c8\u5e0c\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89e6\u53d1\u6269\u5bb9\u7684\u8d1f\u8f7d\u56e0\u5b50\u9608\u503c\n    @extend_ratio = 2 # \u6269\u5bb9\u500d\u6570\n    @buckets = Array.new(@capacity) # \u6876\u6570\u7ec4\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8d1f\u8f7d\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7ebf\u6027\u63a2\u6d4b\uff0c\u5f53\u9047\u5230\u7a7a\u6876\u65f6\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u5220\u9664\u6807\u8bb0\uff0c\u5219\u5c06\u952e\u503c\u5bf9\u79fb\u52a8\u81f3\u8be5\u7d22\u5f15\u5904\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52a8\u540e\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8bb0\u5f55\u9047\u5230\u7684\u9996\u4e2a\u5220\u9664\u6807\u8bb0\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8ba1\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u8fc7\u5c3e\u90e8\u5219\u8fd4\u56de\u5934\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de\u6dfb\u52a0\u70b9\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8fd4\u56de\u5bf9\u5e94 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    # \u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7\u9608\u503c\u65f6\uff0c\u6267\u884c\u6269\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u8986\u76d6 val \u5f00\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u952e\u503c\u5bf9\u4e0d\u5b58\u5728\uff0c\u5219\u6dfb\u52a0\u8be5\u952e\u503c\u5bf9\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u7d22 key \u5bf9\u5e94\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u952e\u503c\u5bf9\uff0c\u5219\u7528\u5220\u9664\u6807\u8bb0\u8986\u76d6\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u6269\u5bb9\u54c8\u5e0c\u8868 ###\n  def extend\n    # \u6682\u5b58\u539f\u54c8\u5e0c\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u6269\u5bb9\u540e\u7684\u65b0\u54c8\u5e0c\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c06\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u642c\u8fd0\u81f3\u65b0\u54c8\u5e0c\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
    hash_map_open_addressing.zig
    [class]{HashMapOpenAddressing}-[func]{}\n
    "},{"location":"chapter_hashing/hash_collision/#2","title":"2. \u00a0 \u5e73\u65b9\u63a2\u6d4b","text":"

    \u5e73\u65b9\u63a2\u6d4b\u4e0e\u7ebf\u6027\u63a2\u6d4b\u7c7b\u4f3c\uff0c\u90fd\u662f\u5f00\u653e\u5bfb\u5740\u7684\u5e38\u89c1\u7b56\u7565\u4e4b\u4e00\u3002\u5f53\u53d1\u751f\u51b2\u7a81\u65f6\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e0d\u662f\u7b80\u5355\u5730\u8df3\u8fc7\u4e00\u4e2a\u56fa\u5b9a\u7684\u6b65\u6570\uff0c\u800c\u662f\u8df3\u8fc7\u201c\u63a2\u6d4b\u6b21\u6570\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6570\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

    \u5e73\u65b9\u63a2\u6d4b\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u4f18\u52bf\u3002

    • \u5e73\u65b9\u63a2\u6d4b\u901a\u8fc7\u8df3\u8fc7\u63a2\u6d4b\u6b21\u6570\u5e73\u65b9\u7684\u8ddd\u79bb\uff0c\u8bd5\u56fe\u7f13\u89e3\u7ebf\u6027\u63a2\u6d4b\u7684\u805a\u96c6\u6548\u5e94\u3002
    • \u5e73\u65b9\u63a2\u6d4b\u4f1a\u8df3\u8fc7\u66f4\u5927\u7684\u8ddd\u79bb\u6765\u5bfb\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u4e8e\u6570\u636e\u5206\u5e03\u5f97\u66f4\u52a0\u5747\u5300\u3002

    \u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6d4b\u5e76\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

    • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73b0\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u5360\u7528\u3002
    • \u7531\u4e8e\u5e73\u65b9\u7684\u589e\u957f\uff0c\u5e73\u65b9\u63a2\u6d4b\u53ef\u80fd\u4e0d\u4f1a\u63a2\u6d4b\u6574\u4e2a\u54c8\u5e0c\u8868\uff0c\u8fd9\u610f\u5473\u7740\u5373\u4f7f\u54c8\u5e0c\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6d4b\u4e5f\u53ef\u80fd\u65e0\u6cd5\u8bbf\u95ee\u5230\u5b83\u3002
    "},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u54c8\u5e0c","text":"

    \u987e\u540d\u601d\u4e49\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u8fdb\u884c\u63a2\u6d4b\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u54c8\u5e0c\u51fd\u6570 \\(f_1(x)\\) \u51fa\u73b0\u51b2\u7a81\uff0c\u5219\u5c1d\u8bd5 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u540e\u63d2\u5165\u5143\u7d20\u3002
    • \u67e5\u627e\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u54c8\u5e0c\u51fd\u6570\u987a\u5e8f\u4e0b\u8fdb\u884c\u67e5\u627e\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u65f6\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5c1d\u8bd5\u6240\u6709\u54c8\u5e0c\u51fd\u6570\uff0c\u8bf4\u660e\u54c8\u5e0c\u8868\u4e2d\u4e0d\u5b58\u5728\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de None \u3002

    \u4e0e\u7ebf\u6027\u63a2\u6d4b\u76f8\u6bd4\uff0c\u591a\u6b21\u54c8\u5e0c\u65b9\u6cd5\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u4f1a\u5e26\u6765\u989d\u5916\u7684\u8ba1\u7b97\u91cf\u3002

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u5f00\u653e\u5bfb\u5740\uff08\u7ebf\u6027\u63a2\u6d4b\u3001\u5e73\u65b9\u63a2\u6d4b\u548c\u591a\u6b21\u54c8\u5e0c\uff09\u54c8\u5e0c\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u201d\u7684\u95ee\u9898\u3002

    "},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7f16\u7a0b\u8bed\u8a00\u7684\u9009\u62e9","text":"

    \u5404\u79cd\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u7b56\u7565\uff0c\u4e0b\u9762\u4e3e\u51e0\u4e2a\u4f8b\u5b50\u3002

    • Python \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u4f2a\u968f\u673a\u6570\u8fdb\u884c\u63a2\u6d4b\u3002
    • Java \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002\u81ea JDK 1.8 \u4ee5\u6765\uff0c\u5f53 HashMap \u5185\u6570\u7ec4\u957f\u5ea6\u8fbe\u5230 64 \u4e14\u94fe\u8868\u957f\u5ea6\u8fbe\u5230 8 \u65f6\uff0c\u94fe\u8868\u4f1a\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u4ee5\u63d0\u5347\u67e5\u627e\u6027\u80fd\u3002
    • Go \u91c7\u7528\u94fe\u5f0f\u5730\u5740\u3002Go \u89c4\u5b9a\u6bcf\u4e2a\u6876\u6700\u591a\u5b58\u50a8 8 \u4e2a\u952e\u503c\u5bf9\uff0c\u8d85\u51fa\u5bb9\u91cf\u5219\u8fde\u63a5\u4e00\u4e2a\u6ea2\u51fa\u6876\uff1b\u5f53\u6ea2\u51fa\u6876\u8fc7\u591a\u65f6\uff0c\u4f1a\u6267\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u6269\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u786e\u4fdd\u6027\u80fd\u3002
    "},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u54c8\u5e0c\u8868","text":"

    \u54c8\u5e0c\u8868\uff08hash table\uff09\uff0c\u53c8\u79f0\u6563\u5217\u8868\uff0c\u5b83\u901a\u8fc7\u5efa\u7acb\u952e key \u4e0e\u503c value \u4e4b\u95f4\u7684\u6620\u5c04\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8be2\u3002\u5177\u4f53\u800c\u8a00\uff0c\u6211\u4eec\u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u4e00\u4e2a\u952e key \uff0c\u5219\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u83b7\u53d6\u5bf9\u5e94\u7684\u503c value \u3002

    \u5982\u56fe 6-1 \u6240\u793a\uff0c\u7ed9\u5b9a \\(n\\) \u4e2a\u5b66\u751f\uff0c\u6bcf\u4e2a\u5b66\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b66\u53f7\u201d\u4e24\u9879\u6570\u636e\u3002\u5047\u5982\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u201c\u8f93\u5165\u4e00\u4e2a\u5b66\u53f7\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u59d3\u540d\u201d\u7684\u67e5\u8be2\u529f\u80fd\uff0c\u5219\u53ef\u4ee5\u91c7\u7528\u56fe 6-1 \u6240\u793a\u7684\u54c8\u5e0c\u8868\u6765\u5b9e\u73b0\u3002

    \u56fe 6-1 \u00a0 \u54c8\u5e0c\u8868\u7684\u62bd\u8c61\u8868\u793a

    \u9664\u54c8\u5e0c\u8868\u5916\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u67e5\u8be2\u529f\u80fd\uff0c\u5b83\u4eec\u7684\u6548\u7387\u5bf9\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

    • \u6dfb\u52a0\u5143\u7d20\uff1a\u4ec5\u9700\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u6570\u7ec4\uff08\u94fe\u8868\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u65f6\u95f4\u3002
    • \u67e5\u8be2\u5143\u7d20\uff1a\u7531\u4e8e\u6570\u7ec4\uff08\u94fe\u8868\uff09\u662f\u4e71\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u904d\u5386\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
    • \u5220\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8be2\u5230\u5143\u7d20\uff0c\u518d\u4ece\u6570\u7ec4\uff08\u94fe\u8868\uff09\u4e2d\u5220\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002

    \u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8be2\u6548\u7387\u5bf9\u6bd4

    \u6570\u7ec4 \u94fe\u8868 \u54c8\u5e0c\u8868 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u6dfb\u52a0\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u5728\u54c8\u5e0c\u8868\u4e2d\u8fdb\u884c\u589e\u5220\u67e5\u6539\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u54c8\u5e0c\u8868\u5e38\u7528\u64cd\u4f5c","text":"

    \u54c8\u5e0c\u8868\u7684\u5e38\u89c1\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8be2\u64cd\u4f5c\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u548c\u5220\u9664\u952e\u503c\u5bf9\u7b49\uff0c\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap: dict = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.pop(10583)\n
    hash_map.cpp
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nunordered_map<int, string> map;\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.erase(10583);\n
    hash_map.java
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u5570\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9e2d\");\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
    hash_map.cs
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nDictionary<int, string> map = new() {\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    // \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u5570\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9e2d\" }\n};\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.Remove(10583);\n
    hash_map_test.go
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nhmap := make(map[int]string)\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\ndelete(hmap, 10583)\n
    hash_map.swift
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.removeValue(forKey: 10583)\n
    hash_map.js
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\n
    hash_map.ts
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nconst map = new Map<number, string>();\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u5570');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9e2d');\nconsole.info('\\n\u6dfb\u52a0\u5b8c\u6210\u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f93\u5165\u5b66\u53f7 15937 \uff0c\u67e5\u8be2\u5230\u59d3\u540d ' + name);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.delete(10583);\nconsole.info('\\n\u5220\u9664 10583 \u540e\uff0c\u54c8\u5e0c\u8868\u4e3a\\nKey -> Value');\nconsole.info(map);\n
    hash_map.dart
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nMap<int, String> map = {};\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u5570\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9e2d\";\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583);\n
    hash_map.rs
    use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u5570\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9e2d\".to_string());\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
    hash_map.kt
    /* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u5570\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9e2d\"\n\n/* \u67e5\u8be2\u64cd\u4f5c */\n// \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u5220\u9664\u64cd\u4f5c */\n// \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nmap.remove(10583)\n
    hash_map.rb
    # \u521d\u59cb\u5316\u54c8\u5e0c\u8868\nhmap = {}\n\n# \u6dfb\u52a0\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u6dfb\u52a0\u952e\u503c\u5bf9 (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u5570\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9e2d\"\n\n# \u67e5\u8be2\u64cd\u4f5c\n# \u5411\u54c8\u5e0c\u8868\u4e2d\u8f93\u5165\u952e key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u5220\u9664\u64cd\u4f5c\n# \u5728\u54c8\u5e0c\u8868\u4e2d\u5220\u9664\u952e\u503c\u5bf9 (key, value)\nhmap.delete(10583)\n
    hash_map.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u54c8\u5e0c\u8868\u6709\u4e09\u79cd\u5e38\u7528\u7684\u904d\u5386\u65b9\u5f0f\uff1a\u904d\u5386\u952e\u503c\u5bf9\u3001\u904d\u5386\u952e\u548c\u904d\u5386\u503c\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u5355\u72ec\u904d\u5386\u952e key\nfor key in hmap.keys():\n    print(key)\n# \u5355\u72ec\u904d\u5386\u503c value\nfor value in hmap.values():\n    print(value)\n
    hash_map.cpp
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u904d\u5386 key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
    hash_map.java
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
    hash_map.cs
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
    hash_map_test.go
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
    hash_map.swift
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys {\n    print(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values {\n    print(value)\n}\n
    hash_map.js
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.ts
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\nconsole.info('\\n\u904d\u5386\u952e\u503c\u5bf9 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u952e Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u5355\u72ec\u904d\u5386\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.dart
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
    hash_map.rs
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u952e Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u5355\u72ec\u904d\u5386\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u8868\n
    hash_map.kt
    /* \u904d\u5386\u54c8\u5e0c\u8868 */\n// \u904d\u5386\u952e\u503c\u5bf9 key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u5355\u72ec\u904d\u5386\u952e key\nfor (key in map.keys) {\n    println(key)\n}\n// \u5355\u72ec\u904d\u5386\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
    hash_map.rb
    # \u904d\u5386\u54c8\u5e0c\u8868\n# \u904d\u5386\u952e\u503c\u5bf9 key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u5355\u72ec\u904d\u5386\u952e key\nhmap.keys.each { |key| puts key }\n\n# \u5355\u72ec\u904d\u5386\u503c value\nhmap.values.each { |val| puts val }\n
    hash_map.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u54c8\u5e0c\u8868\u7b80\u5355\u5b9e\u73b0","text":"

    \u6211\u4eec\u5148\u8003\u8651\u6700\u7b80\u5355\u7684\u60c5\u51b5\uff0c\u4ec5\u7528\u4e00\u4e2a\u6570\u7ec4\u6765\u5b9e\u73b0\u54c8\u5e0c\u8868\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5c06\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u7a7a\u4f4d\u79f0\u4e3a\u6876\uff08bucket\uff09\uff0c\u6bcf\u4e2a\u6876\u53ef\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u3002\u56e0\u6b64\uff0c\u67e5\u8be2\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5bf9\u5e94\u7684\u6876\uff0c\u5e76\u5728\u6876\u4e2d\u83b7\u53d6 value \u3002

    \u90a3\u4e48\uff0c\u5982\u4f55\u57fa\u4e8e key \u5b9a\u4f4d\u5bf9\u5e94\u7684\u6876\u5462\uff1f\u8fd9\u662f\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\uff08hash function\uff09\u5b9e\u73b0\u7684\u3002\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u8f93\u51fa\u7a7a\u95f4\u3002\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u8f93\u5165\u7a7a\u95f4\u662f\u6240\u6709 key \uff0c\u8f93\u51fa\u7a7a\u95f4\u662f\u6240\u6709\u6876\uff08\u6570\u7ec4\u7d22\u5f15\uff09\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u8f93\u5165\u4e00\u4e2a key \uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u5f97\u5230\u8be5 key \u5bf9\u5e94\u7684\u952e\u503c\u5bf9\u5728\u6570\u7ec4\u4e2d\u7684\u5b58\u50a8\u4f4d\u7f6e\u3002

    \u8f93\u5165\u4e00\u4e2a key \uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8ba1\u7b97\u8fc7\u7a0b\u5206\u4e3a\u4ee5\u4e0b\u4e24\u6b65\u3002

    1. \u901a\u8fc7\u67d0\u79cd\u54c8\u5e0c\u7b97\u6cd5 hash() \u8ba1\u7b97\u5f97\u5230\u54c8\u5e0c\u503c\u3002
    2. \u5c06\u54c8\u5e0c\u503c\u5bf9\u6876\u6570\u91cf\uff08\u6570\u7ec4\u957f\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u4ece\u800c\u83b7\u53d6\u8be5 key \u5bf9\u5e94\u7684\u6570\u7ec4\u7d22\u5f15 index \u3002
    index = hash(key) % capacity\n

    \u968f\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u54c8\u5e0c\u8868\u4e2d\u8bbf\u95ee\u5bf9\u5e94\u7684\u6876\uff0c\u4ece\u800c\u83b7\u53d6 value \u3002

    \u8bbe\u6570\u7ec4\u957f\u5ea6 capacity = 100\u3001\u54c8\u5e0c\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u54c8\u5e0c\u51fd\u6570\u4e3a key % 100 \u3002\u56fe 6-2 \u4ee5 key \u5b66\u53f7\u548c value \u59d3\u540d\u4e3a\u4f8b\uff0c\u5c55\u793a\u4e86\u54c8\u5e0c\u51fd\u6570\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u56fe 6-2 \u00a0 \u54c8\u5e0c\u51fd\u6570\u5de5\u4f5c\u539f\u7406

    \u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u4e2a\u7b80\u5355\u54c8\u5e0c\u8868\u3002\u5176\u4e2d\uff0c\u6211\u4eec\u5c06 key \u548c value \u5c01\u88c5\u6210\u4e00\u4e2a\u7c7b Pair \uff0c\u4ee5\u8868\u793a\u952e\u503c\u5bf9\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
    class Pair:\n    \"\"\"\u952e\u503c\u5bf9\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u54c8\u5e0c\u51fd\u6570\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8be2\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u6dfb\u52a0\u64cd\u4f5c\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u5220\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u952e\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u83b7\u53d6\u6240\u6709\u503c\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u6253\u5370\u54c8\u5e0c\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
    array_hash_map.cpp
    /* \u952e\u503c\u5bf9 */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91ca\u653e\u5185\u5b58\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91ca\u653e\u5185\u5b58\u5e76\u7f6e\u4e3a nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
    array_hash_map.java
    /* \u952e\u503c\u5bf9 */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
    array_hash_map.cs
    /* \u952e\u503c\u5bf9 int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
    array_hash_map.go
    /* \u952e\u503c\u5bf9 */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u54c8\u5e0c\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u54c8\u5e0c\u51fd\u6570 */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8be2\u64cd\u4f5c */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    a.buckets[index] = nil\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u5bf9 */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
    array_hash_map.swift
    /* \u952e\u503c\u5bf9 */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = nil\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
    array_hash_map.js
    /* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
    array_hash_map.ts
    /* \u952e\u503c\u5bf9 Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
    array_hash_map.dart
    /* \u952e\u503c\u5bf9 */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u54c8\u5e0c\u51fd\u6570 */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8be2\u64cd\u4f5c */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u6dfb\u52a0\u64cd\u4f5c */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u5220\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u952e */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u83b7\u53d6\u6240\u6709\u503c */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u6253\u5370\u54c8\u5e0c\u8868 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
    array_hash_map.rs
    /* \u952e\u503c\u5bf9 */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u4e3a None \uff0c\u4ee3\u8868\u5220\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
    array_hash_map.c
    /* \u952e\u503c\u5bf9 int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u6dfb\u52a0\u64cd\u4f5c */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u5220\u9664\u64cd\u4f5c */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u952e */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u83b7\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7edf\u8ba1\u6709\u6548\u952e\u503c\u5bf9\u6570\u91cf */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u6253\u5370\u54c8\u5e0c\u8868 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
    array_hash_map.kt
    /* \u952e\u503c\u5bf9 */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u54c8\u5e0c\u51fd\u6570 */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8be2\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u6dfb\u52a0\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u5220\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n        buckets[index] = null\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u952e */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u83b7\u53d6\u6240\u6709\u503c */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u6253\u5370\u54c8\u5e0c\u8868 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
    array_hash_map.rb
    ### \u952e\u503c\u5bf9 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868 ###\nclass ArrayHashMap\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    # \u521d\u59cb\u5316\u6570\u7ec4\uff0c\u5305\u542b 100 \u4e2a\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u54c8\u5e0c\u51fd\u6570 ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8be2\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  ### \u6dfb\u52a0\u64cd\u4f5c ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  ### \u5220\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u4e3a nil \uff0c\u4ee3\u8868\u5220\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9 ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u952e ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u83b7\u53d6\u6240\u6709\u503c ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  ### \u6253\u5370\u54c8\u5e0c\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
    array_hash_map.zig
    // \u952e\u503c\u5bf9\nconst Pair = struct {\n    key: usize = undefined,\n    val: []const u8 = undefined,\n\n   pub fn init(key: usize, val: []const u8) Pair {\n        return Pair {\n            .key = key,\n            .val = val,\n        };\n    }\n};\n\n// \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u54c8\u5e0c\u8868\nfn ArrayHashMap(comptime T: type) type {\n    return struct {\n        bucket: ?std.ArrayList(?T) = null,\n        mem_allocator: std.mem.Allocator = undefined,\n\n        const Self = @This();\n\n        // \u6784\u9020\u51fd\u6570\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u4e2a\u957f\u5ea6\u4e3a 100 \u7684\u6876\uff08\u6570\u7ec4\uff09\n            self.bucket = std.ArrayList(?T).init(self.mem_allocator);\n            var i: i32 = 0;\n            while (i < 100) : (i += 1) {\n                try self.bucket.?.append(null);\n            }\n        }\n\n        // \u6790\u6784\u51fd\u6570\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u54c8\u5e0c\u51fd\u6570\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8be2\u64cd\u4f5c\n        pub fn get(self: *Self, key: usize) []const u8 {\n            var index = hashFunc(key);\n            var pair = self.bucket.?.items[index];\n            return pair.?.val;\n        }\n\n        // \u6dfb\u52a0\u64cd\u4f5c\n        pub fn put(self: *Self, key: usize, val: []const u8) !void {\n            var pair = Pair.init(key, val);\n            var index = hashFunc(key);\n            self.bucket.?.items[index] = pair;\n        }\n\n        // \u5220\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u4e3a null \uff0c\u4ee3\u8868\u5220\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u83b7\u53d6\u6240\u6709\u952e\u503c\u5bf9\n        pub fn pairSet(self: *Self) !std.ArrayList(T) {\n            var entry_set = std.ArrayList(T).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try entry_set.append(item.?);\n            }\n            return entry_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u952e\n        pub fn keySet(self: *Self) !std.ArrayList(usize) {\n            var key_set = std.ArrayList(usize).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try key_set.append(item.?.key);\n            }\n            return key_set;\n        }  \n\n        // \u83b7\u53d6\u6240\u6709\u503c\n        pub fn valueSet(self: *Self) !std.ArrayList([]const u8) {\n            var value_set = std.ArrayList([]const u8).init(self.mem_allocator);\n            for (self.bucket.?.items) |item| {\n                if (item == null) continue;\n                try value_set.append(item.?.val);\n            }\n            return value_set;\n        }\n\n        // \u6253\u5370\u54c8\u5e0c\u8868\n        pub fn print(self: *Self) !void {\n            var entry_set = try self.pairSet();\n            defer entry_set.deinit();\n            for (entry_set.items) |item| {\n                std.debug.print(\"{} -> {s}\\n\", .{item.key, item.val});\n            }\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u4e0e\u6269\u5bb9","text":"

    \u4ece\u672c\u8d28\u4e0a\u770b\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u4f5c\u7528\u662f\u5c06\u6240\u6709 key \u6784\u6210\u7684\u8f93\u5165\u7a7a\u95f4\u6620\u5c04\u5230\u6570\u7ec4\u6240\u6709\u7d22\u5f15\u6784\u6210\u7684\u8f93\u51fa\u7a7a\u95f4\uff0c\u800c\u8f93\u5165\u7a7a\u95f4\u5f80\u5f80\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\u3002\u56e0\u6b64\uff0c\u7406\u8bba\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u76f8\u540c\u8f93\u51fa\u201d\u7684\u60c5\u51b5\u3002

    \u5bf9\u4e8e\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u54c8\u5e0c\u51fd\u6570\uff0c\u5f53\u8f93\u5165\u7684 key \u540e\u4e24\u4f4d\u76f8\u540c\u65f6\uff0c\u54c8\u5e0c\u51fd\u6570\u7684\u8f93\u51fa\u7ed3\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8be2\u5b66\u53f7\u4e3a 12836 \u548c 20336 \u7684\u4e24\u4e2a\u5b66\u751f\u65f6\uff0c\u6211\u4eec\u5f97\u5230\uff1a

    12836 % 100 = 36\n20336 % 100 = 36\n

    \u5982\u56fe 6-3 \u6240\u793a\uff0c\u4e24\u4e2a\u5b66\u53f7\u6307\u5411\u4e86\u540c\u4e00\u4e2a\u59d3\u540d\uff0c\u8fd9\u663e\u7136\u662f\u4e0d\u5bf9\u7684\u3002\u6211\u4eec\u5c06\u8fd9\u79cd\u591a\u4e2a\u8f93\u5165\u5bf9\u5e94\u540c\u4e00\u8f93\u51fa\u7684\u60c5\u51b5\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\uff08hash collision\uff09\u3002

    \u56fe 6-3 \u00a0 \u54c8\u5e0c\u51b2\u7a81\u793a\u4f8b

    \u5bb9\u6613\u60f3\u5230\uff0c\u54c8\u5e0c\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u4e2a key \u88ab\u5206\u914d\u5230\u540c\u4e00\u4e2a\u6876\u4e2d\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\uff0c\u51b2\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002

    \u5982\u56fe 6-4 \u6240\u793a\uff0c\u6269\u5bb9\u524d\u952e\u503c\u5bf9 (136, A) \u548c (236, D) \u53d1\u751f\u51b2\u7a81\uff0c\u6269\u5bb9\u540e\u51b2\u7a81\u6d88\u5931\u3002

    \u56fe 6-4 \u00a0 \u54c8\u5e0c\u8868\u6269\u5bb9

    \u7c7b\u4f3c\u4e8e\u6570\u7ec4\u6269\u5bb9\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u9700\u5c06\u6240\u6709\u952e\u503c\u5bf9\u4ece\u539f\u54c8\u5e0c\u8868\u8fc1\u79fb\u81f3\u65b0\u54c8\u5e0c\u8868\uff0c\u975e\u5e38\u8017\u65f6\uff1b\u5e76\u4e14\u7531\u4e8e\u54c8\u5e0c\u8868\u5bb9\u91cf capacity \u6539\u53d8\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u6765\u91cd\u65b0\u8ba1\u7b97\u6240\u6709\u952e\u503c\u5bf9\u7684\u5b58\u50a8\u4f4d\u7f6e\uff0c\u8fd9\u8fdb\u4e00\u6b65\u589e\u52a0\u4e86\u6269\u5bb9\u8fc7\u7a0b\u7684\u8ba1\u7b97\u5f00\u9500\u3002\u4e3a\u6b64\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u9884\u7559\u8db3\u591f\u5927\u7684\u54c8\u5e0c\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u9891\u7e41\u6269\u5bb9\u3002

    \u8d1f\u8f7d\u56e0\u5b50\uff08load factor\uff09\u662f\u54c8\u5e0c\u8868\u7684\u4e00\u4e2a\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u7684\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u7528\u4e8e\u8861\u91cf\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u4e3a\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u89e6\u53d1\u6761\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u5f53\u8d1f\u8f7d\u56e0\u5b50\u8d85\u8fc7 \\(0.75\\) \u65f6\uff0c\u7cfb\u7edf\u4f1a\u5c06\u54c8\u5e0c\u8868\u6269\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

    "},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u8f93\u5165 key \uff0c\u54c8\u5e0c\u8868\u80fd\u591f\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u67e5\u8be2\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
    • \u5e38\u89c1\u7684\u54c8\u5e0c\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8be2\u3001\u6dfb\u52a0\u952e\u503c\u5bf9\u3001\u5220\u9664\u952e\u503c\u5bf9\u548c\u904d\u5386\u54c8\u5e0c\u8868\u7b49\u3002
    • \u54c8\u5e0c\u51fd\u6570\u5c06 key \u6620\u5c04\u4e3a\u6570\u7ec4\u7d22\u5f15\uff0c\u4ece\u800c\u8bbf\u95ee\u5bf9\u5e94\u6876\u5e76\u83b7\u53d6 value \u3002
    • \u4e24\u4e2a\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7ecf\u8fc7\u54c8\u5e0c\u51fd\u6570\u540e\u5f97\u5230\u76f8\u540c\u7684\u6570\u7ec4\u7d22\u5f15\uff0c\u5bfc\u81f4\u67e5\u8be2\u7ed3\u679c\u51fa\u9519\uff0c\u8fd9\u79cd\u73b0\u8c61\u88ab\u79f0\u4e3a\u54c8\u5e0c\u51b2\u7a81\u3002
    • \u54c8\u5e0c\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u54c8\u5e0c\u51b2\u7a81\u7684\u6982\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u6269\u5bb9\u54c8\u5e0c\u8868\u6765\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\u3002\u4e0e\u6570\u7ec4\u6269\u5bb9\u7c7b\u4f3c\uff0c\u54c8\u5e0c\u8868\u6269\u5bb9\u64cd\u4f5c\u7684\u5f00\u9500\u5f88\u5927\u3002
    • \u8d1f\u8f7d\u56e0\u5b50\u5b9a\u4e49\u4e3a\u54c8\u5e0c\u8868\u4e2d\u5143\u7d20\u6570\u91cf\u9664\u4ee5\u6876\u6570\u91cf\uff0c\u53cd\u6620\u4e86\u54c8\u5e0c\u51b2\u7a81\u7684\u4e25\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89e6\u53d1\u54c8\u5e0c\u8868\u6269\u5bb9\u7684\u6761\u4ef6\u3002
    • \u94fe\u5f0f\u5730\u5740\u901a\u8fc7\u5c06\u5355\u4e2a\u5143\u7d20\u8f6c\u5316\u4e3a\u94fe\u8868\uff0c\u5c06\u6240\u6709\u51b2\u7a81\u5143\u7d20\u5b58\u50a8\u5728\u540c\u4e00\u4e2a\u94fe\u8868\u4e2d\u3002\u7136\u800c\uff0c\u94fe\u8868\u8fc7\u957f\u4f1a\u964d\u4f4e\u67e5\u8be2\u6548\u7387\uff0c\u53ef\u4ee5\u901a\u8fc7\u8fdb\u4e00\u6b65\u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u7ea2\u9ed1\u6811\u6765\u63d0\u9ad8\u6548\u7387\u3002
    • \u5f00\u653e\u5bfb\u5740\u901a\u8fc7\u591a\u6b21\u63a2\u6d4b\u6765\u5904\u7406\u54c8\u5e0c\u51b2\u7a81\u3002\u7ebf\u6027\u63a2\u6d4b\u4f7f\u7528\u56fa\u5b9a\u6b65\u957f\uff0c\u7f3a\u70b9\u662f\u4e0d\u80fd\u5220\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u4ea7\u751f\u805a\u96c6\u3002\u591a\u6b21\u54c8\u5e0c\u4f7f\u7528\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u8fdb\u884c\u63a2\u6d4b\uff0c\u76f8\u8f83\u7ebf\u6027\u63a2\u6d4b\u66f4\u4e0d\u6613\u4ea7\u751f\u805a\u96c6\uff0c\u4f46\u591a\u4e2a\u54c8\u5e0c\u51fd\u6570\u589e\u52a0\u4e86\u8ba1\u7b97\u91cf\u3002
    • \u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u91c7\u53d6\u4e86\u4e0d\u540c\u7684\u54c8\u5e0c\u8868\u5b9e\u73b0\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u94fe\u5f0f\u5730\u5740\uff0c\u800c Python \u7684 Dict \u91c7\u7528\u5f00\u653e\u5bfb\u5740\u3002
    • \u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u6211\u4eec\u5e0c\u671b\u54c8\u5e0c\u7b97\u6cd5\u5177\u6709\u786e\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u5300\u5206\u5e03\u7684\u7279\u70b9\u3002\u5728\u5bc6\u7801\u5b66\u4e2d\uff0c\u54c8\u5e0c\u7b97\u6cd5\u8fd8\u5e94\u8be5\u5177\u5907\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u5e94\u3002
    • \u54c8\u5e0c\u7b97\u6cd5\u901a\u5e38\u91c7\u7528\u5927\u8d28\u6570\u4f5c\u4e3a\u6a21\u6570\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8bc1\u54c8\u5e0c\u503c\u5747\u5300\u5206\u5e03\uff0c\u51cf\u5c11\u54c8\u5e0c\u51b2\u7a81\u3002
    • \u5e38\u89c1\u7684\u54c8\u5e0c\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u4e8e\u6821\u9a8c\u6587\u4ef6\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u4e8e\u5b89\u5168\u5e94\u7528\u4e0e\u534f\u8bae\u3002
    • \u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u4f1a\u4e3a\u6570\u636e\u7c7b\u578b\u63d0\u4f9b\u5185\u7f6e\u54c8\u5e0c\u7b97\u6cd5\uff0c\u7528\u4e8e\u8ba1\u7b97\u54c8\u5e0c\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u53d8\u5bf9\u8c61\u662f\u53ef\u54c8\u5e0c\u7684\u3002
    "},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f \\(O(n)\\) \uff1f

    \u5f53\u54c8\u5e0c\u51b2\u7a81\u6bd4\u8f83\u4e25\u91cd\u65f6\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u5f53\u54c8\u5e0c\u51fd\u6570\u8bbe\u8ba1\u5f97\u6bd4\u8f83\u597d\u3001\u5bb9\u91cf\u8bbe\u7f6e\u6bd4\u8f83\u5408\u7406\u3001\u51b2\u7a81\u6bd4\u8f83\u5e73\u5747\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u4eec\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u54c8\u5e0c\u8868\u65f6\uff0c\u901a\u5e38\u8ba4\u4e3a\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(1)\\) \u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u4e0d\u4f7f\u7528\u54c8\u5e0c\u51fd\u6570 \\(f(x) = x\\) \u5462\uff1f\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u51b2\u7a81\u4e86\u3002

    \u5728 \\(f(x) = x\\) \u54c8\u5e0c\u51fd\u6570\u4e0b\uff0c\u6bcf\u4e2a\u5143\u7d20\u5bf9\u5e94\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u8fd9\u4e0e\u6570\u7ec4\u7b49\u4ef7\u3002\u7136\u800c\uff0c\u8f93\u5165\u7a7a\u95f4\u901a\u5e38\u8fdc\u5927\u4e8e\u8f93\u51fa\u7a7a\u95f4\uff08\u6570\u7ec4\u957f\u5ea6\uff09\uff0c\u56e0\u6b64\u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6\u53d6\u6a21\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u54c8\u5e0c\u8868\u7684\u76ee\u6807\u662f\u5c06\u4e00\u4e2a\u8f83\u5927\u7684\u72b6\u6001\u7a7a\u95f4\u6620\u5c04\u5230\u4e00\u4e2a\u8f83\u5c0f\u7684\u7a7a\u95f4\uff0c\u5e76\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8be2\u6548\u7387\u3002

    Q\uff1a\u54c8\u5e0c\u8868\u5e95\u5c42\u5b9e\u73b0\u662f\u6570\u7ec4\u3001\u94fe\u8868\u3001\u4e8c\u53c9\u6811\uff0c\u4f46\u4e3a\u4ec0\u4e48\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u4eec\u66f4\u9ad8\u5462\uff1f

    \u9996\u5148\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\uff0c\u4f46\u7a7a\u95f4\u6548\u7387\u53d8\u4f4e\u4e86\u3002\u54c8\u5e0c\u8868\u6709\u76f8\u5f53\u4e00\u90e8\u5206\u5185\u5b58\u672a\u4f7f\u7528\u3002

    \u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u573a\u666f\u4e0b\u65f6\u95f4\u6548\u7387\u53d8\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u4e2a\u529f\u80fd\u80fd\u591f\u5728\u76f8\u540c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u4f7f\u7528\u6570\u7ec4\u6216\u94fe\u8868\u5b9e\u73b0\uff0c\u90a3\u4e48\u901a\u5e38\u6bd4\u54c8\u5e0c\u8868\u66f4\u5feb\u3002\u8fd9\u662f\u56e0\u4e3a\u54c8\u5e0c\u51fd\u6570\u8ba1\u7b97\u9700\u8981\u5f00\u9500\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u7684\u5e38\u6570\u9879\u66f4\u5927\u3002

    \u6700\u540e\uff0c\u54c8\u5e0c\u8868\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u80fd\u53d1\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u94fe\u5f0f\u5730\u5740\u4e2d\uff0c\u6211\u4eec\u91c7\u53d6\u5728\u94fe\u8868\u6216\u7ea2\u9ed1\u6811\u4e2d\u6267\u884c\u67e5\u627e\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u65f6\u95f4\u7684\u98ce\u9669\u3002

    Q\uff1a\u591a\u6b21\u54c8\u5e0c\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\u5417\uff1f\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u8fd8\u80fd\u518d\u6b21\u4f7f\u7528\u5417\uff1f

    \u591a\u6b21\u54c8\u5e0c\u662f\u5f00\u653e\u5bfb\u5740\u7684\u4e00\u79cd\uff0c\u5f00\u653e\u5bfb\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u5220\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u901a\u8fc7\u6807\u8bb0\u5220\u9664\u3002\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u7a7a\u95f4\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u5f53\u5c06\u65b0\u5143\u7d20\u63d2\u5165\u54c8\u5e0c\u8868\uff0c\u5e76\u4e14\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u6807\u8bb0\u4e3a\u5df2\u5220\u9664\u7684\u4f4d\u7f6e\u65f6\uff0c\u8be5\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u8fd9\u6837\u505a\u65e2\u80fd\u4fdd\u6301\u54c8\u5e0c\u8868\u7684\u63a2\u6d4b\u5e8f\u5217\u4e0d\u53d8\uff0c\u53c8\u80fd\u4fdd\u8bc1\u54c8\u5e0c\u8868\u7684\u7a7a\u95f4\u4f7f\u7528\u7387\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u5728\u7ebf\u6027\u63a2\u6d4b\u4e2d\uff0c\u67e5\u627e\u5143\u7d20\u7684\u65f6\u5019\u4f1a\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\u5462\uff1f

    \u67e5\u627e\u7684\u65f6\u5019\u901a\u8fc7\u54c8\u5e0c\u51fd\u6570\u627e\u5230\u5bf9\u5e94\u7684\u6876\u548c\u952e\u503c\u5bf9\uff0c\u53d1\u73b0 key \u4e0d\u5339\u914d\uff0c\u8fd9\u5c31\u4ee3\u8868\u6709\u54c8\u5e0c\u51b2\u7a81\u3002\u56e0\u6b64\uff0c\u7ebf\u6027\u63a2\u6d4b\u6cd5\u4f1a\u6839\u636e\u9884\u5148\u8bbe\u5b9a\u7684\u6b65\u957f\u4f9d\u6b21\u5411\u4e0b\u67e5\u627e\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u786e\u7684\u952e\u503c\u5bf9\u6216\u65e0\u6cd5\u627e\u5230\u8df3\u51fa\u4e3a\u6b62\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48\u54c8\u5e0c\u8868\u6269\u5bb9\u80fd\u591f\u7f13\u89e3\u54c8\u5e0c\u51b2\u7a81\uff1f

    \u54c8\u5e0c\u51fd\u6570\u7684\u6700\u540e\u4e00\u6b65\u5f80\u5f80\u662f\u5bf9\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\uff0c\u8ba9\u8f93\u51fa\u503c\u843d\u5728\u6570\u7ec4\u7d22\u5f15\u8303\u56f4\u5185\uff1b\u5728\u6269\u5bb9\u540e\uff0c\u6570\u7ec4\u957f\u5ea6 \\(n\\) \u53d1\u751f\u53d8\u5316\uff0c\u800c key \u5bf9\u5e94\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u4e2a\u6876\u7684\u591a\u4e2a key \uff0c\u5728\u6269\u5bb9\u540e\u53ef\u80fd\u4f1a\u88ab\u5206\u914d\u5230\u591a\u4e2a\u6876\u4e2d\uff0c\u4ece\u800c\u5b9e\u73b0\u54c8\u5e0c\u51b2\u7a81\u7684\u7f13\u89e3\u3002

    "},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806","text":"

    Abstract

    \u5806\u5c31\u50cf\u662f\u5c71\u5cb3\u5cf0\u5ce6\uff0c\u5c42\u53e0\u8d77\u4f0f\u3001\u5f62\u6001\u5404\u5f02\u3002

    \u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u9519\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u603b\u662f\u6700\u5148\u6620\u5165\u773c\u5e18\u3002

    "},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 8.1 \u00a0 \u5806
    • 8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c
    • 8.3 \u00a0 Top-k \u95ee\u9898
    • 8.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u64cd\u4f5c","text":"

    \u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5e0c\u671b\u4f7f\u7528\u4e00\u4e2a\u5217\u8868\u7684\u6240\u6709\u5143\u7d20\u6765\u6784\u5efa\u4e00\u4e2a\u5806\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u88ab\u79f0\u4e3a\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u3002

    "},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u501f\u52a9\u5165\u5806\u64cd\u4f5c\u5b9e\u73b0","text":"

    \u6211\u4eec\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u7a7a\u5806\uff0c\u7136\u540e\u904d\u5386\u5217\u8868\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u5143\u7d20\u6267\u884c\u201c\u5165\u5806\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u5806\u7684\u5c3e\u90e8\uff0c\u518d\u5bf9\u8be5\u5143\u7d20\u6267\u884c\u201c\u4ece\u5e95\u81f3\u9876\u201d\u5806\u5316\u3002

    \u6bcf\u5f53\u4e00\u4e2a\u5143\u7d20\u5165\u5806\uff0c\u5806\u7684\u957f\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u4e8e\u8282\u70b9\u662f\u4ece\u9876\u5230\u5e95\u4f9d\u6b21\u88ab\u6dfb\u52a0\u8fdb\u4e8c\u53c9\u6811\u7684\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u6784\u5efa\u7684\u3002

    \u8bbe\u5143\u7d20\u6570\u91cf\u4e3a \\(n\\) \uff0c\u6bcf\u4e2a\u5143\u7d20\u7684\u5165\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u65f6\u95f4\uff0c\u56e0\u6b64\u8be5\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    "},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u901a\u8fc7\u904d\u5386\u5806\u5316\u5b9e\u73b0","text":"

    \u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u4e00\u79cd\u66f4\u4e3a\u9ad8\u6548\u7684\u5efa\u5806\u65b9\u6cd5\uff0c\u5171\u5206\u4e3a\u4e24\u6b65\u3002

    1. \u5c06\u5217\u8868\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u5730\u6dfb\u52a0\u5230\u5806\u4e2d\uff0c\u6b64\u65f6\u5806\u7684\u6027\u8d28\u5c1a\u672a\u5f97\u5230\u6ee1\u8db3\u3002
    2. \u5012\u5e8f\u904d\u5386\u5806\uff08\u5c42\u5e8f\u904d\u5386\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e2a\u975e\u53f6\u8282\u70b9\u6267\u884c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u3002

    \u6bcf\u5f53\u5806\u5316\u4e00\u4e2a\u8282\u70b9\u540e\uff0c\u4ee5\u8be5\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\u5c31\u5f62\u6210\u4e00\u4e2a\u5408\u6cd5\u7684\u5b50\u5806\u3002\u800c\u7531\u4e8e\u662f\u5012\u5e8f\u904d\u5386\uff0c\u56e0\u6b64\u5806\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u6784\u5efa\u7684\u3002

    \u4e4b\u6240\u4ee5\u9009\u62e9\u5012\u5e8f\u904d\u5386\uff0c\u662f\u56e0\u4e3a\u8fd9\u6837\u80fd\u591f\u4fdd\u8bc1\u5f53\u524d\u8282\u70b9\u4e4b\u4e0b\u7684\u5b50\u6811\u5df2\u7ecf\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u8fd9\u6837\u5806\u5316\u5f53\u524d\u8282\u70b9\u624d\u662f\u6709\u6548\u7684\u3002

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u7531\u4e8e\u53f6\u8282\u70b9\u6ca1\u6709\u5b50\u8282\u70b9\uff0c\u56e0\u6b64\u5b83\u4eec\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\uff0c\u65e0\u987b\u5806\u5316\u3002\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\uff0c\u6700\u540e\u4e00\u4e2a\u975e\u53f6\u8282\u70b9\u662f\u6700\u540e\u4e00\u4e2a\u8282\u70b9\u7684\u7236\u8282\u70b9\uff0c\u6211\u4eec\u4ece\u5b83\u5f00\u59cb\u5012\u5e8f\u904d\u5386\u5e76\u6267\u884c\u5806\u5316\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def __init__(self, nums: list[int]):\n    \"\"\"\u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\"\"\"\n    # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    self.max_heap = nums\n    # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
    my_heap.cpp
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(vector<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums;\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.java
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<Integer> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.cs
    /* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = new List<int>(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
    my_heap.go
    /* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        h.siftDown(i)\n    }\n    return h\n}\n
    my_heap.swift
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\ninit(nums: [Int]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    maxHeap = nums\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
    my_heap.js
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
    my_heap.ts
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u5efa\u7acb\u7a7a\u5806\u6216\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nconstructor(nums?: number[]) {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
    my_heap.dart
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nMaxHeap(List<int> nums) {\n  // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  _maxHeap = nums;\n  // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
    my_heap.rs
    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
    my_heap.c
    /* \u6784\u9020\u51fd\u6570\uff0c\u6839\u636e\u5207\u7247\u5efa\u5806 */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
    my_heap.kt
    /* \u5927\u9876\u5806 */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u5217\u8868\u800c\u975e\u6570\u7ec4\uff0c\u8fd9\u6837\u65e0\u987b\u8003\u8651\u6269\u5bb9\u95ee\u9898\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 */\n    init {\n        // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n        maxHeap.addAll(nums!!)\n        // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u6362\u5143\u7d20 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806 */\n    fun push(_val: Int) {\n        // \u6dfb\u52a0\u8282\u70b9\n        maxHeap.add(_val)\n        // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n            val p = parent(i)\n            // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, p)\n            // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806 */\n    fun pop(): Int {\n        // \u5224\u7a7a\u5904\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u5220\u9664\u8282\u70b9\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n        return _val\n    }\n\n    /* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n        var i = it\n        while (true) {\n            // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u6362\u4e24\u8282\u70b9\n            swap(i, ma)\n            // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n            i = ma\n        }\n    }\n\n    /* \u6253\u5370\u5806\uff08\u4e8c\u53c9\u6811\uff09 */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n
    my_heap.rb
    ### \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806 ###\ndef initialize(nums)\n  # \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n  @max_heap = nums\n  # \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n
    my_heap.zig
    // \u6784\u9020\u65b9\u6cd5\uff0c\u6839\u636e\u8f93\u5165\u5217\u8868\u5efa\u5806\nfn init(self: *Self, allocator: std.mem.Allocator, nums: []const T) !void {\n    if (self.max_heap != null) return;\n    self.max_heap = std.ArrayList(T).init(allocator);\n    // \u5c06\u5217\u8868\u5143\u7d20\u539f\u5c01\u4e0d\u52a8\u6dfb\u52a0\u8fdb\u5806\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"

    \u4e0b\u9762\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u63a8\u7b97\u7b2c\u4e8c\u79cd\u5efa\u5806\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002

    • \u5047\u8bbe\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \uff0c\u5219\u53f6\u8282\u70b9\u6570\u91cf\u4e3a \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u4e3a\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u5316\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\((n - 1) / 2\\) \u3002
    • \u5728\u4ece\u9876\u81f3\u5e95\u5806\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6bcf\u4e2a\u8282\u70b9\u6700\u591a\u5806\u5316\u5230\u53f6\u8282\u70b9\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u4e3a\u4e8c\u53c9\u6811\u9ad8\u5ea6 \\(\\log n\\) \u3002

    \u5c06\u4e0a\u8ff0\u4e24\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u8fc7\u7a0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u4f46\u8fd9\u4e2a\u4f30\u7b97\u7ed3\u679c\u5e76\u4e0d\u51c6\u786e\uff0c\u56e0\u4e3a\u6211\u4eec\u6ca1\u6709\u8003\u8651\u5230\u4e8c\u53c9\u6811\u5e95\u5c42\u8282\u70b9\u6570\u91cf\u8fdc\u591a\u4e8e\u9876\u5c42\u8282\u70b9\u7684\u6027\u8d28\u3002

    \u63a5\u4e0b\u6765\u6211\u4eec\u6765\u8fdb\u884c\u66f4\u4e3a\u51c6\u786e\u7684\u8ba1\u7b97\u3002\u4e3a\u4e86\u964d\u4f4e\u8ba1\u7b97\u96be\u5ea6\uff0c\u5047\u8bbe\u7ed9\u5b9a\u4e00\u4e2a\u8282\u70b9\u6570\u91cf\u4e3a \\(n\\) \u3001\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff0c\u8be5\u5047\u8bbe\u4e0d\u4f1a\u5f71\u54cd\u8ba1\u7b97\u7ed3\u679c\u7684\u6b63\u786e\u6027\u3002

    \u56fe 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u5404\u5c42\u8282\u70b9\u6570\u91cf

    \u5982\u56fe 8-5 \u6240\u793a\uff0c\u8282\u70b9\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6570\u7b49\u4e8e\u8be5\u8282\u70b9\u5230\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u800c\u8be5\u8ddd\u79bb\u6b63\u662f\u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u5bf9\u5404\u5c42\u7684\u201c\u8282\u70b9\u6570\u91cf \\(\\times\\) \u8282\u70b9\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u8282\u70b9\u7684\u5806\u5316\u8fed\u4ee3\u6b21\u6570\u7684\u603b\u548c\u3002

    \\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

    \u5316\u7b80\u4e0a\u5f0f\u9700\u8981\u501f\u52a9\u4e2d\u5b66\u7684\u6570\u5217\u77e5\u8bc6\uff0c\u5148\u5c06 \\(T(h)\\) \u4e58\u4ee5 \\(2\\) \uff0c\u5f97\u5230\uff1a

    \\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^{h}\\times1 \\newline \\end{aligned} \\]

    \u4f7f\u7528\u9519\u4f4d\u76f8\u51cf\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u51cf\u53bb\u4e0a\u5f0f \\(T(h)\\) \uff0c\u53ef\u5f97\uff1a

    \\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

    \u89c2\u5bdf\u4e0a\u5f0f\uff0c\u53d1\u73b0 \\(T(h)\\) \u662f\u4e00\u4e2a\u7b49\u6bd4\u6570\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\uff1a

    \\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

    \u8fdb\u4e00\u6b65\uff0c\u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u6570\u91cf\u4e3a \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u590d\u6742\u5ea6\u4e3a \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806","text":"

    \u5806\uff08heap\uff09\u662f\u4e00\u79cd\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u4e3b\u8981\u53ef\u5206\u4e3a\u4e24\u79cd\u7c7b\u578b\uff0c\u5982\u56fe 8-1 \u6240\u793a\u3002

    • \u5c0f\u9876\u5806\uff08min heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\leq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002
    • \u5927\u9876\u5806\uff08max heap\uff09\uff1a\u4efb\u610f\u8282\u70b9\u7684\u503c \\(\\geq\\) \u5176\u5b50\u8282\u70b9\u7684\u503c\u3002

    \u56fe 8-1 \u00a0 \u5c0f\u9876\u5806\u4e0e\u5927\u9876\u5806

    \u5806\u4f5c\u4e3a\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u6700\u5e95\u5c42\u8282\u70b9\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u3002
    • \u6211\u4eec\u5c06\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u9876\u201d\uff0c\u5c06\u5e95\u5c42\u6700\u9760\u53f3\u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5806\u5e95\u201d\u3002
    • \u5bf9\u4e8e\u5927\u9876\u5806\uff08\u5c0f\u9876\u5806\uff09\uff0c\u5806\u9876\u5143\u7d20\uff08\u6839\u8282\u70b9\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
    "},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u662f\u4f18\u5148\u961f\u5217\uff08priority queue\uff09\uff0c\u8fd9\u662f\u4e00\u79cd\u62bd\u8c61\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5b9a\u4e49\u4e3a\u5177\u6709\u4f18\u5148\u7ea7\u6392\u5e8f\u7684\u961f\u5217\u3002

    \u5b9e\u9645\u4e0a\uff0c\u5806\u901a\u5e38\u7528\u4e8e\u5b9e\u73b0\u4f18\u5148\u961f\u5217\uff0c\u5927\u9876\u5806\u76f8\u5f53\u4e8e\u5143\u7d20\u6309\u4ece\u5927\u5230\u5c0f\u7684\u987a\u5e8f\u51fa\u961f\u7684\u4f18\u5148\u961f\u5217\u3002\u4ece\u4f7f\u7528\u89d2\u5ea6\u6765\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u201c\u4f18\u5148\u961f\u5217\u201d\u548c\u201c\u5806\u201d\u770b\u4f5c\u7b49\u4ef7\u7684\u6570\u636e\u7ed3\u6784\u3002\u56e0\u6b64\uff0c\u672c\u4e66\u5bf9\u4e24\u8005\u4e0d\u505a\u7279\u522b\u533a\u5206\uff0c\u7edf\u4e00\u79f0\u4f5c\u201c\u5806\u201d\u3002

    \u5806\u7684\u5e38\u7528\u64cd\u4f5c\u89c1\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

    \u8868 8-1 \u00a0 \u5806\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u5806 \\(O(\\log n)\\) pop() \u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) peek() \u8bbf\u95ee\u5806\u9876\u5143\u7d20\uff08\u5bf9\u4e8e\u5927 / \u5c0f\u9876\u5806\u5206\u522b\u4e3a\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u83b7\u53d6\u5806\u7684\u5143\u7d20\u6570\u91cf \\(O(1)\\) isEmpty() \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a \\(O(1)\\)

    \u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u63d0\u4f9b\u7684\u5806\u7c7b\uff08\u6216\u4f18\u5148\u961f\u5217\u7c7b\uff09\u3002

    \u7c7b\u4f3c\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u201c\u4ece\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u4ece\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e2a flag \u6216\u4fee\u6539 Comparator \u5b9e\u73b0\u201c\u5c0f\u9876\u5806\u201d\u4e0e\u201c\u5927\u9876\u5806\u201d\u4e4b\u95f4\u7684\u8f6c\u6362\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9876\u5806\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u5757\u9ed8\u8ba4\u5b9e\u73b0\u5c0f\u9876\u5806\n# \u8003\u8651\u5c06\u201c\u5143\u7d20\u53d6\u8d1f\u201d\u540e\u518d\u5165\u5806\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5c06\u5927\u5c0f\u5173\u7cfb\u98a0\u5012\uff0c\u4ece\u800c\u5b9e\u73b0\u5927\u9876\u5806\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u65f6\u5bf9\u5e94\u5c0f\u9876\u5806\uff0cflag = -1 \u65f6\u5bf9\u5e94\u5927\u9876\u5806\n\n# \u5143\u7d20\u5165\u5806\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u83b7\u53d6\u5806\u9876\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u9876\u5143\u7d20\u51fa\u5806\n# \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u83b7\u53d6\u5806\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
    heap.cpp
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9876\u5806\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
    heap.java
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
    heap.cs
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y - x));\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
    heap.go
    // Go \u8bed\u8a00\u4e2d\u53ef\u4ee5\u901a\u8fc7\u5b9e\u73b0 heap.Interface \u6765\u6784\u5efa\u6574\u6570\u5927\u9876\u5806\n// \u5b9e\u73b0 heap.Interface \u9700\u8981\u540c\u65f6\u5b9e\u73b0 sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u63a8\u5165\u5143\u7d20\u5230\u5806\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u4e3a\u53c2\u6570\n    // \u56e0\u4e3a\u5b83\u4eec\u4e0d\u4ec5\u4f1a\u5bf9\u5207\u7247\u7684\u5185\u5bb9\u8fdb\u884c\u8c03\u6574\uff0c\u8fd8\u4f1a\u4fee\u6539\u5207\u7247\u7684\u957f\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5b9e\u73b0\u5f39\u51fa\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u5143\u7d20\u5b58\u653e\u5728\u6700\u540e\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// Len sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// Less sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u5982\u679c\u5b9e\u73b0\u5c0f\u9876\u5806\uff0c\u5219\u9700\u8981\u8c03\u6574\u4e3a\u5c0f\u4e8e\u53f7\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// Swap sort.Interface \u7684\u65b9\u6cd5\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u83b7\u53d6\u5806\u9876\u5143\u7d20\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u521d\u59cb\u5316\u5806 */\n    // \u521d\u59cb\u5316\u5927\u9876\u5806\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u6dfb\u52a0\u5143\u7d20\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u9876\u5143\u7d20\u4e3a %d\\n\", top)\n\n    /* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n    // \u8c03\u7528 heap.Interface \u7684\u65b9\u6cd5\uff0c\u6765\u79fb\u9664\u5143\u7d20\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u83b7\u53d6\u5806\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u5143\u7d20\u6570\u91cf\u4e3a %d\\n\", size)\n\n    /* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u662f\u5426\u4e3a\u7a7a %t\\n\", isEmpty)\n}\n
    heap.swift
    /* \u521d\u59cb\u5316\u5806 */\n// Swift \u7684 Heap \u7c7b\u578b\u540c\u65f6\u652f\u6301\u6700\u5927\u5806\u548c\u6700\u5c0f\u5806\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806 */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
    heap.js
    // JavaScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.ts
    // TypeScript \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.dart
    // Dart \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.rs
    use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9876\u5806\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806 */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
    heap.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.kt
    /* \u521d\u59cb\u5316\u5806 */\n// \u521d\u59cb\u5316\u5c0f\u9876\u5806\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9876\u5806\uff08\u4f7f\u7528 lambda \u8868\u8fbe\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806 */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u83b7\u53d6\u5806\u9876\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u9876\u5143\u7d20\u51fa\u5806 */\n// \u51fa\u5806\u5143\u7d20\u4f1a\u5f62\u6210\u4e00\u4e2a\u4ece\u5927\u5230\u5c0f\u7684\u5e8f\u5217\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u83b7\u53d6\u5806\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65ad\u5806\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f93\u5165\u5217\u8868\u5e76\u5efa\u5806 */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
    heap.rb
    # Ruby \u672a\u63d0\u4f9b\u5185\u7f6e Heap \u7c7b\n
    heap.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7684\u5b9e\u73b0","text":"

    \u4e0b\u6587\u5b9e\u73b0\u7684\u662f\u5927\u9876\u5806\u3002\u82e5\u8981\u5c06\u5176\u8f6c\u6362\u4e3a\u5c0f\u9876\u5806\uff0c\u53ea\u9700\u5c06\u6240\u6709\u5927\u5c0f\u903b\u8f91\u5224\u65ad\u8fdb\u884c\u9006\u8f6c\uff08\u4f8b\u5982\uff0c\u5c06 \\(\\geq\\) \u66ff\u6362\u4e3a \\(\\leq\\) \uff09\u3002\u611f\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

    "},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7684\u5b58\u50a8\u4e0e\u8868\u793a","text":"

    \u201c\u4e8c\u53c9\u6811\u201d\u7ae0\u8282\u8bb2\u8fc7\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u7531\u4e8e\u5806\u6b63\u662f\u4e00\u79cd\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u91c7\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002

    \u5f53\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u4e8c\u53c9\u6811\u65f6\uff0c\u5143\u7d20\u4ee3\u8868\u8282\u70b9\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u8282\u70b9\u5728\u4e8c\u53c9\u6811\u4e2d\u7684\u4f4d\u7f6e\u3002\u8282\u70b9\u6307\u9488\u901a\u8fc7\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u6765\u5b9e\u73b0\u3002

    \u5982\u56fe 8-2 \u6240\u793a\uff0c\u7ed9\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(2i + 2\\) \uff0c\u7236\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u5f53\u7d22\u5f15\u8d8a\u754c\u65f6\uff0c\u8868\u793a\u7a7a\u8282\u70b9\u6216\u8282\u70b9\u4e0d\u5b58\u5728\u3002

    \u56fe 8-2 \u00a0 \u5806\u7684\u8868\u793a\u4e0e\u5b58\u50a8

    \u6211\u4eec\u53ef\u4ee5\u5c06\u7d22\u5f15\u6620\u5c04\u516c\u5f0f\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def left(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
    my_heap.cpp
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.java
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.cs
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.go
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u5411\u4e0b\u6574\u9664\n    return (i - 1) / 2\n}\n
    my_heap.swift
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.js
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.ts
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.dart
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rs
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.c
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
    my_heap.kt
    /* \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rb
    ### \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef left(i)\n  2 * i + 1\nend\n\n### \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef right(i)\n  2 * i + 2\nend\n\n### \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\ndef parent(i)\n  (i - 1) / 2     # \u5411\u4e0b\u6574\u9664\nend\n
    my_heap.zig
    // \u83b7\u53d6\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u83b7\u53d6\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u83b7\u53d6\u7236\u8282\u70b9\u7684\u7d22\u5f15\nfn parent(i: usize) usize {\n    // return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n    return @divFloor(i - 1, 2);\n}\n
    "},{"location":"chapter_heap/heap/#2","title":"2. \u00a0 \u8bbf\u95ee\u5806\u9876\u5143\u7d20","text":"

    \u5806\u9876\u5143\u7d20\u5373\u4e3a\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u4e5f\u5c31\u662f\u5217\u8868\u7684\u9996\u4e2a\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def peek(self) -> int:\n    \"\"\"\u8bbf\u95ee\u5806\u9876\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
    my_heap.cpp
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
    my_heap.java
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
    my_heap.cs
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
    my_heap.go
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
    my_heap.swift
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
    my_heap.js
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
    my_heap.ts
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
    my_heap.dart
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
    my_heap.rs
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
    my_heap.c
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
    my_heap.kt
    /* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
    my_heap.rb
    ### \u8bbf\u95ee\u5806\u9876\u5143\u7d20 ###\ndef peek\n  @max_heap[0]\nend\n
    my_heap.zig
    // \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806","text":"

    \u7ed9\u5b9a\u5143\u7d20 val \uff0c\u6211\u4eec\u9996\u5148\u5c06\u5176\u6dfb\u52a0\u5230\u5806\u5e95\u3002\u6dfb\u52a0\u4e4b\u540e\uff0c\u7531\u4e8e val \u53ef\u80fd\u5927\u4e8e\u5806\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7684\u6210\u7acb\u6761\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u574f\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u590d\u4ece\u63d2\u5165\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u8fd9\u4e2a\u64cd\u4f5c\u88ab\u79f0\u4e3a\u5806\u5316\uff08heapify\uff09\u3002

    \u8003\u8651\u4ece\u5165\u5806\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u6267\u884c\u5806\u5316\u3002\u5982\u56fe 8-3 \u6240\u793a\uff0c\u6211\u4eec\u6bd4\u8f83\u63d2\u5165\u8282\u70b9\u4e0e\u5176\u7236\u8282\u70b9\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u8282\u70b9\u66f4\u5927\uff0c\u5219\u5c06\u5b83\u4eec\u4ea4\u6362\u3002\u7136\u540e\u7ee7\u7eed\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u4ece\u5e95\u81f3\u9876\u4fee\u590d\u5806\u4e2d\u7684\u5404\u4e2a\u8282\u70b9\uff0c\u76f4\u81f3\u8d8a\u8fc7\u6839\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

    <1><2><3><4><5><6><7><8><9>

    \u56fe 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u6b65\u9aa4

    \u8bbe\u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \uff0c\u5219\u6811\u7684\u9ad8\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u5316\u64cd\u4f5c\u7684\u5faa\u73af\u8f6e\u6570\u6700\u591a\u4e3a \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\"\"\"\n    # \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.append(val)\n    # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\"\"\"\n    while True:\n        # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p = self.parent(i)\n        # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p)\n        # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n
    my_heap.cpp
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.push_back(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap[i], maxHeap[p]);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u5165\u5806 */\nvoid Push(int val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.Add(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u5165\u5806 */\nfunc (h *maxHeap) push(val any) {\n    // \u6dfb\u52a0\u8282\u70b9\n    h.data = append(h.data, val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        p := h.parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u5165\u5806 */\nfunc push(val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.append(val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = parent(i: i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u5165\u5806 */\npush(val) {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.#maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.#parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u5165\u5806 */\npush(val: number): void {\n    // \u6dfb\u52a0\u8282\u70b9\n    this.maxHeap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        const p = this.parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(int val) {\n  // \u6dfb\u52a0\u8282\u70b9\n  _maxHeap.add(val);\n  // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  siftUp(size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    int p = _parent(i);\n    // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, p);\n    // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u5165\u5806 */\nfn push(&mut self, val: i32) {\n    // \u6dfb\u52a0\u8282\u70b9\n    self.max_heap.push(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u8282\u70b9 i \u5df2\u7ecf\u662f\u5806\u9876\u8282\u70b9\u4e86\uff0c\u7ed3\u675f\u5806\u5316\n        if i == 0 {\n            break;\n        }\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        let p = Self::parent(i);\n        // \u5f53\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u5165\u5806 */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4e0d\u5e94\u8be5\u6dfb\u52a0\u8fd9\u4e48\u591a\u8282\u70b9\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        int p = parent(maxHeap, i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u5165\u5806 */\nfun push(_val: Int) {\n    // \u6dfb\u52a0\u8282\u70b9\n    maxHeap.add(_val)\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    siftUp(size() - 1)\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        val p = parent(i)\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, p)\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p\n    }\n}\n
    my_heap.rb
    ### \u5143\u7d20\u5165\u5806 ###\ndef push(val)\n  # \u6dfb\u52a0\u8282\u70b9\n  @max_heap << val\n  # \u4ece\u5e95\u81f3\u9876\u5806\u5316\n  sift_up(size - 1)\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316 ###\ndef sift_up(i)\n  loop do\n    # \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n    p = parent(i)\n    # \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, p)\n    # \u5faa\u73af\u5411\u4e0a\u5806\u5316\n    i = p\n  end\nend\n
    my_heap.zig
    // \u5143\u7d20\u5165\u5806\nfn push(self: *Self, val: T) !void {\n    // \u6dfb\u52a0\u8282\u70b9\n    try self.max_heap.?.append(val);\n    // \u4ece\u5e95\u81f3\u9876\u5806\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u5e95\u81f3\u9876\u5806\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u83b7\u53d6\u8282\u70b9 i \u7684\u7236\u8282\u70b9\n        var p = parent(i);\n        // \u5f53\u201c\u8d8a\u8fc7\u6839\u8282\u70b9\u201d\u6216\u201c\u8282\u70b9\u65e0\u987b\u4fee\u590d\u201d\u65f6\uff0c\u7ed3\u675f\u5806\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, p);\n        // \u5faa\u73af\u5411\u4e0a\u5806\u5316\n        i = p;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806","text":"

    \u5806\u9876\u5143\u7d20\u662f\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9\uff0c\u5373\u5217\u8868\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u4eec\u76f4\u63a5\u4ece\u5217\u8868\u4e2d\u5220\u9664\u9996\u5143\u7d20\uff0c\u90a3\u4e48\u4e8c\u53c9\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u7d22\u5f15\u90fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u8fd9\u5c06\u4f7f\u5f97\u540e\u7eed\u4f7f\u7528\u5806\u5316\u8fdb\u884c\u4fee\u590d\u53d8\u5f97\u56f0\u96be\u3002\u4e3a\u4e86\u5c3d\u91cf\u51cf\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u53d8\u52a8\uff0c\u6211\u4eec\u91c7\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9aa4\u3002

    1. \u4ea4\u6362\u5806\u9876\u5143\u7d20\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff09\u3002
    2. \u4ea4\u6362\u5b8c\u6210\u540e\uff0c\u5c06\u5806\u5e95\u4ece\u5217\u8868\u4e2d\u5220\u9664\uff08\u6ce8\u610f\uff0c\u7531\u4e8e\u5df2\u7ecf\u4ea4\u6362\uff0c\u56e0\u6b64\u5b9e\u9645\u4e0a\u5220\u9664\u7684\u662f\u539f\u6765\u7684\u5806\u9876\u5143\u7d20\uff09\u3002
    3. \u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u6267\u884c\u5806\u5316\u3002

    \u5982\u56fe 8-4 \u6240\u793a\uff0c\u201c\u4ece\u9876\u81f3\u5e95\u5806\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u4e0e\u201c\u4ece\u5e95\u81f3\u9876\u5806\u5316\u201d\u76f8\u53cd\uff0c\u6211\u4eec\u5c06\u6839\u8282\u70b9\u7684\u503c\u4e0e\u5176\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u503c\u8fdb\u884c\u6bd4\u8f83\uff0c\u5c06\u6700\u5927\u7684\u5b50\u8282\u70b9\u4e0e\u6839\u8282\u70b9\u4ea4\u6362\u3002\u7136\u540e\u5faa\u73af\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\u6216\u9047\u5230\u65e0\u987b\u4ea4\u6362\u7684\u8282\u70b9\u65f6\u7ed3\u675f\u3002

    <1><2><3><4><5><6><7><8><9><10>

    \u56fe 8-4 \u00a0 \u5806\u9876\u5143\u7d20\u51fa\u5806\u6b65\u9aa4

    \u4e0e\u5143\u7d20\u5165\u5806\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u9876\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4e3a \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\"\"\"\n    # \u5224\u7a7a\u5904\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u4e3a\u7a7a\")\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u5220\u9664\u8282\u70b9\n    val = self.max_heap.pop()\n    # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma)\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n
    my_heap.cpp
    /* \u5143\u7d20\u51fa\u5806 */\nvoid pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u4e3a\u7a7a\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u5220\u9664\u8282\u70b9\n    maxHeap.pop_back();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.remove(size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u51fa\u5806 */\nint Pop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u82e5\u201c\u8282\u70b9 i \u6700\u5927\u201d\u6216\u201c\u8d8a\u8fc7\u53f6\u8282\u70b9\u201d\uff0c\u5219\u7ed3\u675f\u5806\u5316\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        Swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u51fa\u5806 */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u5904\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u5220\u9664\u8282\u70b9\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        h.swap(i, max)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u51fa\u5806 */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u5904\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u4e3a\u7a7a\")\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    let val = maxHeap.remove(at: size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i: i, j: ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u51fa\u5806 */\npop() {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u4e3a\u7a7a');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.#maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.#swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u51fa\u5806 */\npop(): number {\n    // \u5224\u7a7a\u5904\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    const val = this.maxHeap.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        this.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u51fa\u5806 */\nint pop() {\n  // \u5224\u7a7a\u5904\u7406\n  if (isEmpty()) throw Exception('\u5806\u4e3a\u7a7a');\n  // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u5220\u9664\u8282\u70b9\n  int val = _maxHeap.removeLast();\n  // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    _swap(i, ma);\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u51fa\u5806 */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u5904\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    let val = self.max_heap.pop().unwrap();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u51fa\u5806 */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u5220\u9664\u8282\u70b9\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(maxHeap, i, max);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = max;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u51fa\u5806 */\nfun pop(): Int {\n    // \u5224\u7a7a\u5904\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u5220\u9664\u8282\u70b9\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return _val\n}\n\n/* \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u6570\u53c2\u6570\u4e0d\u53ef\u53d8\uff0c\u56e0\u6b64\u521b\u5efa\u4e34\u65f6\u53d8\u91cf\n    var i = it\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n
    my_heap.rb
    ### \u5143\u7d20\u51fa\u5806 ###\ndef pop\n  # \u5224\u7a7a\u5904\u7406\n  raise IndexError, \"\u5806\u4e3a\u7a7a\" if is_empty?\n  # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n  swap(0, size - 1)\n  # \u5220\u9664\u8282\u70b9\n  val = @max_heap.pop\n  # \u4ece\u9876\u81f3\u5e95\u5806\u5316\n  sift_down(0)\n  # \u8fd4\u56de\u5806\u9876\u5143\u7d20\n  val\nend\n\n### \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(i)\n  loop do\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    swap(i, ma)\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n
    my_heap.zig
    // \u5143\u7d20\u51fa\u5806\nfn pop(self: *Self) !T {\n    // \u5224\u65ad\u5904\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u5220\u9664\u8282\u70b9\n    var val = self.max_heap.?.pop();\n    // \u4ece\u9876\u81f3\u5e95\u5806\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u9876\u5143\u7d20\n    return val;\n} \n\n// \u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        var l = left(i);\n        var r = right(i);\n        var ma = i;\n        if (l < self.size() and self.max_heap.?.items[l] > self.max_heap.?.items[ma]) ma = l;\n        if (r < self.size() and self.max_heap.?.items[r] > self.max_heap.?.items[ma]) ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        try self.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7684\u5e38\u89c1\u5e94\u7528","text":"
    • \u4f18\u5148\u961f\u5217\uff1a\u5806\u901a\u5e38\u4f5c\u4e3a\u5b9e\u73b0\u4f18\u5148\u961f\u5217\u7684\u9996\u9009\u6570\u636e\u7ed3\u6784\uff0c\u5176\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \uff0c\u800c\u5efa\u5806\u64cd\u4f5c\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
    • \u5806\u6392\u5e8f\uff1a\u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u5b83\u4eec\u5efa\u7acb\u4e00\u4e2a\u5806\uff0c\u7136\u540e\u4e0d\u65ad\u5730\u6267\u884c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\uff0c\u4ece\u800c\u5f97\u5230\u6709\u5e8f\u6570\u636e\u3002\u7136\u800c\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u4f7f\u7528\u4e00\u79cd\u66f4\u4f18\u96c5\u7684\u65b9\u5f0f\u5b9e\u73b0\u5806\u6392\u5e8f\uff0c\u8be6\u89c1\u201c\u5806\u6392\u5e8f\u201d\u7ae0\u8282\u3002
    • \u83b7\u53d6\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff1a\u8fd9\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u7b97\u6cd5\u95ee\u9898\uff0c\u540c\u65f6\u4e5f\u662f\u4e00\u79cd\u5178\u578b\u5e94\u7528\uff0c\u4f8b\u5982\u9009\u62e9\u70ed\u5ea6\u524d 10 \u7684\u65b0\u95fb\u4f5c\u4e3a\u5fae\u535a\u70ed\u641c\uff0c\u9009\u53d6\u9500\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
    "},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u5806\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u6839\u636e\u6210\u7acb\u6761\u4ef6\u53ef\u5206\u4e3a\u5927\u9876\u5806\u548c\u5c0f\u9876\u5806\u3002\u5927\uff08\u5c0f\uff09\u9876\u5806\u7684\u5806\u9876\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
    • \u4f18\u5148\u961f\u5217\u7684\u5b9a\u4e49\u662f\u5177\u6709\u51fa\u961f\u4f18\u5148\u7ea7\u7684\u961f\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u6765\u5b9e\u73b0\u3002
    • \u5806\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5bf9\u5e94\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806 \\(O(\\log n)\\)\u3001\u5806\u9876\u5143\u7d20\u51fa\u5806 \\(O(\\log n)\\) \u548c\u8bbf\u95ee\u5806\u9876\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
    • \u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u7528\u6570\u7ec4\u8868\u793a\uff0c\u56e0\u6b64\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u6570\u7ec4\u6765\u5b58\u50a8\u5806\u3002
    • \u5806\u5316\u64cd\u4f5c\u7528\u4e8e\u7ef4\u62a4\u5806\u7684\u6027\u8d28\uff0c\u5728\u5165\u5806\u548c\u51fa\u5806\u64cd\u4f5c\u4e2d\u90fd\u4f1a\u7528\u5230\u3002
    • \u8f93\u5165 \\(n\\) \u4e2a\u5143\u7d20\u5e76\u5efa\u5806\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
    • Top-k \u662f\u4e00\u4e2a\u7ecf\u5178\u7b97\u6cd5\u95ee\u9898\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u6570\u636e\u7ed3\u6784\u9ad8\u6548\u89e3\u51b3\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002
    "},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6570\u636e\u7ed3\u6784\u7684\u201c\u5806\u201d\u4e0e\u5185\u5b58\u7ba1\u7406\u7684\u201c\u5806\u201d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\u5417\uff1f

    \u4e24\u8005\u4e0d\u662f\u540c\u4e00\u4e2a\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u201d\u3002\u8ba1\u7b97\u673a\u7cfb\u7edf\u5185\u5b58\u4e2d\u7684\u5806\u662f\u52a8\u6001\u5185\u5b58\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5e8f\u5728\u8fd0\u884c\u65f6\u53ef\u4ee5\u4f7f\u7528\u5b83\u6765\u5b58\u50a8\u6570\u636e\u3002\u7a0b\u5e8f\u53ef\u4ee5\u8bf7\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u5185\u5b58\uff0c\u7528\u4e8e\u5b58\u50a8\u5982\u5bf9\u8c61\u548c\u6570\u7ec4\u7b49\u590d\u6742\u7ed3\u6784\u3002\u5f53\u8fd9\u4e9b\u6570\u636e\u4e0d\u518d\u9700\u8981\u65f6\uff0c\u7a0b\u5e8f\u9700\u8981\u91ca\u653e\u8fd9\u4e9b\u5185\u5b58\uff0c\u4ee5\u9632\u6b62\u5185\u5b58\u6cc4\u6f0f\u3002\u76f8\u8f83\u4e8e\u6808\u5185\u5b58\uff0c\u5806\u5185\u5b58\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8c28\u614e\uff0c\u4f7f\u7528\u4e0d\u5f53\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\u548c\u91ce\u6307\u9488\u7b49\u95ee\u9898\u3002

    "},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u95ee\u9898","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u65e0\u5e8f\u6570\u7ec4 nums \uff0c\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002

    \u5bf9\u4e8e\u8be5\u95ee\u9898\uff0c\u6211\u4eec\u5148\u4ecb\u7ecd\u4e24\u79cd\u601d\u8def\u6bd4\u8f83\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7ecd\u6548\u7387\u66f4\u9ad8\u7684\u5806\u89e3\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u904d\u5386\u9009\u62e9","text":"

    \u6211\u4eec\u53ef\u4ee5\u8fdb\u884c\u56fe 8-6 \u6240\u793a\u7684 \\(k\\) \u8f6e\u904d\u5386\uff0c\u5206\u522b\u5728\u6bcf\u8f6e\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\) \u3002

    \u6b64\u65b9\u6cd5\u53ea\u9002\u7528\u4e8e \\(k \\ll n\\) \u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u5f53 \\(k\\) \u4e0e \\(n\\) \u6bd4\u8f83\u63a5\u8fd1\u65f6\uff0c\u5176\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411\u4e8e \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u65f6\u3002

    \u56fe 8-6 \u00a0 \u904d\u5386\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

    Tip

    \u5f53 \\(k = n\\) \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u65f6\u7b49\u4ef7\u4e8e\u201c\u9009\u62e9\u6392\u5e8f\u201d\u7b97\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

    \u5982\u56fe 8-7 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u5bf9\u6570\u7ec4 nums \u8fdb\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u8fb9\u7684 \\(k\\) \u4e2a\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002

    \u663e\u7136\uff0c\u8be5\u65b9\u6cd5\u201c\u8d85\u989d\u201d\u5b8c\u6210\u4efb\u52a1\u4e86\uff0c\u56e0\u4e3a\u6211\u4eec\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

    \u56fe 8-7 \u00a0 \u6392\u5e8f\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

    "},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806","text":"

    \u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u5806\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u51b3 Top-k \u95ee\u9898\uff0c\u6d41\u7a0b\u5982\u56fe 8-8 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5176\u5806\u9876\u5143\u7d20\u6700\u5c0f\u3002
    2. \u5148\u5c06\u6570\u7ec4\u7684\u524d \\(k\\) \u4e2a\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u3002
    3. \u4ece\u7b2c \\(k + 1\\) \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\uff0c\u5e76\u5c06\u5f53\u524d\u5143\u7d20\u5165\u5806\u3002
    4. \u904d\u5386\u5b8c\u6210\u540e\uff0c\u5806\u4e2d\u4fdd\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u3002
    <1><2><3><4><5><6><7><8><9>

    \u56fe 8-8 \u00a0 \u57fa\u4e8e\u5806\u5bfb\u627e\u6700\u5927\u7684 k \u4e2a\u5143\u7d20

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
    def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    heap = []\n    # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in range(k, len(nums)):\n        # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
    top_k.cpp
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.java
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.cs
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    PriorityQueue<int, int> heap = new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.go
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
    top_k.swift
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5c0f\u9876\u5806\uff0c\u5e76\u5c06\u524d k \u4e2a\u5143\u7d20\u5efa\u5806\n    var heap = Heap(nums.prefix(k))\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
    top_k.js
    /* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.ts
    /* \u5143\u7d20\u5165\u5806 */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    const maxHeap = new MaxHeap([]);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.dart
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9876\u5806\uff0c\u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
    top_k.rs
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9876\u5806\uff0c\u4f7f\u7528 Reverse \u5c06\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u5b9e\u73b0\u5c0f\u9876\u5806\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
    top_k.c
    /* \u5143\u7d20\u5165\u5806 */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806 */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8bbf\u95ee\u5806\u9876\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u53d6\u51fa\u5806\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u5e76\u5b58\u5165 res \u6570\u7ec4\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20\u7684\u51fd\u6570\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    // \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91ca\u653e\u5185\u5b58\n    delMaxHeap(maxHeap);\n    return res;\n}\n
    top_k.kt
    /* \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9876\u5806\n    val heap = PriorityQueue<Int>()\n    // \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n    for (i in k..<nums.size) {\n        // \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
    top_k.rb
    ### \u57fa\u4e8e\u5806\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5927\u7684 k \u4e2a\u5143\u7d20 ###\ndef top_k_heap(nums, k)\n  # \u521d\u59cb\u5316\u5c0f\u9876\u5806\n  # \u8bf7\u6ce8\u610f\uff1a\u6211\u4eec\u5c06\u5806\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u4ece\u800c\u7528\u5927\u9876\u5806\u6765\u6a21\u62df\u5c0f\u9876\u5806\n  max_heap = MaxHeap.new([])\n\n  # \u5c06\u6570\u7ec4\u7684\u524d k \u4e2a\u5143\u7d20\u5165\u5806\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u4ece\u7b2c k+1 \u4e2a\u5143\u7d20\u5f00\u59cb\uff0c\u4fdd\u6301\u5806\u7684\u957f\u5ea6\u4e3a k\n  for i in k...nums.length\n    # \u82e5\u5f53\u524d\u5143\u7d20\u5927\u4e8e\u5806\u9876\u5143\u7d20\uff0c\u5219\u5c06\u5806\u9876\u5143\u7d20\u51fa\u5806\u3001\u5f53\u524d\u5143\u7d20\u5165\u5806\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u603b\u5171\u6267\u884c\u4e86 \\(n\\) \u8f6e\u5165\u5806\u548c\u51fa\u5806\uff0c\u5806\u7684\u6700\u5927\u957f\u5ea6\u4e3a \\(k\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log k)\\) \u3002\u8be5\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u5f53 \\(k\\) \u8f83\u5c0f\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \uff1b\u5f53 \\(k\\) \u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(O(n \\log n)\\) \u3002

    \u53e6\u5916\uff0c\u8be5\u65b9\u6cd5\u9002\u7528\u4e8e\u52a8\u6001\u6570\u636e\u6d41\u7684\u4f7f\u7528\u573a\u666f\u3002\u5728\u4e0d\u65ad\u52a0\u5165\u6570\u636e\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u6301\u7eed\u7ef4\u62a4\u5806\u5185\u7684\u5143\u7d20\uff0c\u4ece\u800c\u5b9e\u73b0\u6700\u5927\u7684 \\(k\\) \u4e2a\u5143\u7d20\u7684\u52a8\u6001\u66f4\u65b0\u3002

    "},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

    \u51e0\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u5251\u6307 Offer\u201d\u7cfb\u5217\u9898\u89e3\uff0c\u53d7\u5230\u4e86\u8bb8\u591a\u8bfb\u8005\u7684\u9f13\u52b1\u548c\u652f\u6301\u3002\u5728\u4e0e\u8bfb\u8005\u4ea4\u6d41\u671f\u95f4\uff0c\u6211\u6700\u5e38\u88ab\u95ee\u7684\u4e00\u4e2a\u95ee\u9898\u662f\u201c\u5982\u4f55\u5165\u95e8\u7b97\u6cd5\u201d\u3002\u9010\u6e10\u5730\uff0c\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u4ea7\u751f\u4e86\u6d53\u539a\u7684\u5174\u8da3\u3002

    \u4e24\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u9898\u4f3c\u4e4e\u662f\u6700\u53d7\u6b22\u8fce\u7684\u65b9\u6cd5\uff0c\u7b80\u5355\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u9898\u5c31\u5982\u540c\u73a9\u201c\u626b\u96f7\u201d\u6e38\u620f\uff0c\u81ea\u5b66\u80fd\u529b\u5f3a\u7684\u4eba\u80fd\u591f\u987a\u5229\u5c06\u5730\u96f7\u9010\u4e2a\u6392\u6389\uff0c\u800c\u57fa\u7840\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6ee1\u5934\u662f\u5305\uff0c\u5e76\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7f29\u3002\u901a\u8bfb\u6559\u6750\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u505a\u6cd5\uff0c\u4f46\u5bf9\u4e8e\u9762\u5411\u6c42\u804c\u7684\u4eba\u6765\u8bf4\uff0c\u6bd5\u4e1a\u8bba\u6587\u3001\u6295\u9012\u7b80\u5386\u3001\u51c6\u5907\u7b14\u8bd5\u548c\u9762\u8bd5\u5df2\u7ecf\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u4e66\u5f80\u5f80\u53d8\u6210\u4e86\u4e00\u9879\u8270\u5de8\u7684\u6311\u6218\u3002

    \u5982\u679c\u4f60\u4e5f\u9762\u4e34\u7c7b\u4f3c\u7684\u56f0\u6270\uff0c\u90a3\u4e48\u5f88\u5e78\u8fd0\u8fd9\u672c\u4e66\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u4e66\u662f\u6211\u5bf9\u8fd9\u4e2a\u95ee\u9898\u7ed9\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u4f18\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u79ef\u6781\u7684\u5c1d\u8bd5\u3002\u672c\u4e66\u867d\u7136\u4e0d\u8db3\u4ee5\u8ba9\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u4f1a\u5f15\u5bfc\u4f60\u63a2\u7d22\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u201c\u77e5\u8bc6\u5730\u56fe\u201d\uff0c\u5e26\u4f60\u4e86\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72b6\u3001\u5927\u5c0f\u548c\u5206\u5e03\u4f4d\u7f6e\uff0c\u8ba9\u4f60\u638c\u63e1\u5404\u79cd\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u8fd9\u4e9b\u672c\u9886\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u9898\u548c\u9605\u8bfb\u6587\u732e\uff0c\u9010\u6b65\u6784\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8bc6\u4f53\u7cfb\u3002

    \u6211\u6df1\u6df1\u8d5e\u540c\u8d39\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u4ece\u8fd9\u4e2a\u610f\u4e49\u4e0a\u770b\uff0c\u8fd9\u672c\u4e66\u5e76\u975e\u5b8c\u5168\u201c\u514d\u8d39\u201d\u3002\u4e3a\u4e86\u4e0d\u8f9c\u8d1f\u4f60\u4e3a\u672c\u4e66\u6240\u4ed8\u51fa\u7684\u5b9d\u8d35\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u4f1a\u7aed\u5c3d\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u6765\u5b8c\u6210\u672c\u4e66\u7684\u521b\u4f5c\u3002

    \u672c\u4eba\u81ea\u77e5\u5b66\u758f\u624d\u6d45\uff0c\u4e66\u4e2d\u5185\u5bb9\u867d\u7136\u5df2\u7ecf\u8fc7\u4e00\u6bb5\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8bb8\u591a\u9519\u8bef\uff0c\u6073\u8bf7\u5404\u4f4d\u8001\u5e08\u548c\u540c\u5b66\u6279\u8bc4\u6307\u6b63\u3002

    Hello\uff0c\u7b97\u6cd5\uff01

    \u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u7ed9\u4e16\u754c\u5e26\u6765\u4e86\u5de8\u5927\u53d8\u9769\uff0c\u5b83\u51ed\u501f\u9ad8\u901f\u7684\u8ba1\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7f16\u7a0b\u6027\uff0c\u6210\u4e3a\u4e86\u6267\u884c\u7b97\u6cd5\u4e0e\u5904\u7406\u6570\u636e\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u65e0\u8bba\u662f\u7535\u5b50\u6e38\u620f\u7684\u903c\u771f\u753b\u9762\u3001\u81ea\u52a8\u9a7e\u9a76\u7684\u667a\u80fd\u51b3\u7b56\uff0c\u8fd8\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4ea4\u4e92\uff0c\u8fd9\u4e9b\u5e94\u7528\u90fd\u662f\u7b97\u6cd5\u5728\u8ba1\u7b97\u673a\u4e0a\u7684\u7cbe\u5999\u6f14\u7ece\u3002

    \u4e8b\u5b9e\u4e0a\uff0c\u5728\u8ba1\u7b97\u673a\u95ee\u4e16\u4e4b\u524d\uff0c\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u5c31\u5df2\u7ecf\u5b58\u5728\u4e8e\u4e16\u754c\u7684\u5404\u4e2a\u89d2\u843d\u3002\u65e9\u671f\u7684\u7b97\u6cd5\u76f8\u5bf9\u7b80\u5355\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8ba1\u6570\u65b9\u6cd5\u548c\u5de5\u5177\u5236\u4f5c\u6b65\u9aa4\u7b49\u3002\u968f\u7740\u6587\u660e\u7684\u8fdb\u6b65\uff0c\u7b97\u6cd5\u9010\u6e10\u53d8\u5f97\u66f4\u52a0\u7cbe\u7ec6\u548c\u590d\u6742\u3002\u4ece\u5de7\u593a\u5929\u5de5\u7684\u5320\u4eba\u6280\u827a\u3001\u5230\u89e3\u653e\u751f\u4ea7\u529b\u7684\u5de5\u4e1a\u4ea7\u54c1\u3001\u518d\u5230\u5b87\u5b99\u8fd0\u884c\u7684\u79d1\u5b66\u89c4\u5f8b\uff0c\u51e0\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u60ca\u53f9\u7684\u4e8b\u7269\u80cc\u540e\uff0c\u90fd\u9690\u85cf\u7740\u7cbe\u5999\u7684\u7b97\u6cd5\u601d\u60f3\u3002

    \u540c\u6837\uff0c\u6570\u636e\u7ed3\u6784\u65e0\u5904\u4e0d\u5728\uff1a\u5927\u5230\u793e\u4f1a\u7f51\u7edc\uff0c\u5c0f\u5230\u5730\u94c1\u7ebf\u8def\uff0c\u8bb8\u591a\u7cfb\u7edf\u90fd\u53ef\u4ee5\u5efa\u6a21\u4e3a\u201c\u56fe\u201d\uff1b\u5927\u5230\u4e00\u4e2a\u56fd\u5bb6\uff0c\u5c0f\u5230\u4e00\u4e2a\u5bb6\u5ead\uff0c\u793e\u4f1a\u7684\u4e3b\u8981\u7ec4\u7ec7\u5f62\u5f0f\u5448\u73b0\u51fa\u201c\u6811\u201d\u7684\u7279\u5f81\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u6808\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u540e\u624d\u80fd\u8131\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5219\u5982\u540c\u201c\u961f\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u4e2a\u201c\u54c8\u5e0c\u8868\u201d\uff0c\u80fd\u591f\u5feb\u901f\u67e5\u627e\u76ee\u6807\u8bcd\u6761\u3002

    \u672c\u4e66\u65e8\u5728\u901a\u8fc7\u6e05\u6670\u6613\u61c2\u7684\u52a8\u753b\u56fe\u89e3\u548c\u53ef\u8fd0\u884c\u7684\u4ee3\u7801\u793a\u4f8b\uff0c\u4f7f\u8bfb\u8005\u7406\u89e3\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u5e76\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u6765\u5b9e\u73b0\u5b83\u4eec\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u672c\u4e66\u81f4\u529b\u4e8e\u63ed\u793a\u7b97\u6cd5\u5728\u590d\u6742\u4e16\u754c\u4e2d\u7684\u751f\u52a8\u4f53\u73b0\uff0c\u5c55\u73b0\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

    "},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8bc6\u7b97\u6cd5","text":"

    Abstract

    \u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u4e0e\u6570\u636e\u4ea4\u7ec7\u5728\u4e00\u8d77\uff0c\u88d9\u6446\u4e0a\u98d8\u626c\u7740\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

    \u5979\u9080\u8bf7\u4f60\u5171\u821e\uff0c\u8bf7\u7d27\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6ee1\u903b\u8f91\u4e0e\u7f8e\u611f\u7684\u7b97\u6cd5\u4e16\u754c\u3002

    "},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728
    • 1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48
    • 1.3 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u7b97\u6cd5\u65e0\u5904\u4e0d\u5728","text":"

    \u5f53\u6211\u4eec\u542c\u5230\u201c\u7b97\u6cd5\u201d\u8fd9\u4e2a\u8bcd\u65f6\uff0c\u5f88\u81ea\u7136\u5730\u4f1a\u60f3\u5230\u6570\u5b66\u3002\u7136\u800c\u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7b97\u6cd5\u5e76\u4e0d\u6d89\u53ca\u590d\u6742\u6570\u5b66\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8d56\u57fa\u672c\u903b\u8f91\uff0c\u8fd9\u4e9b\u903b\u8f91\u5728\u6211\u4eec\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u5904\u5904\u53ef\u89c1\u3002

    \u5728\u6b63\u5f0f\u63a2\u8ba8\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u4e2a\u6709\u8da3\u7684\u4e8b\u5b9e\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u5e76\u4e60\u60ef\u5c06\u5b83\u4eec\u5e94\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c06\u4e3e\u51e0\u4e2a\u5177\u4f53\u7684\u4f8b\u5b50\u6765\u8bc1\u5b9e\u8fd9\u4e00\u70b9\u3002

    \u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u91cc\uff0c\u6bcf\u4e2a\u6c49\u5b57\u90fd\u5bf9\u5e94\u4e00\u4e2a\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\u7684\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u67e5\u627e\u4e00\u4e2a\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u4f1a\u6309\u7167\u56fe 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5b9e\u73b0\u3002

    1. \u7ffb\u5f00\u5b57\u5178\u7ea6\u4e00\u534a\u7684\u9875\u6570\uff0c\u67e5\u770b\u8be5\u9875\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u4e48\uff0c\u5047\u8bbe\u9996\u5b57\u6bcd\u4e3a \\(m\\) \u3002
    2. \u7531\u4e8e\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u4e8e \\(m\\) \u4e4b\u540e\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u627e\u8303\u56f4\u7f29\u5c0f\u5230\u540e\u534a\u90e8\u5206\u3002
    3. \u4e0d\u65ad\u91cd\u590d\u6b65\u9aa4 1. \u548c \u6b65\u9aa4 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u4e3a \\(r\\) \u7684\u9875\u7801\u4e3a\u6b62\u3002
    <1><2><3><4><5>

    \u56fe 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9aa4

    \u67e5\u5b57\u5178\u8fd9\u4e2a\u5c0f\u5b66\u751f\u5fc5\u5907\u6280\u80fd\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u67e5\u627e\u201d\u7b97\u6cd5\u3002\u4ece\u6570\u636e\u7ed3\u6784\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u5b57\u5178\u89c6\u4e3a\u4e00\u4e2a\u5df2\u6392\u5e8f\u7684\u201c\u6570\u7ec4\u201d\uff1b\u4ece\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u67e5\u627e\u201d\u3002

    \u4f8b\u4e8c\uff1a\u6574\u7406\u6251\u514b\u3002\u6211\u4eec\u5728\u6253\u724c\u65f6\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u6251\u514b\u724c\uff0c\u4f7f\u5176\u4ece\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5b9e\u73b0\u6d41\u7a0b\u5982\u56fe 1-2 \u6240\u793a\u3002

    1. \u5c06\u6251\u514b\u724c\u5212\u5206\u4e3a\u201c\u6709\u5e8f\u201d\u548c\u201c\u65e0\u5e8f\u201d\u4e24\u90e8\u5206\uff0c\u5e76\u5047\u8bbe\u521d\u59cb\u72b6\u6001\u4e0b\u6700\u5de6 1 \u5f20\u6251\u514b\u724c\u5df2\u7ecf\u6709\u5e8f\u3002
    2. \u5728\u65e0\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f20\u6251\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u786e\u4f4d\u7f6e\uff1b\u5b8c\u6210\u540e\u6700\u5de6 2 \u5f20\u6251\u514b\u5df2\u7ecf\u6709\u5e8f\u3002
    3. \u4e0d\u65ad\u5faa\u73af\u6b65\u9aa4 2. \uff0c\u6bcf\u4e00\u8f6e\u5c06\u4e00\u5f20\u6251\u514b\u724c\u4ece\u65e0\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u6251\u514b\u724c\u90fd\u6709\u5e8f\u3002

    \u56fe 1-2 \u00a0 \u6251\u514b\u6392\u5e8f\u6b65\u9aa4

    \u4e0a\u8ff0\u6574\u7406\u6251\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u7b97\u6cd5\uff0c\u5b83\u5728\u5904\u7406\u5c0f\u578b\u6570\u636e\u96c6\u65f6\u975e\u5e38\u9ad8\u6548\u3002\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\u7684\u6392\u5e8f\u5e93\u51fd\u6570\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

    \u4f8b\u4e09\uff1a\u8d27\u5e01\u627e\u96f6\u3002\u5047\u8bbe\u6211\u4eec\u5728\u8d85\u5e02\u8d2d\u4e70\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7ed9\u4e86\u6536\u94f6\u5458 \\(100\\) \u5143\uff0c\u5219\u6536\u94f6\u5458\u9700\u8981\u627e\u6211\u4eec \\(31\\) \u5143\u3002\u4ed6\u4f1a\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u56fe 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

    1. \u53ef\u9009\u9879\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8d27\u5e01\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
    2. \u4ece\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u4f59 \\(31 - 20 = 11\\) \u5143\u3002
    3. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u4f59 \\(11 - 10 = 1\\) \u5143\u3002
    4. \u4ece\u5269\u4f59\u53ef\u9009\u9879\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u4f59 \\(1 - 1 = 0\\) \u5143\u3002
    5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u4e3a \\(20 + 10 + 1 = 31\\) \u5143\u3002

    \u56fe 1-3 \u00a0 \u8d27\u5e01\u627e\u96f6\u8fc7\u7a0b

    \u5728\u4ee5\u4e0a\u6b65\u9aa4\u4e2d\uff0c\u6211\u4eec\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\uff08\u5c3d\u53ef\u80fd\u7528\u5927\u9762\u989d\u7684\u8d27\u5e01\uff09\uff0c\u6700\u7ec8\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u4ece\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u201c\u8d2a\u5fc3\u201d\u7b97\u6cd5\u3002

    \u5c0f\u5230\u70f9\u996a\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u9645\u822a\u884c\uff0c\u51e0\u4e4e\u6240\u6709\u95ee\u9898\u7684\u89e3\u51b3\u90fd\u79bb\u4e0d\u5f00\u7b97\u6cd5\u3002\u8ba1\u7b97\u673a\u7684\u51fa\u73b0\u4f7f\u5f97\u6211\u4eec\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u5c06\u6570\u636e\u7ed3\u6784\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\uff0c\u540c\u65f6\u7f16\u5199\u4ee3\u7801\u8c03\u7528 CPU \u548c GPU \u6267\u884c\u7b97\u6cd5\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u95ee\u9898\u8f6c\u79fb\u5230\u8ba1\u7b97\u673a\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u51b3\u5404\u79cd\u590d\u6742\u95ee\u9898\u3002

    Tip

    \u5982\u679c\u4f60\u5bf9\u6570\u636e\u7ed3\u6784\u3001\u7b97\u6cd5\u3001\u6570\u7ec4\u548c\u4e8c\u5206\u67e5\u627e\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8bf7\u7ee7\u7eed\u5f80\u4e0b\u9605\u8bfb\uff0c\u672c\u4e66\u5c06\u5f15\u5bfc\u4f60\u8fc8\u5165\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u77e5\u8bc6\u6bbf\u5802\u3002

    "},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7ed3","text":"
    • \u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u65e0\u5904\u4e0d\u5728\uff0c\u5e76\u4e0d\u662f\u9065\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8bc6\u3002\u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u5df2\u7ecf\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u5b66\u4f1a\u4e86\u8bb8\u591a\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u51b3\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u95ee\u9898\u3002
    • \u67e5\u5b57\u5178\u7684\u539f\u7406\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u4f53\u73b0\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u7b97\u6cd5\u601d\u60f3\u3002
    • \u6574\u7406\u6251\u514b\u7684\u8fc7\u7a0b\u4e0e\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u975e\u5e38\u7c7b\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u7b97\u6cd5\u9002\u5408\u6392\u5e8f\u5c0f\u578b\u6570\u636e\u96c6\u3002
    • \u8d27\u5e01\u627e\u96f6\u7684\u6b65\u9aa4\u672c\u8d28\u4e0a\u662f\u8d2a\u5fc3\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u91c7\u53d6\u5f53\u524d\u770b\u6765\u6700\u597d\u7684\u9009\u62e9\u3002
    • \u7b97\u6cd5\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u800c\u6570\u636e\u7ed3\u6784\u662f\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u3002
    • \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7d27\u5bc6\u76f8\u8fde\u3002\u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002
    • \u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728\uff0c\u79ef\u6728\u4ee3\u8868\u6570\u636e\uff0c\u79ef\u6728\u7684\u5f62\u72b6\u548c\u8fde\u63a5\u65b9\u5f0f\u7b49\u4ee3\u8868\u6570\u636e\u7ed3\u6784\uff0c\u62fc\u88c5\u79ef\u6728\u7684\u6b65\u9aa4\u5219\u5bf9\u5e94\u7b97\u6cd5\u3002
    "},{"location":"chapter_introduction/summary/#1-q-a","title":"1. \u00a0 Q & A","text":"

    Q\uff1a\u4f5c\u4e3a\u4e00\u540d\u7a0b\u5e8f\u5458\uff0c\u6211\u5728\u65e5\u5e38\u5de5\u4f5c\u4e2d\u4ece\u672a\u7528\u7b97\u6cd5\u89e3\u51b3\u8fc7\u95ee\u9898\uff0c\u5e38\u7528\u7b97\u6cd5\u90fd\u88ab\u7f16\u7a0b\u8bed\u8a00\u5c01\u88c5\u597d\u4e86\uff0c\u76f4\u63a5\u7528\u5c31\u53ef\u4ee5\u4e86\uff1b\u8fd9\u662f\u5426\u610f\u5473\u7740\u6211\u4eec\u5de5\u4f5c\u4e2d\u7684\u95ee\u9898\u8fd8\u6ca1\u6709\u5230\u8fbe\u9700\u8981\u7b97\u6cd5\u7684\u7a0b\u5ea6\uff1f

    \u5982\u679c\u628a\u5177\u4f53\u7684\u5de5\u4f5c\u6280\u80fd\u6bd4\u4f5c\u662f\u6b66\u529f\u7684\u201c\u62db\u5f0f\u201d\u7684\u8bdd\uff0c\u90a3\u4e48\u57fa\u7840\u79d1\u76ee\u5e94\u8be5\u66f4\u50cf\u662f\u201c\u5185\u529f\u201d\u3002

    \u6211\u8ba4\u4e3a\u5b66\u7b97\u6cd5\uff08\u4ee5\u53ca\u5176\u4ed6\u57fa\u7840\u79d1\u76ee\uff09\u7684\u610f\u4e49\u4e0d\u662f\u5728\u4e8e\u5728\u5de5\u4f5c\u4e2d\u4ece\u96f6\u5b9e\u73b0\u5b83\uff0c\u800c\u662f\u57fa\u4e8e\u5b66\u5230\u7684\u77e5\u8bc6\uff0c\u5728\u89e3\u51b3\u95ee\u9898\u65f6\u80fd\u591f\u4f5c\u51fa\u4e13\u4e1a\u7684\u53cd\u5e94\u548c\u5224\u65ad\uff0c\u4ece\u800c\u63d0\u5347\u5de5\u4f5c\u7684\u6574\u4f53\u8d28\u91cf\u3002\u4e3e\u4e00\u4e2a\u7b80\u5355\u4f8b\u5b50\uff0c\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\u90fd\u5185\u7f6e\u4e86\u6392\u5e8f\u51fd\u6570\uff1a

    • \u5982\u679c\u6211\u4eec\u6ca1\u6709\u5b66\u8fc7\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\uff0c\u90a3\u4e48\u7ed9\u5b9a\u4efb\u4f55\u6570\u636e\uff0c\u6211\u4eec\u53ef\u80fd\u90fd\u585e\u7ed9\u8fd9\u4e2a\u6392\u5e8f\u51fd\u6570\u53bb\u505a\u4e86\u3002\u8fd0\u884c\u987a\u7545\u3001\u6027\u80fd\u4e0d\u9519\uff0c\u770b\u4e0a\u53bb\u5e76\u6ca1\u6709\u4ec0\u4e48\u95ee\u9898\u3002
    • \u4f46\u5982\u679c\u5b66\u8fc7\u7b97\u6cd5\uff0c\u6211\u4eec\u5c31\u4f1a\u77e5\u9053\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n \\log n)\\) \uff1b\u800c\u5982\u679c\u7ed9\u5b9a\u7684\u6570\u636e\u662f\u56fa\u5b9a\u4f4d\u6570\u7684\u6574\u6570\uff08\u4f8b\u5982\u5b66\u53f7\uff09\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u53ef\u4ee5\u7528\u6548\u7387\u66f4\u9ad8\u7684\u201c\u57fa\u6570\u6392\u5e8f\u201d\u6765\u505a\uff0c\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u964d\u4e3a \\(O(nk)\\) \uff0c\u5176\u4e2d \\(k\\) \u4e3a\u4f4d\u6570\u3002\u5f53\u6570\u636e\u4f53\u91cf\u5f88\u5927\u65f6\uff0c\u8282\u7701\u51fa\u6765\u7684\u8fd0\u884c\u65f6\u95f4\u5c31\u80fd\u521b\u9020\u8f83\u5927\u4ef7\u503c\uff08\u6210\u672c\u964d\u4f4e\u3001\u4f53\u9a8c\u53d8\u597d\u7b49\uff09\u3002

    \u5728\u5de5\u7a0b\u9886\u57df\u4e2d\uff0c\u5927\u91cf\u95ee\u9898\u662f\u96be\u4ee5\u8fbe\u5230\u6700\u4f18\u89e3\u7684\uff0c\u8bb8\u591a\u95ee\u9898\u53ea\u662f\u88ab\u201c\u5dee\u4e0d\u591a\u201d\u5730\u89e3\u51b3\u4e86\u3002\u95ee\u9898\u7684\u96be\u6613\u7a0b\u5ea6\u4e00\u65b9\u9762\u53d6\u51b3\u4e8e\u95ee\u9898\u672c\u8eab\u7684\u6027\u8d28\uff0c\u53e6\u4e00\u65b9\u9762\u4e5f\u53d6\u51b3\u4e8e\u89c2\u6d4b\u95ee\u9898\u7684\u4eba\u7684\u77e5\u8bc6\u50a8\u5907\u3002\u4eba\u7684\u77e5\u8bc6\u8d8a\u5b8c\u5907\u3001\u7ecf\u9a8c\u8d8a\u591a\uff0c\u5206\u6790\u95ee\u9898\u5c31\u4f1a\u8d8a\u6df1\u5165\uff0c\u95ee\u9898\u5c31\u80fd\u88ab\u89e3\u51b3\u5f97\u66f4\u4f18\u96c5\u3002

    "},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u7b97\u6cd5\u662f\u4ec0\u4e48","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u7b97\u6cd5\u5b9a\u4e49","text":"

    \u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u65f6\u95f4\u5185\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u7684\u4e00\u7ec4\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9aa4\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u95ee\u9898\u662f\u660e\u786e\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f93\u5165\u548c\u8f93\u51fa\u5b9a\u4e49\u3002
    • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u591f\u5728\u6709\u9650\u6b65\u9aa4\u3001\u65f6\u95f4\u548c\u5185\u5b58\u7a7a\u95f4\u4e0b\u5b8c\u6210\u3002
    • \u5404\u6b65\u9aa4\u90fd\u6709\u786e\u5b9a\u7684\u542b\u4e49\uff0c\u5728\u76f8\u540c\u7684\u8f93\u5165\u548c\u8fd0\u884c\u6761\u4ef6\u4e0b\uff0c\u8f93\u51fa\u59cb\u7ec8\u76f8\u540c\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u6570\u636e\u7ed3\u6784\u5b9a\u4e49","text":"

    \u6570\u636e\u7ed3\u6784\uff08data structure\uff09\u662f\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\uff0c\u6db5\u76d6\u6570\u636e\u5185\u5bb9\u3001\u6570\u636e\u4e4b\u95f4\u5173\u7cfb\u548c\u6570\u636e\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u8bbe\u8ba1\u76ee\u6807\u3002

    • \u7a7a\u95f4\u5360\u7528\u5c3d\u91cf\u5c11\uff0c\u4ee5\u8282\u7701\u8ba1\u7b97\u673a\u5185\u5b58\u3002
    • \u6570\u636e\u64cd\u4f5c\u5c3d\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u76d6\u6570\u636e\u8bbf\u95ee\u3001\u6dfb\u52a0\u3001\u5220\u9664\u3001\u66f4\u65b0\u7b49\u3002
    • \u63d0\u4f9b\u7b80\u6d01\u7684\u6570\u636e\u8868\u793a\u548c\u903b\u8f91\u4fe1\u606f\uff0c\u4ee5\u4fbf\u7b97\u6cd5\u9ad8\u6548\u8fd0\u884c\u3002

    \u6570\u636e\u7ed3\u6784\u8bbe\u8ba1\u662f\u4e00\u4e2a\u5145\u6ee1\u6743\u8861\u7684\u8fc7\u7a0b\u3002\u5982\u679c\u60f3\u5728\u67d0\u65b9\u9762\u53d6\u5f97\u63d0\u5347\uff0c\u5f80\u5f80\u9700\u8981\u5728\u53e6\u4e00\u65b9\u9762\u4f5c\u51fa\u59a5\u534f\u3002\u4e0b\u9762\u4e3e\u4e24\u4e2a\u4f8b\u5b50\u3002

    • \u94fe\u8868\u76f8\u8f83\u4e8e\u6570\u7ec4\uff0c\u5728\u6570\u636e\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u727a\u7272\u4e86\u6570\u636e\u8bbf\u95ee\u901f\u5ea6\u3002
    • \u56fe\u76f8\u8f83\u4e8e\u94fe\u8868\uff0c\u63d0\u4f9b\u4e86\u66f4\u4e30\u5bcc\u7684\u903b\u8f91\u4fe1\u606f\uff0c\u4f46\u9700\u8981\u5360\u7528\u66f4\u5927\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb","text":"

    \u5982\u56fe 1-4 \u6240\u793a\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u5173\u3001\u7d27\u5bc6\u7ed3\u5408\uff0c\u5177\u4f53\u8868\u73b0\u5728\u4ee5\u4e0b\u4e09\u4e2a\u65b9\u9762\u3002

    • \u6570\u636e\u7ed3\u6784\u662f\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u6570\u636e\u7ed3\u6784\u4e3a\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7ed3\u6784\u5316\u5b58\u50a8\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u64cd\u4f5c\u6570\u636e\u7684\u65b9\u6cd5\u3002
    • \u7b97\u6cd5\u662f\u6570\u636e\u7ed3\u6784\u53d1\u6325\u4f5c\u7528\u7684\u821e\u53f0\u3002\u6570\u636e\u7ed3\u6784\u672c\u8eab\u4ec5\u5b58\u50a8\u6570\u636e\u4fe1\u606f\uff0c\u7ed3\u5408\u7b97\u6cd5\u624d\u80fd\u89e3\u51b3\u7279\u5b9a\u95ee\u9898\u3002
    • \u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u4e8e\u4e0d\u540c\u7684\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\uff0c\u4f46\u6267\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9009\u62e9\u5408\u9002\u7684\u6570\u636e\u7ed3\u6784\u662f\u5173\u952e\u3002

    \u56fe 1-4 \u00a0 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u5173\u7cfb

    \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u72b9\u5982\u56fe 1-5 \u6240\u793a\u7684\u62fc\u88c5\u79ef\u6728\u3002\u4e00\u5957\u79ef\u6728\uff0c\u9664\u4e86\u5305\u542b\u8bb8\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u8fd8\u9644\u6709\u8be6\u7ec6\u7684\u7ec4\u88c5\u8bf4\u660e\u4e66\u3002\u6211\u4eec\u6309\u7167\u8bf4\u660e\u4e66\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7ec4\u88c5\u51fa\u7cbe\u7f8e\u7684\u79ef\u6728\u6a21\u578b\u3002

    \u56fe 1-5 \u00a0 \u62fc\u88c5\u79ef\u6728

    \u4e24\u8005\u7684\u8be6\u7ec6\u5bf9\u5e94\u5173\u7cfb\u5982\u8868 1-1 \u6240\u793a\u3002

    \u8868 1-1 \u00a0 \u5c06\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7c7b\u6bd4\u4e3a\u62fc\u88c5\u79ef\u6728

    \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 \u62fc\u88c5\u79ef\u6728 \u8f93\u5165\u6570\u636e \u672a\u62fc\u88c5\u7684\u79ef\u6728 \u6570\u636e\u7ed3\u6784 \u79ef\u6728\u7ec4\u7ec7\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72b6\u3001\u5927\u5c0f\u3001\u8fde\u63a5\u65b9\u5f0f\u7b49 \u7b97\u6cd5 \u628a\u79ef\u6728\u62fc\u6210\u76ee\u6807\u5f62\u6001\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9aa4 \u8f93\u51fa\u6570\u636e \u79ef\u6728\u6a21\u578b

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u662f\u72ec\u7acb\u4e8e\u7f16\u7a0b\u8bed\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u4e66\u5f97\u4ee5\u63d0\u4f9b\u57fa\u4e8e\u591a\u79cd\u7f16\u7a0b\u8bed\u8a00\u7684\u5b9e\u73b0\u3002

    \u7ea6\u5b9a\u4fd7\u6210\u7684\u7b80\u79f0

    \u5728\u5b9e\u9645\u8ba8\u8bba\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u201c\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u201d\u7b80\u79f0\u4e3a\u201c\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u4f17\u6240\u5468\u77e5\u7684 LeetCode \u7b97\u6cd5\u9898\u76ee\uff0c\u5b9e\u9645\u4e0a\u540c\u65f6\u8003\u67e5\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e24\u65b9\u9762\u7684\u77e5\u8bc6\u3002

    "},{"location":"chapter_paperbook/","title":"\u7eb8\u8d28\u4e66","text":"

    \u7ecf\u8fc7\u957f\u65f6\u95f4\u7684\u6253\u78e8\uff0c\u300aHello \u7b97\u6cd5\u300b\u7eb8\u8d28\u4e66\u7ec8\u4e8e\u53d1\u5e03\u4e86\uff01\u6b64\u65f6\u7684\u5fc3\u60c5\u53ef\u4ee5\u7528\u4e00\u53e5\u8bd7\u6765\u5f62\u5bb9\uff1a

    \u8ffd\u98ce\u8d76\u6708\u83ab\u505c\u7559\uff0c\u5e73\u829c\u5c3d\u5904\u662f\u6625\u5c71\u3002

    \u4ee5\u4e0b\u89c6\u9891\u5c55\u793a\u4e86\u7eb8\u8d28\u4e66\uff0c\u5e76\u4e14\u5305\u542b\u6211\u7684\u4e00\u4e9b\u601d\u8003\uff1a

    • \u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u91cd\u8981\u6027\u3002
    • \u4e3a\u4ec0\u4e48\u5728\u7eb8\u8d28\u4e66\u4e2d\u9009\u62e9 Python\u3002
    • \u5bf9\u77e5\u8bc6\u5206\u4eab\u7684\u7406\u89e3\u3002

    \u65b0\u4eba UP \u4e3b\uff0c\u8bf7\u591a\u591a\u5173\u7167\u3001\u4e00\u952e\u4e09\u8fde\uff5e\u8c22\u8c22\uff01

    \u9644\u7eb8\u8d28\u4e66\u5feb\u7167\uff1a

    "},{"location":"chapter_paperbook/#_2","title":"\u4f18\u52bf\u4e0e\u4e0d\u8db3","text":"

    \u603b\u7ed3\u4e00\u4e0b\u7eb8\u8d28\u4e66\u53ef\u80fd\u4f1a\u7ed9\u5927\u5bb6\u5e26\u6765\u60ca\u559c\u7684\u5730\u65b9\uff1a

    • \u91c7\u7528\u5168\u5f69\u5370\u5237\uff0c\u80fd\u591f\u539f\u6c41\u539f\u5473\u5730\u53d1\u6325\u51fa\u672c\u4e66\u201c\u52a8\u753b\u56fe\u89e3\u201d\u7684\u4f18\u52bf\u3002
    • \u8003\u7a76\u7eb8\u5f20\u6750\u8d28\uff0c\u65e2\u4fdd\u8bc1\u8272\u5f69\u9ad8\u5ea6\u8fd8\u539f\uff0c\u4e5f\u4fdd\u7559\u7eb8\u8d28\u4e66\u7279\u6709\u7684\u8d28\u611f\u3002
    • \u7eb8\u8d28\u7248\u6bd4\u7f51\u9875\u7248\u7684\u683c\u5f0f\u66f4\u52a0\u89c4\u8303\uff0c\u4f8b\u5982\u56fe\u4e2d\u7684\u516c\u5f0f\u4f7f\u7528\u659c\u4f53\u3002
    • \u5728\u4e0d\u63d0\u5347\u5b9a\u4ef7\u7684\u524d\u63d0\u4e0b\uff0c\u9644\u8d60\u601d\u7ef4\u5bfc\u56fe\u6298\u9875\u3001\u4e66\u7b7e\u3002
    • \u7eb8\u8d28\u4e66\u3001\u7f51\u9875\u7248\u3001PDF \u7248\u5185\u5bb9\u540c\u6b65\uff0c\u968f\u610f\u5207\u6362\u9605\u8bfb\u3002

    Tip

    \u7531\u4e8e\u7eb8\u8d28\u4e66\u548c\u7f51\u9875\u7248\u7684\u540c\u6b65\u96be\u5ea6\u8f83\u5927\uff0c\u56e0\u6b64\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u7ec6\u8282\u4e0a\u7684\u4e0d\u540c\uff0c\u8bf7\u60a8\u89c1\u8c05\uff01

    \u5f53\u7136\uff0c\u7eb8\u8d28\u4e66\u4e5f\u6709\u4e00\u4e9b\u503c\u5f97\u5927\u5bb6\u5165\u624b\u524d\u8003\u8651\u7684\u5730\u65b9\uff1a

    • \u4f7f\u7528 Python \u8bed\u8a00\uff0c\u53ef\u80fd\u4e0d\u5339\u914d\u4f60\u7684\u4e3b\u8bed\u8a00\uff08\u53ef\u4ee5\u628a Python \u770b\u4f5c\u4f2a\u4ee3\u7801\uff0c\u91cd\u5728\u7406\u89e3\u601d\u8def\uff09\u3002
    • \u5168\u5f69\u5370\u5237\u867d\u7136\u5927\u5e45\u63d0\u5347\u4e86\u56fe\u89e3\u548c\u4ee3\u7801\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u4f46\u4ef7\u683c\u4f1a\u6bd4\u9ed1\u767d\u5370\u5237\u9ad8\u4e00\u4e9b\u3002

    Tip

    \u201c\u5370\u5237\u8d28\u91cf\u201d\u548c\u201c\u4ef7\u683c\u201d\u5c31\u50cf\u7b97\u6cd5\u4e2d\u7684\u201c\u65f6\u95f4\u6548\u7387\u201d\u548c\u201c\u7a7a\u95f4\u6548\u7387\u201d\uff0c\u96be\u4ee5\u4e24\u5168\u3002\u800c\u6211\u8ba4\u4e3a\uff0c\u201c\u5370\u5237\u8d28\u91cf\u201d\u5bf9\u5e94\u7684\u662f\u201c\u65f6\u95f4\u6548\u7387\u201d\uff0c\u66f4\u5e94\u8be5\u88ab\u6ce8\u91cd\u3002

    "},{"location":"chapter_paperbook/#_3","title":"\u8d2d\u4e70\u94fe\u63a5","text":"

    \u5982\u679c\u4f60\u5bf9\u7eb8\u8d28\u4e66\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u8003\u8651\u5165\u624b\u4e00\u672c\u3002\u6211\u4eec\u4e3a\u5927\u5bb6\u4e89\u53d6\u5230\u4e86\u65b0\u4e66 5 \u6298\u4f18\u60e0\uff0c\u8bf7\u89c1\u6b64\u94fe\u63a5\u6216\u626b\u63cf\u4ee5\u4e0b\u4e8c\u7ef4\u7801\uff1a

    "},{"location":"chapter_paperbook/#_4","title":"\u5c3e\u8bb0","text":"

    \u8d77\u521d\uff0c\u6211\u4f4e\u4f30\u4e86\u7eb8\u8d28\u4e66\u51fa\u7248\u7684\u5de5\u4f5c\u91cf\uff0c\u4ee5\u4e3a\u53ea\u8981\u7ef4\u62a4\u597d\u4e86\u5f00\u6e90\u9879\u76ee\uff0c\u7eb8\u8d28\u7248\u5c31\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e9b\u81ea\u52a8\u5316\u624b\u6bb5\u751f\u6210\u51fa\u6765\u3002\u5b9e\u8df5\u8bc1\u660e\uff0c\u7eb8\u8d28\u4e66\u7684\u751f\u4ea7\u6d41\u7a0b\u4e0e\u5f00\u6e90\u9879\u76ee\u7684\u66f4\u65b0\u673a\u5236\u5b58\u5728\u5f88\u5927\u7684\u4e0d\u540c\uff0c\u4e24\u8005\u4e4b\u95f4\u7684\u8f6c\u5316\u9700\u8981\u505a\u8bb8\u591a\u989d\u5916\u5de5\u4f5c\u3002

    \u4e00\u672c\u4e66\u7684\u521d\u7a3f\u4e0e\u8fbe\u5230\u51fa\u7248\u6807\u51c6\u7684\u5b9a\u7a3f\u4e4b\u95f4\u4ecd\u6709\u8f83\u957f\u8ddd\u79bb\uff0c\u9700\u8981\u51fa\u7248\u793e\uff08\u7b56\u5212\u3001\u7f16\u8f91\u3001\u8bbe\u8ba1\u3001\u5e02\u573a\u7b49\uff09\u4e0e\u4f5c\u8005\u7684\u901a\u529b\u5408\u4f5c\u3001\u957f\u671f\u96d5\u7422\u3002\u5728\u6b64\u611f\u8c22\u56fe\u7075\u7b56\u5212\u7f16\u8f91\u738b\u519b\u82b1\u3001\u4ee5\u53ca\u4eba\u6c11\u90ae\u7535\u51fa\u7248\u793e\u548c\u56fe\u7075\u793e\u533a\u6bcf\u4f4d\u53c2\u4e0e\u672c\u4e66\u51fa\u7248\u6d41\u7a0b\u7684\u5de5\u4f5c\u4eba\u5458\uff01

    \u5e0c\u671b\u8fd9\u672c\u4e66\u80fd\u591f\u5e2e\u52a9\u5230\u4f60\uff01

    "},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

    Abstract

    \u7b97\u6cd5\u72b9\u5982\u7f8e\u5999\u7684\u4ea4\u54cd\u4e50\uff0c\u6bcf\u4e00\u884c\u4ee3\u7801\u90fd\u50cf\u97f5\u5f8b\u822c\u6d41\u6dcc\u3002

    \u613f\u8fd9\u672c\u4e66\u5728\u4f60\u7684\u8111\u6d77\u4e2d\u8f7b\u8f7b\u54cd\u8d77\uff0c\u7559\u4e0b\u72ec\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

    "},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 0.1 \u00a0 \u5173\u4e8e\u672c\u4e66
    • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66
    • 0.3 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u5173\u4e8e\u672c\u4e66","text":"

    \u672c\u9879\u76ee\u65e8\u5728\u521b\u5efa\u4e00\u672c\u5f00\u6e90\u3001\u514d\u8d39\u3001\u5bf9\u65b0\u624b\u53cb\u597d\u7684\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5165\u95e8\u6559\u7a0b\u3002

    • \u5168\u4e66\u91c7\u7528\u52a8\u753b\u56fe\u89e3\uff0c\u7ed3\u6784\u5316\u5730\u8bb2\u89e3\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u5185\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b66\u4e60\u66f2\u7ebf\u5e73\u6ed1\u3002
    • \u7b97\u6cd5\u6e90\u4ee3\u7801\u7686\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8bed\u8a00\u3002
    • \u9f13\u52b1\u8bfb\u8005\u5728\u7ebf\u4e0a\u7ae0\u8282\u8bc4\u8bba\u533a\u4e92\u5e2e\u4e92\u52a9\u3001\u5171\u540c\u8fdb\u6b65\uff0c\u63d0\u95ee\u4e0e\u8bc4\u8bba\u901a\u5e38\u53ef\u5728\u4e24\u65e5\u5185\u5f97\u5230\u56de\u590d\u3002
    "},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8bfb\u8005\u5bf9\u8c61","text":"

    \u82e5\u4f60\u662f\u7b97\u6cd5\u521d\u5b66\u8005\uff0c\u4ece\u672a\u63a5\u89e6\u8fc7\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7ecf\u6709\u4e00\u4e9b\u5237\u9898\u7ecf\u9a8c\uff0c\u5bf9\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8ba4\u8bc6\uff0c\u5728\u4f1a\u4e0e\u4e0d\u4f1a\u4e4b\u95f4\u53cd\u590d\u6a2a\u8df3\uff0c\u90a3\u4e48\u672c\u4e66\u6b63\u662f\u4e3a\u4f60\u91cf\u8eab\u5b9a\u5236\u7684\uff01

    \u5982\u679c\u4f60\u5df2\u7ecf\u79ef\u7d2f\u4e00\u5b9a\u7684\u5237\u9898\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u9898\u578b\uff0c\u90a3\u4e48\u672c\u4e66\u53ef\u52a9\u4f60\u56de\u987e\u4e0e\u68b3\u7406\u7b97\u6cd5\u77e5\u8bc6\u4f53\u7cfb\uff0c\u4ed3\u5e93\u6e90\u4ee3\u7801\u53ef\u4ee5\u5f53\u4f5c\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u6216\u201c\u7b97\u6cd5\u5b57\u5178\u201d\u6765\u4f7f\u7528\u3002

    \u82e5\u4f60\u662f\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u4eec\u671f\u5f85\u6536\u5230\u4f60\u7684\u5b9d\u8d35\u5efa\u8bae\uff0c\u6216\u8005\u4e00\u8d77\u53c2\u4e0e\u521b\u4f5c\u3002

    \u524d\u7f6e\u6761\u4ef6

    \u4f60\u9700\u8981\u81f3\u5c11\u5177\u5907\u4efb\u4e00\u8bed\u8a00\u7684\u7f16\u7a0b\u57fa\u7840\uff0c\u80fd\u591f\u9605\u8bfb\u548c\u7f16\u5199\u7b80\u5355\u4ee3\u7801\u3002

    "},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5185\u5bb9\u7ed3\u6784","text":"

    \u672c\u4e66\u7684\u4e3b\u8981\u5185\u5bb9\u5982\u56fe 0-1 \u6240\u793a\u3002

    • \u590d\u6742\u5ea6\u5206\u6790\uff1a\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u7684\u8bc4\u4ef7\u7ef4\u5ea6\u4e0e\u65b9\u6cd5\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u793a\u4f8b\u7b49\u3002
    • \u6570\u636e\u7ed3\u6784\uff1a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u548c\u6570\u636e\u7ed3\u6784\u7684\u5206\u7c7b\u65b9\u6cd5\u3002\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6808\u3001\u961f\u5217\u3001\u54c8\u5e0c\u8868\u3001\u6811\u3001\u5806\u3001\u56fe\u7b49\u6570\u636e\u7ed3\u6784\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u89c1\u7c7b\u578b\u3001\u5178\u578b\u5e94\u7528\u3001\u5b9e\u73b0\u65b9\u6cd5\u7b49\u3002
    • \u7b97\u6cd5\uff1a\u641c\u7d22\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u8d2a\u5fc3\u7b49\u7b97\u6cd5\u7684\u5b9a\u4e49\u3001\u4f18\u7f3a\u70b9\u3001\u6548\u7387\u3001\u5e94\u7528\u573a\u666f\u3001\u89e3\u9898\u6b65\u9aa4\u548c\u793a\u4f8b\u95ee\u9898\u7b49\u3002

    \u56fe 0-1 \u00a0 \u672c\u4e66\u4e3b\u8981\u5185\u5bb9

    "},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8c22","text":"

    \u672c\u4e66\u5728\u5f00\u6e90\u793e\u533a\u4f17\u591a\u8d21\u732e\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65ad\u5b8c\u5584\u3002\u611f\u8c22\u6bcf\u4e00\u4f4d\u6295\u5165\u65f6\u95f4\u4e0e\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u4eec\u662f\uff08\u6309\u7167 GitHub \u81ea\u52a8\u751f\u6210\u7684\u987a\u5e8f\uff09\uff1akrahets\u3001Gonglja\u3001nuomi1\u3001codingonion\u3001Reanon\u3001justin-tse\u3001hpstory\u3001danielsss\u3001curtishd\u3001night-cruise\u3001S-N-O-R-L-A-X\u3001msk397\u3001gvenusleo\u3001RiverTwilight\u3001gyt95\u3001zhuoqinyue\u3001Zuoxun\u3001mingXta\u3001hello-ikun\u3001khoaxuantu\u3001FangYuan33\u3001GN-Yu\u3001longsizhuo\u3001mgisr\u3001Cathay-Chen\u3001guowei-gong\u3001xBLACKICEx\u3001K3v123\u3001IsChristina\u3001JoseHung\u3001qualifier1024\u3001pengchzn\u3001Guanngxu\u3001QiLOL\u3001L-Super\u3001WSL0809\u3001Slone123c\u3001lhxsm\u3001yuan0221\u3001what-is-me\u3001rongyi\u3001JeffersonHuang\u3001longranger2\u3001theNefelibatas\u3001yuelinxin\u3001xiongsp\u3001nanlei\u3001a16su\u3001cy-by-side\u3001gaofer\u3001malone6\u3001Wonderdch\u3001hongyun-robot\u3001XiaChuerwu\u3001yd-j\u3001bluebean-cloud\u3001iron-irax\u3001he-weilai\u3001Nigh\u3001MolDuM\u3001Phoenix0415\u3001XC-Zero\u3001SamJin98\u3001reeswell\u3001NI-SW\u3001Horbin-Magician\u3001xjr7670\u3001YangXuanyi\u3001DullSword\u3001iStig\u3001qq909244296\u3001jiaxianhua\u3001wenjianmin\u3001keshida\u3001kilikilikid\u3001lclc6\u3001lwbaptx\u3001luluxia\u3001boloboloda\u3001hts0000\u3001gledfish\u3001fbigm\u3001echo1937\u3001szu17dmy\u3001dshlstarr\u3001coderlef\u3001czruby\u3001beintentional\u3001KeiichiKasai\u3001xb534\u3001ElaBosak233\u3001baagod\u3001zhouLion\u3001yishangzhang\u3001yi427\u3001yabo083\u3001weibk\u3001wangwang105\u3001th1nk3r-ing\u3001tao363\u30014yDX3906\u3001syd168\u3001siqyka\u3001selear\u3001sdshaoda\u3001noobcodemaker\u3001chadyi\u3001lyl625760\u3001lucaswangdev\u3001liuxjerry\u30010130w\u3001shanghai-Jerry\u3001JackYang-hellobobo\u3001Javesun99\u3001lipusheng\u3001ShiMaRing\u3001FreddieLi\u3001FloranceYeh\u3001Transmigration-zhou\u3001fanchenggang\u3001gltianwen\u3001Dr-XYZ\u3001curly210102\u3001CuB3y0nd\u3001youshaoXG\u3001bubble9um\u3001fanenr\u300152coder\u3001foursevenlove\u3001KorsChen\u3001ZongYangL\u3001hezhizhen\u3001linzeyan\u3001ZJKung\u3001GaochaoZhu\u3001yang-le\u3001Evilrabbit520\u3001Turing-1024-Lee\u3001Suremotoo\u3001Allen-Scai\u3001Richard-Zhang1019\u3001qingpeng9802\u3001primexiao\u3001nidhoggfgg\u30011ch0\u3001MwumLi\u3001ZnYang2018\u3001hugtyftg\u3001logan-qiu\u3001psychelzh \u548c Keynman \u3002

    \u672c\u4e66\u7684\u4ee3\u7801\u5ba1\u9605\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u987a\u5e8f\u6392\u5217\uff09\u3002\u611f\u8c22\u4ed6\u4eec\u4ed8\u51fa\u7684\u65f6\u95f4\u4e0e\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u4eec\u786e\u4fdd\u4e86\u5404\u8bed\u8a00\u4ee3\u7801\u7684\u89c4\u8303\u4e0e\u7edf\u4e00\u3002

    \u5728\u672c\u4e66\u7684\u521b\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8bb8\u591a\u4eba\u7684\u5e2e\u52a9\u3002

    • \u611f\u8c22\u6211\u5728\u516c\u53f8\u7684\u5bfc\u5e08\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u7545\u8c08\u4e2d\u4f60\u9f13\u52b1\u6211\u201c\u5feb\u884c\u52a8\u8d77\u6765\u201d\uff0c\u575a\u5b9a\u4e86\u6211\u5199\u8fd9\u672c\u4e66\u7684\u51b3\u5fc3\uff1b
    • \u611f\u8c22\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u4e3a\u672c\u4e66\u7684\u9996\u4f4d\u8bfb\u8005\uff0c\u4ece\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8bb8\u591a\u5b9d\u8d35\u5efa\u8bae\uff0c\u4f7f\u5f97\u672c\u4e66\u66f4\u9002\u5408\u65b0\u624b\u9605\u8bfb\uff1b
    • \u611f\u8c22\u817e\u5b9d\u3001\u7426\u5b9d\u3001\u98de\u5b9d\u4e3a\u672c\u4e66\u8d77\u4e86\u4e00\u4e2a\u5bcc\u6709\u521b\u610f\u7684\u540d\u5b57\uff0c\u5524\u8d77\u5927\u5bb6\u5199\u4e0b\u7b2c\u4e00\u884c\u4ee3\u7801\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u5fc6\uff1b
    • \u611f\u8c22\u6821\u94e8\u5728\u77e5\u8bc6\u4ea7\u6743\u65b9\u9762\u63d0\u4f9b\u7684\u4e13\u4e1a\u5e2e\u52a9\uff0c\u8fd9\u5bf9\u672c\u5f00\u6e90\u4e66\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
    • \u611f\u8c22\u82cf\u6f7c\u4e3a\u672c\u4e66\u8bbe\u8ba1\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u5e76\u5728\u6211\u7684\u5f3a\u8feb\u75c7\u7684\u9a71\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
    • \u611f\u8c22 @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8bae\uff0c\u4ee5\u53ca\u4ed6\u5f00\u53d1\u7684\u5f00\u6e90\u6587\u6863\u4e3b\u9898 Material-for-MkDocs \u3002

    \u5728\u5199\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u9605\u8bfb\u4e86\u8bb8\u591a\u5173\u4e8e\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u8fd9\u4e9b\u4f5c\u54c1\u4e3a\u672c\u4e66\u63d0\u4f9b\u4e86\u4f18\u79c0\u7684\u8303\u672c\uff0c\u786e\u4fdd\u4e86\u672c\u4e66\u5185\u5bb9\u7684\u51c6\u786e\u6027\u4e0e\u54c1\u8d28\u3002\u5728\u6b64\u611f\u8c22\u6240\u6709\u8001\u5e08\u548c\u524d\u8f88\u7684\u6770\u51fa\u8d21\u732e\uff01

    \u672c\u4e66\u5021\u5bfc\u624b\u8111\u5e76\u7528\u7684\u5b66\u4e60\u65b9\u5f0f\uff0c\u5728\u8fd9\u4e00\u70b9\u4e0a\u6211\u6df1\u53d7\u300a\u52a8\u624b\u5b66\u6df1\u5ea6\u5b66\u4e60\u300b\u7684\u542f\u53d1\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8bfb\u8005\u5f3a\u70c8\u63a8\u8350\u8fd9\u672c\u4f18\u79c0\u7684\u8457\u4f5c\u3002

    \u8877\u5fc3\u611f\u8c22\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u4eec\u4e00\u76f4\u4ee5\u6765\u7684\u652f\u6301\u4e0e\u9f13\u52b1\uff0c\u8ba9\u6211\u6709\u673a\u4f1a\u505a\u8fd9\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

    "},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u4e66","text":"

    Tip

    \u4e3a\u4e86\u83b7\u5f97\u6700\u4f73\u7684\u9605\u8bfb\u4f53\u9a8c\uff0c\u5efa\u8bae\u4f60\u901a\u8bfb\u672c\u8282\u5185\u5bb9\u3002

    "},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98ce\u683c\u7ea6\u5b9a","text":"
    • \u6807\u9898\u540e\u6807\u6ce8 * \u7684\u662f\u9009\u8bfb\u7ae0\u8282\uff0c\u5185\u5bb9\u76f8\u5bf9\u56f0\u96be\u3002\u5982\u679c\u4f60\u7684\u65f6\u95f4\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u8fc7\u3002
    • \u4e13\u4e1a\u672f\u8bed\u4f1a\u4f7f\u7528\u9ed1\u4f53\uff08\u7eb8\u8d28\u7248\u548c PDF \u7248\uff09\u6216\u6dfb\u52a0\u4e0b\u5212\u7ebf\uff08\u7f51\u9875\u7248\uff09\uff0c\u4f8b\u5982\u6570\u7ec4\uff08array\uff09\u3002\u5efa\u8bae\u8bb0\u4f4f\u5b83\u4eec\uff0c\u4ee5\u4fbf\u9605\u8bfb\u6587\u732e\u3002
    • \u91cd\u70b9\u5185\u5bb9\u548c\u603b\u7ed3\u6027\u8bed\u53e5\u4f1a \u52a0\u7c97\uff0c\u8fd9\u7c7b\u6587\u5b57\u503c\u5f97\u7279\u522b\u5173\u6ce8\u3002
    • \u6709\u7279\u6307\u542b\u4e49\u7684\u8bcd\u53e5\u4f1a\u4f7f\u7528\u201c\u5f15\u53f7\u201d\u6807\u6ce8\uff0c\u4ee5\u907f\u514d\u6b67\u4e49\u3002
    • \u5f53\u6d89\u53ca\u7f16\u7a0b\u8bed\u8a00\u4e4b\u95f4\u4e0d\u4e00\u81f4\u7684\u540d\u8bcd\u65f6\uff0c\u672c\u4e66\u5747\u4ee5 Python \u4e3a\u51c6\uff0c\u4f8b\u5982\u4f7f\u7528 None \u6765\u8868\u793a\u201c\u7a7a\u201d\u3002
    • \u672c\u4e66\u90e8\u5206\u653e\u5f03\u4e86\u7f16\u7a0b\u8bed\u8a00\u7684\u6ce8\u91ca\u89c4\u8303\uff0c\u4ee5\u6362\u53d6\u66f4\u52a0\u7d27\u51d1\u7684\u5185\u5bb9\u6392\u7248\u3002\u6ce8\u91ca\u4e3b\u8981\u5206\u4e3a\u4e09\u79cd\u7c7b\u578b\uff1a\u6807\u9898\u6ce8\u91ca\u3001\u5185\u5bb9\u6ce8\u91ca\u3001\u591a\u884c\u6ce8\u91ca\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    \"\"\"\u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\"\"\"\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n\"\"\"\n\u591a\u884c\n\u6ce8\u91ca\n\"\"\"\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    /* \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 */\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n/**\n * \u591a\u884c\n * \u6ce8\u91ca\n */\n
    ### \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49 ###\n\n# \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n# \u591a\u884c\n# \u6ce8\u91ca\n
    // \u6807\u9898\u6ce8\u91ca\uff0c\u7528\u4e8e\u6807\u6ce8\u51fd\u6570\u3001\u7c7b\u3001\u6d4b\u8bd5\u6837\u4f8b\u7b49\n\n// \u5185\u5bb9\u6ce8\u91ca\uff0c\u7528\u4e8e\u8be6\u89e3\u4ee3\u7801\n\n// \u591a\u884c\n// \u6ce8\u91ca\n
    "},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52a8\u753b\u56fe\u89e3\u4e2d\u9ad8\u6548\u5b66\u4e60","text":"

    \u76f8\u8f83\u4e8e\u6587\u5b57\uff0c\u89c6\u9891\u548c\u56fe\u7247\u5177\u6709\u66f4\u9ad8\u7684\u4fe1\u606f\u5bc6\u5ea6\u548c\u7ed3\u6784\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u4e8e\u7406\u89e3\u3002\u5728\u672c\u4e66\u4e2d\uff0c\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u5c06\u4e3b\u8981\u901a\u8fc7\u52a8\u753b\u4ee5\u56fe\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5219\u4f5c\u4e3a\u89e3\u91ca\u4e0e\u8865\u5145\u3002

    \u5982\u679c\u4f60\u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u53d1\u73b0\u67d0\u6bb5\u5185\u5bb9\u63d0\u4f9b\u4e86\u5982\u56fe 0-2 \u6240\u793a\u7684\u52a8\u753b\u56fe\u89e3\uff0c\u8bf7\u4ee5\u56fe\u4e3a\u4e3b\u3001\u4ee5\u6587\u5b57\u4e3a\u8f85\uff0c\u7efc\u5408\u4e24\u8005\u6765\u7406\u89e3\u5185\u5bb9\u3002

    \u56fe 0-2 \u00a0 \u52a8\u753b\u56fe\u89e3\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u4ee3\u7801\u5b9e\u8df5\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

    \u672c\u4e66\u7684\u914d\u5957\u4ee3\u7801\u6258\u7ba1\u5728 GitHub \u4ed3\u5e93\u3002\u5982\u56fe 0-3 \u6240\u793a\uff0c\u6e90\u4ee3\u7801\u9644\u6709\u6d4b\u8bd5\u6837\u4f8b\uff0c\u53ef\u4e00\u952e\u8fd0\u884c\u3002

    \u5982\u679c\u65f6\u95f4\u5141\u8bb8\uff0c\u5efa\u8bae\u4f60\u53c2\u7167\u4ee3\u7801\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b66\u4e60\u65f6\u95f4\u6709\u9650\uff0c\u8bf7\u81f3\u5c11\u901a\u8bfb\u5e76\u8fd0\u884c\u6240\u6709\u4ee3\u7801\u3002

    \u4e0e\u9605\u8bfb\u4ee3\u7801\u76f8\u6bd4\uff0c\u7f16\u5199\u4ee3\u7801\u7684\u8fc7\u7a0b\u5f80\u5f80\u80fd\u5e26\u6765\u66f4\u591a\u6536\u83b7\u3002\u52a8\u624b\u5b66\uff0c\u624d\u662f\u771f\u7684\u5b66\u3002

    \u56fe 0-3 \u00a0 \u8fd0\u884c\u4ee3\u7801\u793a\u4f8b

    \u8fd0\u884c\u4ee3\u7801\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u4e3a\u4e09\u6b65\u3002

    \u7b2c\u4e00\u6b65\uff1a\u5b89\u88c5\u672c\u5730\u7f16\u7a0b\u73af\u5883\u3002\u8bf7\u53c2\u7167\u9644\u5f55\u6240\u793a\u7684\u6559\u7a0b\u8fdb\u884c\u5b89\u88c5\uff0c\u5982\u679c\u5df2\u5b89\u88c5\uff0c\u5219\u53ef\u8df3\u8fc7\u6b64\u6b65\u9aa4\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f7d\u4ee3\u7801\u4ed3\u5e93\u3002\u524d\u5f80 GitHub \u4ed3\u5e93\u3002\u5982\u679c\u5df2\u7ecf\u5b89\u88c5 Git \uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u4ed3\u5e93\uff1a

    git clone https://github.com/krahets/hello-algo.git\n

    \u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u56fe 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u70b9\u51fb\u201cDownload ZIP\u201d\u6309\u94ae\u76f4\u63a5\u4e0b\u8f7d\u4ee3\u7801\u538b\u7f29\u5305\uff0c\u7136\u540e\u5728\u672c\u5730\u89e3\u538b\u5373\u53ef\u3002

    \u56fe 0-4 \u00a0 \u514b\u9686\u4ed3\u5e93\u4e0e\u4e0b\u8f7d\u4ee3\u7801

    \u7b2c\u4e09\u6b65\uff1a\u8fd0\u884c\u6e90\u4ee3\u7801\u3002\u5982\u56fe 0-5 \u6240\u793a\uff0c\u5bf9\u4e8e\u9876\u90e8\u6807\u6709\u6587\u4ef6\u540d\u79f0\u7684\u4ee3\u7801\u5757\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4ed3\u5e93\u7684 codes \u6587\u4ef6\u5939\u5185\u627e\u5230\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6\u3002\u6e90\u4ee3\u7801\u6587\u4ef6\u53ef\u4e00\u952e\u8fd0\u884c\uff0c\u5c06\u5e2e\u52a9\u4f60\u8282\u7701\u4e0d\u5fc5\u8981\u7684\u8c03\u8bd5\u65f6\u95f4\uff0c\u8ba9\u4f60\u80fd\u591f\u4e13\u6ce8\u4e8e\u5b66\u4e60\u5185\u5bb9\u3002

    \u56fe 0-5 \u00a0 \u4ee3\u7801\u5757\u4e0e\u5bf9\u5e94\u7684\u6e90\u4ee3\u7801\u6587\u4ef6

    \u9664\u4e86\u672c\u5730\u8fd0\u884c\u4ee3\u7801\uff0c\u7f51\u9875\u7248\u8fd8\u652f\u6301 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c\uff08\u57fa\u4e8e pythontutor \u5b9e\u73b0\uff09\u3002\u5982\u56fe 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u70b9\u51fb\u4ee3\u7801\u5757\u4e0b\u65b9\u7684\u201c\u53ef\u89c6\u5316\u8fd0\u884c\u201d\u6765\u5c55\u5f00\u89c6\u56fe\uff0c\u89c2\u5bdf\u7b97\u6cd5\u4ee3\u7801\u7684\u6267\u884c\u8fc7\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u70b9\u51fb\u201c\u5168\u5c4f\u89c2\u770b\u201d\uff0c\u4ee5\u83b7\u5f97\u66f4\u597d\u7684\u9605\u89c8\u4f53\u9a8c\u3002

    \u56fe 0-6 \u00a0 Python \u4ee3\u7801\u7684\u53ef\u89c6\u5316\u8fd0\u884c

    "},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u95ee\u8ba8\u8bba\u4e2d\u5171\u540c\u6210\u957f","text":"

    \u5728\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u8bf7\u4e0d\u8981\u8f7b\u6613\u8df3\u8fc7\u90a3\u4e9b\u6ca1\u5b66\u660e\u767d\u7684\u77e5\u8bc6\u70b9\u3002\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u63d0\u51fa\u4f60\u7684\u95ee\u9898\uff0c\u6211\u548c\u5c0f\u4f19\u4f34\u4eec\u5c06\u7aed\u8bda\u4e3a\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u53ef\u5728\u4e24\u5929\u5185\u56de\u590d\u3002

    \u5982\u56fe 0-7 \u6240\u793a\uff0c\u7f51\u9875\u7248\u6bcf\u4e2a\u7ae0\u8282\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8bc4\u8bba\u533a\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u5173\u6ce8\u8bc4\u8bba\u533a\u7684\u5185\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u4e86\u89e3\u5927\u5bb6\u9047\u5230\u7684\u95ee\u9898\uff0c\u4ece\u800c\u67e5\u6f0f\u8865\u7f3a\uff0c\u6fc0\u53d1\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u4f19\u4f34\u7684\u95ee\u9898\uff0c\u5206\u4eab\u4f60\u7684\u89c1\u89e3\uff0c\u5e2e\u52a9\u4ed6\u4eba\u8fdb\u6b65\u3002

    \u56fe 0-7 \u00a0 \u8bc4\u8bba\u533a\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf","text":"

    \u4ece\u603b\u4f53\u4e0a\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7684\u8fc7\u7a0b\u5212\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\u3002

    1. \u9636\u6bb5\u4e00\uff1a\u7b97\u6cd5\u5165\u95e8\u3002\u6211\u4eec\u9700\u8981\u719f\u6089\u5404\u79cd\u6570\u636e\u7ed3\u6784\u7684\u7279\u70b9\u548c\u7528\u6cd5\uff0c\u5b66\u4e60\u4e0d\u540c\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5185\u5bb9\u3002
    2. \u9636\u6bb5\u4e8c\uff1a\u5237\u7b97\u6cd5\u9898\u3002\u5efa\u8bae\u4ece\u70ed\u95e8\u9898\u76ee\u5f00\u5237\uff0c\u5148\u79ef\u7d2f\u81f3\u5c11 100 \u9053\u9898\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u7b97\u6cd5\u95ee\u9898\u3002\u521d\u6b21\u5237\u9898\u65f6\uff0c\u201c\u77e5\u8bc6\u9057\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u4e2a\u6311\u6218\uff0c\u4f46\u8bf7\u653e\u5fc3\uff0c\u8fd9\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u4eec\u53ef\u4ee5\u6309\u7167\u201c\u827e\u5bbe\u6d69\u65af\u9057\u5fd8\u66f2\u7ebf\u201d\u6765\u590d\u4e60\u9898\u76ee\uff0c\u901a\u5e38\u5728\u8fdb\u884c 3\uff5e5 \u8f6e\u7684\u91cd\u590d\u540e\uff0c\u5c31\u80fd\u5c06\u5176\u7262\u8bb0\u5728\u5fc3\u3002\u63a8\u8350\u7684\u9898\u5355\u548c\u5237\u9898\u8ba1\u5212\u8bf7\u89c1\u6b64 GitHub \u4ed3\u5e93\u3002
    3. \u9636\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5b66\u4e60\u65b9\u9762\uff0c\u6211\u4eec\u53ef\u4ee5\u9605\u8bfb\u7b97\u6cd5\u4e13\u680f\u6587\u7ae0\u3001\u89e3\u9898\u6846\u67b6\u548c\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65ad\u4e30\u5bcc\u77e5\u8bc6\u4f53\u7cfb\u3002\u5728\u5237\u9898\u65b9\u9762\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u91c7\u7528\u8fdb\u9636\u5237\u9898\u7b56\u7565\uff0c\u5982\u6309\u4e13\u9898\u5206\u7c7b\u3001\u4e00\u9898\u591a\u89e3\u3001\u4e00\u89e3\u591a\u9898\u7b49\uff0c\u76f8\u5173\u7684\u5237\u9898\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u4e2a\u793e\u533a\u627e\u5230\u3002

    \u5982\u56fe 0-8 \u6240\u793a\uff0c\u672c\u4e66\u5185\u5bb9\u4e3b\u8981\u6db5\u76d6\u201c\u9636\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e2e\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u5f00\u9636\u6bb5\u4e8c\u548c\u9636\u6bb5\u4e09\u7684\u5b66\u4e60\u3002

    \u56fe 0-8 \u00a0 \u7b97\u6cd5\u5b66\u4e60\u8def\u7ebf

    "},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7ed3","text":"
    • \u672c\u4e66\u7684\u4e3b\u8981\u53d7\u4f17\u662f\u7b97\u6cd5\u521d\u5b66\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u7840\uff0c\u672c\u4e66\u80fd\u5e2e\u52a9\u4f60\u7cfb\u7edf\u56de\u987e\u7b97\u6cd5\u77e5\u8bc6\uff0c\u4e66\u4e2d\u6e90\u4ee3\u7801\u4e5f\u53ef\u4f5c\u4e3a\u201c\u5237\u9898\u5de5\u5177\u5e93\u201d\u4f7f\u7528\u3002
    • \u4e66\u4e2d\u5185\u5bb9\u4e3b\u8981\u5305\u62ec\u590d\u6742\u5ea6\u5206\u6790\u3001\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u76d6\u4e86\u8be5\u9886\u57df\u7684\u5927\u90e8\u5206\u4e3b\u9898\u3002
    • \u5bf9\u4e8e\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b66\u9636\u6bb5\u9605\u8bfb\u4e00\u672c\u5165\u95e8\u4e66\u81f3\u5173\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8bb8\u591a\u5f2f\u8def\u3002
    • \u4e66\u4e2d\u7684\u52a8\u753b\u56fe\u89e3\u901a\u5e38\u7528\u4e8e\u4ecb\u7ecd\u91cd\u70b9\u548c\u96be\u70b9\u77e5\u8bc6\u3002\u9605\u8bfb\u672c\u4e66\u65f6\uff0c\u5e94\u7ed9\u4e88\u8fd9\u4e9b\u5185\u5bb9\u66f4\u591a\u5173\u6ce8\u3002
    • \u5b9e\u8df5\u4e43\u5b66\u4e60\u7f16\u7a0b\u4e4b\u6700\u4f73\u9014\u5f84\u3002\u5f3a\u70c8\u5efa\u8bae\u8fd0\u884c\u6e90\u4ee3\u7801\u5e76\u4eb2\u81ea\u6572\u4ee3\u7801\u3002
    • \u672c\u4e66\u7f51\u9875\u7248\u7684\u6bcf\u4e2a\u7ae0\u8282\u90fd\u8bbe\u6709\u8bc4\u8bba\u533a\uff0c\u6b22\u8fce\u968f\u65f6\u5206\u4eab\u4f60\u7684\u7591\u60d1\u4e0e\u89c1\u89e3\u3002
    "},{"location":"chapter_reference/","title":"\u53c2\u8003\u6587\u732e","text":"

    [1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

    [2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

    [3] Robert Sedgewick, et al. Algorithms (4th Edition).

    [4] \u4e25\u851a\u654f. \u6570\u636e\u7ed3\u6784\uff08C \u8bed\u8a00\u7248\uff09.

    [5] \u9093\u4fca\u8f89. \u6570\u636e\u7ed3\u6784\uff08C++ \u8bed\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

    [6] \u9a6c\u514b \u827e\u4f26 \u7ef4\u65af\u8457\uff0c\u9648\u8d8a\u8bd1. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u5206\u6790\uff1aJava\u8bed\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

    [7] \u7a0b\u6770. \u5927\u8bdd\u6570\u636e\u7ed3\u6784.

    [8] \u738b\u4e89. \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u4e4b\u7f8e.

    [9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

    [10] Aston Zhang, et al. Dive into Deep Learning.

    "},{"location":"chapter_searching/","title":"\u7b2c 10 \u7ae0 \u00a0 \u641c\u7d22","text":"

    Abstract

    \u641c\u7d22\u662f\u4e00\u573a\u672a\u77e5\u7684\u5192\u9669\uff0c\u6211\u4eec\u6216\u8bb8\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u95f4\u7684\u6bcf\u4e2a\u89d2\u843d\uff0c\u53c8\u6216\u8bb8\u53ef\u4ee5\u5feb\u901f\u9501\u5b9a\u76ee\u6807\u3002

    \u5728\u8fd9\u573a\u5bfb\u89c5\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u4e2a\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

    "},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 10.1 \u00a0 \u4e8c\u5206\u67e5\u627e
    • 10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9
    • 10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c
    • 10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565
    • 10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5
    • 10.6 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u67e5\u627e","text":"

    \u4e8c\u5206\u67e5\u627e\uff08binary search\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u7d22\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\u641c\u7d22\u8303\u56f4\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u4e3a\u6b62\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5143\u7d20\u6309\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u590d\u3002\u8bf7\u67e5\u627e\u5e76\u8fd4\u56de\u5143\u7d20 target \u5728\u8be5\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u56fe 10-1 \u6240\u793a\u3002

    \u56fe 10-1 \u00a0 \u4e8c\u5206\u67e5\u627e\u793a\u4f8b\u6570\u636e

    \u5982\u56fe 10-2 \u6240\u793a\uff0c\u6211\u4eec\u5148\u521d\u59cb\u5316\u6307\u9488 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u7d22\u533a\u95f4 \\([0, n - 1]\\) \u3002\u8bf7\u6ce8\u610f\uff0c\u4e2d\u62ec\u53f7\u8868\u793a\u95ed\u533a\u95f4\uff0c\u5176\u5305\u542b\u8fb9\u754c\u503c\u672c\u8eab\u3002

    \u63a5\u4e0b\u6765\uff0c\u5faa\u73af\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

    1. \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
    2. \u5224\u65ad nums[m] \u548c target \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u4e09\u79cd\u60c5\u51b5\u3002
      1. \u5f53 nums[m] < target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(i = m + 1\\) \u3002
      2. \u5f53 nums[m] > target \u65f6\uff0c\u8bf4\u660e target \u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u6267\u884c \\(j = m - 1\\) \u3002
      3. \u5f53 nums[m] = target \u65f6\uff0c\u8bf4\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

    \u82e5\u6570\u7ec4\u4e0d\u5305\u542b\u76ee\u6807\u5143\u7d20\uff0c\u641c\u7d22\u533a\u95f4\u6700\u7ec8\u4f1a\u7f29\u5c0f\u4e3a\u7a7a\u3002\u6b64\u65f6\u8fd4\u56de \\(-1\\) \u3002

    <1><2><3><4><5><6><7>

    \u56fe 10-2 \u00a0 \u4e8c\u5206\u67e5\u627e\u6d41\u7a0b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u7c7b\u578b\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u4f1a\u8d85\u51fa int \u7c7b\u578b\u7684\u53d6\u503c\u8303\u56f4\u3002\u4e3a\u4e86\u907f\u514d\u5927\u6570\u8d8a\u754c\uff0c\u6211\u4eec\u901a\u5e38\u91c7\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u6765\u8ba1\u7b97\u4e2d\u70b9\u3002

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8bba\u4e0a Python \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n  while i <= j\n    # \u7406\u8bba\u4e0a Ruby \u7684\u6570\u5b57\u53ef\u4ee5\u65e0\u9650\u5927\uff08\u53d6\u51b3\u4e8e\u5185\u5b58\u5927\u5c0f\uff09\uff0c\u65e0\u987b\u8003\u8651\u5927\u6570\u8d8a\u754c\u95ee\u9898\n    m = (i + j) / 2   # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u67e5\u627e\uff08\u53cc\u95ed\u533a\u95f4\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1] \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i > j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u5faa\u73af\u4e2d\uff0c\u533a\u95f4\u6bcf\u8f6e\u7f29\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u5faa\u73af\u6b21\u6570\u4e3a \\(\\log_2 n\\) \u3002

    \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7a7a\u95f4\u3002

    "},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u533a\u95f4\u8868\u793a\u65b9\u6cd5","text":"

    \u9664\u4e86\u4e0a\u8ff0\u53cc\u95ed\u533a\u95f4\u5916\uff0c\u5e38\u89c1\u7684\u533a\u95f4\u8868\u793a\u8fd8\u6709\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u533a\u95f4\uff0c\u5b9a\u4e49\u4e3a \\([0, n)\\) \uff0c\u5373\u5de6\u8fb9\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u8fb9\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8be5\u8868\u793a\u4e0b\uff0c\u533a\u95f4 \\([i, j)\\) \u5728 \\(i = j\\) \u65f6\u4e3a\u7a7a\u3002

    \u6211\u4eec\u53ef\u4ee5\u57fa\u4e8e\u8be5\u8868\u793a\u5b9e\u73b0\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m \uff0c\u4f7f\u7528 parseInt() \u5411\u4e0b\u53d6\u6574\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n  while i < j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u67e5\u627e\uff08\u5de6\u95ed\u53f3\u5f00\u533a\u95f4\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u95ed\u53f3\u5f00\u533a\u95f4 [0, n) \uff0c\u5373 i, j \u5206\u522b\u6307\u5411\u6570\u7ec4\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u5faa\u73af\uff0c\u5f53\u641c\u7d22\u533a\u95f4\u4e3a\u7a7a\u65f6\u8df3\u51fa\uff08\u5f53 i = j \u65f6\u4e3a\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u51b5\u8bf4\u660e target \u5728\u533a\u95f4 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6807\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u5982\u56fe 10-3 \u6240\u793a\uff0c\u5728\u4e24\u79cd\u533a\u95f4\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u5faa\u73af\u6761\u4ef6\u548c\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

    \u7531\u4e8e\u201c\u53cc\u95ed\u533a\u95f4\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u8fb9\u754c\u90fd\u88ab\u5b9a\u4e49\u4e3a\u95ed\u533a\u95f4\uff0c\u56e0\u6b64\u901a\u8fc7\u6307\u9488 \\(i\\) \u548c\u6307\u9488 \\(j\\) \u7f29\u5c0f\u533a\u95f4\u7684\u64cd\u4f5c\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u8fd9\u6837\u66f4\u4e0d\u5bb9\u6613\u51fa\u9519\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8bae\u91c7\u7528\u201c\u53cc\u95ed\u533a\u95f4\u201d\u7684\u5199\u6cd5\u3002

    \u56fe 10-3 \u00a0 \u4e24\u79cd\u533a\u95f4\u5b9a\u4e49

    "},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u4e8c\u5206\u67e5\u627e\u5728\u65f6\u95f4\u548c\u7a7a\u95f4\u65b9\u9762\u90fd\u6709\u8f83\u597d\u7684\u6027\u80fd\u3002

    • \u4e8c\u5206\u67e5\u627e\u7684\u65f6\u95f4\u6548\u7387\u9ad8\u3002\u5728\u5927\u6570\u636e\u91cf\u4e0b\uff0c\u5bf9\u6570\u9636\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5177\u6709\u663e\u8457\u4f18\u52bf\u3002\u4f8b\u5982\uff0c\u5f53\u6570\u636e\u5927\u5c0f \\(n = 2^{20}\\) \u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u9700\u8981 \\(2^{20} = 1048576\\) \u8f6e\u5faa\u73af\uff0c\u800c\u4e8c\u5206\u67e5\u627e\u4ec5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f6e\u5faa\u73af\u3002
    • \u4e8c\u5206\u67e5\u627e\u65e0\u987b\u989d\u5916\u7a7a\u95f4\u3002\u76f8\u8f83\u4e8e\u9700\u8981\u501f\u52a9\u989d\u5916\u7a7a\u95f4\u7684\u641c\u7d22\u7b97\u6cd5\uff08\u4f8b\u5982\u54c8\u5e0c\u67e5\u627e\uff09\uff0c\u4e8c\u5206\u67e5\u627e\u66f4\u52a0\u8282\u7701\u7a7a\u95f4\u3002

    \u7136\u800c\uff0c\u4e8c\u5206\u67e5\u627e\u5e76\u975e\u9002\u7528\u4e8e\u6240\u6709\u60c5\u51b5\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6709\u5e8f\u6570\u636e\u3002\u82e5\u8f93\u5165\u6570\u636e\u65e0\u5e8f\uff0c\u4e3a\u4e86\u4f7f\u7528\u4e8c\u5206\u67e5\u627e\u800c\u4e13\u95e8\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u507f\u5931\u3002\u56e0\u4e3a\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u901a\u5e38\u4e3a \\(O(n \\log n)\\) \uff0c\u6bd4\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u90fd\u66f4\u9ad8\u3002\u5bf9\u4e8e\u9891\u7e41\u63d2\u5165\u5143\u7d20\u7684\u573a\u666f\uff0c\u4e3a\u4fdd\u6301\u6570\u7ec4\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c06\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8d35\u7684\u3002
    • \u4e8c\u5206\u67e5\u627e\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002\u4e8c\u5206\u67e5\u627e\u9700\u8981\u8df3\u8dc3\u5f0f\uff08\u975e\u8fde\u7eed\u5730\uff09\u8bbf\u95ee\u5143\u7d20\uff0c\u800c\u5728\u94fe\u8868\u4e2d\u6267\u884c\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u7684\u6548\u7387\u8f83\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5e94\u7528\u5728\u94fe\u8868\u6216\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
    • \u5c0f\u6570\u636e\u91cf\u4e0b\uff0c\u7ebf\u6027\u67e5\u627e\u6027\u80fd\u66f4\u4f73\u3002\u5728\u7ebf\u6027\u67e5\u627e\u4e2d\uff0c\u6bcf\u8f6e\u53ea\u9700 1 \u6b21\u5224\u65ad\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u67e5\u627e\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65ad\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u51cf\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u5f53\u6570\u636e\u91cf \\(n\\) \u8f83\u5c0f\u65f6\uff0c\u7ebf\u6027\u67e5\u627e\u53cd\u800c\u6bd4\u4e8c\u5206\u67e5\u627e\u66f4\u5feb\u3002
    "},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u67e5\u627e\u8fb9\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u627e\u5de6\u8fb9\u754c","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\u3002\u8bf7\u8fd4\u56de\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u6570\u7ec4\u4e2d\u4e0d\u5305\u542b\u8be5\u5143\u7d20\uff0c\u5219\u8fd4\u56de \\(-1\\) \u3002

    \u56de\u5fc6\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u7684\u65b9\u6cd5\uff0c\u641c\u7d22\u5b8c\u6210\u540e \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target \uff0c\u56e0\u6b64\u67e5\u627e\u63d2\u5165\u70b9\u672c\u8d28\u4e0a\u662f\u5728\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002

    \u8003\u8651\u901a\u8fc7\u67e5\u627e\u63d2\u5165\u70b9\u7684\u51fd\u6570\u5b9e\u73b0\u67e5\u627e\u5de6\u8fb9\u754c\u3002\u8bf7\u6ce8\u610f\uff0c\u6570\u7ec4\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u8fd9\u79cd\u60c5\u51b5\u53ef\u80fd\u5bfc\u81f4\u4ee5\u4e0b\u4e24\u79cd\u7ed3\u679c\u3002

    • \u63d2\u5165\u70b9\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
    • \u5143\u7d20 nums[i] \u4e0e target \u4e0d\u76f8\u7b49\u3002

    \u5f53\u9047\u5230\u4ee5\u4e0a\u4e24\u79cd\u60c5\u51b5\u65f6\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
    def binary_search_left_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target\"\"\"\n    # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i = binary_search_insertion(nums, target)\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) or nums[i] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size() || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.cs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.Length || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    i := binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == len(nums) || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binarySearchInsertion(nums: nums, target: target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.endIndex || nums[i] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
    binary_search_edge.js
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.ts
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    const i = binarySearchInsertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.dart
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  int i = binarySearchInsertion(nums, target);\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (i == nums.length || nums[i] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n  return i;\n}\n
    binary_search_edge.rs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    let i = binary_search_insertion(nums, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if i == nums.len() as i32 || nums[i as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    i\n}\n
    binary_search_edge.c
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    int i = binarySearchInsertion(nums, numSize, target);\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == numSize || nums[i] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i;\n}\n
    binary_search_edge.kt
    /* \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n    val i = binarySearchInsertion(nums, target)\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (i == nums.size || nums[i] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\n    return i\n}\n
    binary_search_edge.rb
    ### \u4e8c\u5206\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u4ef7\u4e8e\u67e5\u627e target \u7684\u63d2\u5165\u70b9\n  i = binary_search_insertion(nums, target)\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 i\nend\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchLeftEdge}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u627e\u53f3\u8fb9\u754c","text":"

    \u90a3\u4e48\u5982\u4f55\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u4ee3\u7801\uff0c\u66ff\u6362\u5728 nums[m] == target \u60c5\u51b5\u4e0b\u7684\u6307\u9488\u6536\u7f29\u64cd\u4f5c\u3002\u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u3002

    \u4e0b\u9762\u6211\u4eec\u4ecb\u7ecd\u4e24\u79cd\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

    "},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u590d\u7528\u67e5\u627e\u5de6\u8fb9\u754c","text":"

    \u5b9e\u9645\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u67e5\u627e\u6700\u5de6\u5143\u7d20\u7684\u51fd\u6570\u6765\u67e5\u627e\u6700\u53f3\u5143\u7d20\uff0c\u5177\u4f53\u65b9\u6cd5\u4e3a\uff1a\u5c06\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\u3002

    \u5982\u56fe 10-7 \u6240\u793a\uff0c\u67e5\u627e\u5b8c\u6210\u540e\uff0c\u6307\u9488 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u4e2a target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

    \u56fe 10-7 \u00a0 \u5c06\u67e5\u627e\u53f3\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5de6\u8fb9\u754c

    \u8bf7\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u70b9\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c06\u5176\u51cf \\(1\\) \uff0c\u4ece\u800c\u83b7\u5f97 \\(j\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target\"\"\"\n    # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j = i - 1\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 or nums[j] != target:\n        return -1\n    # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n
    binary_search_edge.cpp
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.java
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.cs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.go
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    j := i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
    binary_search_edge.swift
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
    binary_search_edge.js
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.ts
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    const j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.dart
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  int j = i - 1;\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  if (j == -1 || nums[j] != target) {\n    return -1;\n  }\n  // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n  return j;\n}\n
    binary_search_edge.rs
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    let j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if j == -1 || nums[j as usize] != target {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    j\n}\n
    binary_search_edge.c
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    int j = i - 1;\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j;\n}\n
    binary_search_edge.kt
    /* \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n    val j = i - 1\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n    if (j == -1 || nums[j] != target) {\n        return -1\n    }\n    // \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\n    return j\n}\n
    binary_search_edge.rb
    ### \u4e8c\u5206\u67e5\u627e\u6700\u53f3\u4e00\u4e2a target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f6c\u5316\u4e3a\u67e5\u627e\u6700\u5de6\u4e00\u4e2a target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u4e2a target \uff0ci \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\n  j = i - 1\n\n  # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de -1\n  return -1 if j == -1 || nums[j] != target\n\n  j # \u627e\u5230 target \uff0c\u8fd4\u56de\u7d22\u5f15 j\nend\n
    binary_search_edge.zig
    [class]{}-[func]{binarySearchRightEdge}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20","text":"

    \u6211\u4eec\u77e5\u9053\uff0c\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u6700\u7ec8 \\(i\\) \u548c \\(j\\) \u4f1a\u5206\u522b\u6307\u5411\u9996\u4e2a\u5927\u4e8e\u3001\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002

    \u56e0\u6b64\uff0c\u5982\u56fe 10-8 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u6784\u9020\u4e00\u4e2a\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u4e8e\u67e5\u627e\u5de6\u53f3\u8fb9\u754c\u3002

    • \u67e5\u627e\u6700\u5de6\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target - 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(i\\) \u3002
    • \u67e5\u627e\u6700\u53f3\u4e00\u4e2a target \uff1a\u53ef\u4ee5\u8f6c\u5316\u4e3a\u67e5\u627e target + 0.5 \uff0c\u5e76\u8fd4\u56de\u6307\u9488 \\(j\\) \u3002

    \u56fe 10-8 \u00a0 \u5c06\u67e5\u627e\u8fb9\u754c\u8f6c\u5316\u4e3a\u67e5\u627e\u5143\u7d20

    \u4ee3\u7801\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u4e24\u70b9\u503c\u5f97\u6ce8\u610f\u3002

    • \u7ed9\u5b9a\u6570\u7ec4\u4e0d\u5305\u542b\u5c0f\u6570\uff0c\u8fd9\u610f\u5473\u7740\u6211\u4eec\u65e0\u987b\u5173\u5fc3\u5982\u4f55\u5904\u7406\u76f8\u7b49\u7684\u60c5\u51b5\u3002
    • \u56e0\u4e3a\u8be5\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6570\uff0c\u6240\u4ee5\u9700\u8981\u5c06\u51fd\u6570\u4e2d\u7684\u53d8\u91cf target \u6539\u4e3a\u6d6e\u70b9\u6570\u7c7b\u578b\uff08Python \u65e0\u987b\u6539\u52a8\uff09\u3002
    "},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9","text":"

    \u4e8c\u5206\u67e5\u627e\u4e0d\u4ec5\u53ef\u7528\u4e8e\u641c\u7d22\u76ee\u6807\u5143\u7d20\uff0c\u8fd8\u53ef\u7528\u4e8e\u89e3\u51b3\u8bb8\u591a\u53d8\u79cd\u95ee\u9898\uff0c\u6bd4\u5982\u641c\u7d22\u76ee\u6807\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

    "},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u65e0\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6709\u5e8f\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u5143\u7d20 target \uff0c\u6570\u7ec4\u4e0d\u5b58\u5728\u91cd\u590d\u5143\u7d20\u3002\u73b0\u5c06 target \u63d2\u5165\u6570\u7ec4 nums \u4e2d\uff0c\u5e76\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u6570\u7ec4\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5219\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8bf7\u8fd4\u56de\u63d2\u5165\u540e target \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u56fe 10-4 \u6240\u793a\u3002

    \u56fe 10-4 \u00a0 \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\u793a\u4f8b\u6570\u636e

    \u5982\u679c\u60f3\u590d\u7528\u4e0a\u4e00\u8282\u7684\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\uff0c\u5219\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u4e24\u4e2a\u95ee\u9898\u3002

    \u95ee\u9898\u4e00\uff1a\u5f53\u6570\u7ec4\u4e2d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u662f\u5426\u662f\u8be5\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u9898\u76ee\u8981\u6c42\u5c06 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u8fb9\uff0c\u8fd9\u610f\u5473\u7740\u65b0\u63d2\u5165\u7684 target \u66ff\u6362\u4e86\u539f\u6765 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u6570\u7ec4\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u70b9\u7684\u7d22\u5f15\u5c31\u662f\u8be5 target \u7684\u7d22\u5f15\u3002

    \u95ee\u9898\u4e8c\uff1a\u5f53\u6570\u7ec4\u4e2d\u4e0d\u5b58\u5728 target \u65f6\uff0c\u63d2\u5165\u70b9\u662f\u54ea\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u8fdb\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u67e5\u627e\u8fc7\u7a0b\uff1a\u5f53 nums[m] < target \u65f6 \\(i\\) \u79fb\u52a8\uff0c\u8fd9\u610f\u5473\u7740\u6307\u9488 \\(i\\) \u5728\u5411\u5927\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u9488 \\(j\\) \u59cb\u7ec8\u5728\u5411\u5c0f\u4e8e\u7b49\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u56e0\u6b64\u4e8c\u5206\u7ed3\u675f\u65f6\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u4e2a\u5927\u4e8e target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u3002\u6613\u5f97\u5f53\u6570\u7ec4\u4e0d\u5305\u542b target \u65f6\uff0c\u63d2\u5165\u7d22\u5f15\u4e3a \\(i\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
    def binary_search_insertion_simple(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(\n    nums: Array<number>,\n    target: number\n): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u65e0\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertionSimple}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u590d\u5143\u7d20\u7684\u60c5\u51b5","text":"

    Question

    \u5728\u4e0a\u4e00\u9898\u7684\u57fa\u7840\u4e0a\uff0c\u89c4\u5b9a\u6570\u7ec4\u53ef\u80fd\u5305\u542b\u91cd\u590d\u5143\u7d20\uff0c\u5176\u4f59\u4e0d\u53d8\u3002

    \u5047\u8bbe\u6570\u7ec4\u4e2d\u5b58\u5728\u591a\u4e2a target \uff0c\u5219\u666e\u901a\u4e8c\u5206\u67e5\u627e\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u800c\u65e0\u6cd5\u786e\u5b9a\u8be5\u5143\u7d20\u7684\u5de6\u8fb9\u548c\u53f3\u8fb9\u8fd8\u6709\u591a\u5c11 target\u3002

    \u9898\u76ee\u8981\u6c42\u5c06\u76ee\u6807\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u8fb9\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u67e5\u627e\u6570\u7ec4\u4e2d\u6700\u5de6\u4e00\u4e2a target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u8651\u901a\u8fc7\u56fe 10-5 \u6240\u793a\u7684\u6b65\u9aa4\u5b9e\u73b0\u3002

    1. \u6267\u884c\u4e8c\u5206\u67e5\u627e\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u4e2a target \u7684\u7d22\u5f15\uff0c\u8bb0\u4e3a \\(k\\) \u3002
    2. \u4ece\u7d22\u5f15 \\(k\\) \u5f00\u59cb\uff0c\u5411\u5de6\u8fdb\u884c\u7ebf\u6027\u904d\u5386\uff0c\u5f53\u627e\u5230\u6700\u5de6\u8fb9\u7684 target \u65f6\u8fd4\u56de\u3002

    \u56fe 10-5 \u00a0 \u7ebf\u6027\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9

    \u6b64\u65b9\u6cd5\u867d\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7ebf\u6027\u67e5\u627e\uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5f53\u6570\u7ec4\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u590d\u7684 target \u65f6\uff0c\u8be5\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

    \u73b0\u8003\u8651\u62d3\u5c55\u4e8c\u5206\u67e5\u627e\u4ee3\u7801\u3002\u5982\u56fe 10-6 \u6240\u793a\uff0c\u6574\u4f53\u6d41\u7a0b\u4fdd\u6301\u4e0d\u53d8\uff0c\u6bcf\u8f6e\u5148\u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65ad target \u548c nums[m] \u7684\u5927\u5c0f\u5173\u7cfb\uff0c\u5206\u4e3a\u4ee5\u4e0b\u51e0\u79cd\u60c5\u51b5\u3002

    • \u5f53 nums[m] < target \u6216 nums[m] > target \u65f6\uff0c\u8bf4\u660e\u8fd8\u6ca1\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u91c7\u7528\u666e\u901a\u4e8c\u5206\u67e5\u627e\u7684\u7f29\u5c0f\u533a\u95f4\u64cd\u4f5c\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
    • \u5f53 nums[m] == target \u65f6\uff0c\u8bf4\u660e\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u91c7\u7528 \\(j = m - 1\\) \u6765\u7f29\u5c0f\u533a\u95f4\uff0c\u4ece\u800c\u4f7f\u6307\u9488 \\(j\\) \u5411\u5c0f\u4e8e target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u5faa\u73af\u5b8c\u6210\u540e\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u8fb9\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u70b9\u3002

    <1><2><3><4><5><6><7><8>

    \u56fe 10-6 \u00a0 \u4e8c\u5206\u67e5\u627e\u91cd\u590d\u5143\u7d20\u7684\u63d2\u5165\u70b9\u7684\u6b65\u9aa4

    \u89c2\u5bdf\u4ee5\u4e0b\u4ee3\u7801\uff0c\u5224\u65ad\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u4e24\u8005\u53ef\u4ee5\u5408\u5e76\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u5c06\u5224\u65ad\u6761\u4ef6\u4fdd\u6301\u5c55\u5f00\uff0c\u56e0\u4e3a\u5176\u903b\u8f91\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8bfb\u6027\u66f4\u597d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
    def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u70b9 i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\npub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u70b9 i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u67e5\u627e\u63d2\u5165\u70b9\uff08\u5b58\u5728\u91cd\u590d\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u53cc\u95ed\u533a\u95f4 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8ba1\u7b97\u4e2d\u70b9\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u533a\u95f4 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u533a\u95f4 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u4e2a\u5c0f\u4e8e target \u7684\u5143\u7d20\u5728\u533a\u95f4 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u70b9 i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertion}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Tip

    \u672c\u8282\u7684\u4ee3\u7801\u90fd\u662f\u201c\u53cc\u95ed\u533a\u95f4\u201d\u5199\u6cd5\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u5b9e\u73b0\u201c\u5de6\u95ed\u53f3\u5f00\u201d\u5199\u6cd5\u3002

    \u603b\u7684\u6765\u770b\uff0c\u4e8c\u5206\u67e5\u627e\u65e0\u975e\u5c31\u662f\u7ed9\u6307\u9488 \\(i\\) \u548c \\(j\\) \u5206\u522b\u8bbe\u5b9a\u641c\u7d22\u76ee\u6807\uff0c\u76ee\u6807\u53ef\u80fd\u662f\u4e00\u4e2a\u5177\u4f53\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u4e2a\u5143\u7d20\u8303\u56f4\uff08\u4f8b\u5982\u5c0f\u4e8e target \u7684\u5143\u7d20\uff09\u3002

    \u5728\u4e0d\u65ad\u7684\u5faa\u73af\u4e8c\u5206\u4e2d\uff0c\u6307\u9488 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6e10\u903c\u8fd1\u9884\u5148\u8bbe\u5b9a\u7684\u76ee\u6807\u3002\u6700\u7ec8\uff0c\u5b83\u4eec\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u8fc7\u8fb9\u754c\u540e\u505c\u6b62\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u54c8\u5e0c\u4f18\u5316\u7b56\u7565","text":"

    \u5728\u7b97\u6cd5\u9898\u4e2d\uff0c\u6211\u4eec\u5e38\u901a\u8fc7\u5c06\u7ebf\u6027\u67e5\u627e\u66ff\u6362\u4e3a\u54c8\u5e0c\u67e5\u627e\u6765\u964d\u4f4e\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002\u6211\u4eec\u501f\u52a9\u4e00\u4e2a\u7b97\u6cd5\u9898\u6765\u52a0\u6df1\u7406\u89e3\u3002

    Question

    \u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4 nums \u548c\u4e00\u4e2a\u76ee\u6807\u5143\u7d20 target \uff0c\u8bf7\u5728\u6570\u7ec4\u4e2d\u641c\u7d22\u201c\u548c\u201d\u4e3a target \u7684\u4e24\u4e2a\u5143\u7d20\uff0c\u5e76\u8fd4\u56de\u5b83\u4eec\u7684\u6570\u7ec4\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u4e2a\u89e3\u5373\u53ef\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7ebf\u6027\u67e5\u627e\uff1a\u4ee5\u65f6\u95f4\u6362\u7a7a\u95f4","text":"

    \u8003\u8651\u76f4\u63a5\u904d\u5386\u6240\u6709\u53ef\u80fd\u7684\u7ec4\u5408\u3002\u5982\u56fe 10-9 \u6240\u793a\uff0c\u6211\u4eec\u5f00\u542f\u4e00\u4e2a\u4e24\u5c42\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u5224\u65ad\u4e24\u4e2a\u6574\u6570\u7684\u548c\u662f\u5426\u4e3a target \uff0c\u82e5\u662f\uff0c\u5219\u8fd4\u56de\u5b83\u4eec\u7684\u7d22\u5f15\u3002

    \u56fe 10-9 \u00a0 \u7ebf\u6027\u67e5\u627e\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
    def two_sum_brute_force(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\"\"\"\n    # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in range(len(nums) - 1):\n        for j in range(i + 1, len(nums)):\n            if nums[i] + nums[j] == target:\n                return [i, j]\n    return []\n
    two_sum.cpp
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return {i, j};\n        }\n    }\n    return {};\n}\n
    two_sum.java
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return new int[] { i, j };\n        }\n    }\n    return new int[0];\n}\n
    two_sum.cs
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return [i, j];\n        }\n    }\n    return [];\n}\n
    two_sum.go
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in nums.indices.dropLast() {\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[i] + nums[j] == target {\n                return [i, j]\n            }\n        }\n    }\n    return [0]\n}\n
    two_sum.js
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
    two_sum.ts
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
    two_sum.dart
    /* \u65b9\u6cd5\u4e00\uff1a \u66b4\u529b\u679a\u4e3e */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for (var i = 0; i < size - 1; i++) {\n    for (var j = i + 1; j < size; j++) {\n      if (nums[i] + nums[j] == target) return [i, j];\n    }\n  }\n  return [0];\n}\n
    two_sum.rs
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for i in 0..size - 1 {\n        for j in i + 1..size {\n            if nums[i] + nums[j] == target {\n                return Some(vec![i as i32, j as i32]);\n            }\n        }\n    }\n    None\n}\n
    two_sum.c
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\n    for (int i = 0; i < numsSize; ++i) {\n        for (int j = i + 1; j < numsSize; ++j) {\n            if (nums[i] + nums[j] == target) {\n                int *res = malloc(sizeof(int) * 2);\n                res[0] = i, res[1] = j;\n                *returnSize = 2;\n                return res;\n            }\n        }\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
    two_sum.kt
    /* \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    for (i in 0..<size - 1) {\n        for (j in i + 1..<size) {\n            if (nums[i] + nums[j] == target) return intArrayOf(i, j)\n        }\n    }\n    return IntArray(0)\n}\n
    two_sum.rb
    ### \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e ###\ndef two_sum_brute_force(nums, target)\n  # \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n
    two_sum.zig
    // \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u679a\u4e3e\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u4e24\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n^2)\n    while (i < size - 1) : (i += 1) {\n        var j = i + 1;\n        while (j < size) : (j += 1) {\n            if (nums[i] + nums[j] == target) {\n                return [_]i32{@intCast(i), @intCast(j)};\n            }\n        }\n    }\n    return null;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6b64\u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \uff0c\u5728\u5927\u6570\u636e\u91cf\u4e0b\u975e\u5e38\u8017\u65f6\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u54c8\u5e0c\u67e5\u627e\uff1a\u4ee5\u7a7a\u95f4\u6362\u65f6\u95f4","text":"

    \u8003\u8651\u501f\u52a9\u4e00\u4e2a\u54c8\u5e0c\u8868\uff0c\u952e\u503c\u5bf9\u5206\u522b\u4e3a\u6570\u7ec4\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u5faa\u73af\u904d\u5386\u6570\u7ec4\uff0c\u6bcf\u8f6e\u6267\u884c\u56fe 10-10 \u6240\u793a\u7684\u6b65\u9aa4\u3002

    1. \u5224\u65ad\u6570\u5b57 target - nums[i] \u662f\u5426\u5728\u54c8\u5e0c\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\u8fd9\u4e24\u4e2a\u5143\u7d20\u7684\u7d22\u5f15\u3002
    2. \u5c06\u952e\u503c\u5bf9 nums[i] \u548c\u7d22\u5f15 i \u6dfb\u52a0\u8fdb\u54c8\u5e0c\u8868\u3002
    <1><2><3>

    \u56fe 10-10 \u00a0 \u8f85\u52a9\u54c8\u5e0c\u8868\u6c42\u89e3\u4e24\u6570\u4e4b\u548c

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff0c\u4ec5\u9700\u5355\u5c42\u5faa\u73af\u5373\u53ef\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig two_sum.py
    def two_sum_hash_table(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\"\"\"\n    # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    dic = {}\n    # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in range(len(nums)):\n        if target - nums[i] in dic:\n            return [dic[target - nums[i]], i]\n        dic[nums[i]] = i\n    return []\n
    two_sum.cpp
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    unordered_map<int, int> dic;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.find(target - nums[i]) != dic.end()) {\n            return {dic[target - nums[i]], i};\n        }\n        dic.emplace(nums[i], i);\n    }\n    return {};\n}\n
    two_sum.java
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.containsKey(target - nums[i])) {\n            return new int[] { dic.get(target - nums[i]), i };\n        }\n        dic.put(nums[i], i);\n    }\n    return new int[0];\n}\n
    two_sum.cs
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    Dictionary<int, int> dic = [];\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.ContainsKey(target - nums[i])) {\n            return [dic[target - nums[i]], i];\n        }\n        dic.Add(nums[i], i);\n    }\n    return [];\n}\n
    two_sum.go
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    hashTable := map[int]int{}\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for idx, val := range nums {\n        if preIdx, ok := hashTable[target-val]; ok {\n            return []int{preIdx, idx}\n        }\n        hashTable[val] = idx\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic: [Int: Int] = [:]\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for i in nums.indices {\n        if let j = dic[target - nums[i]] {\n            return [j, i]\n        }\n        dic[nums[i]] = i\n    }\n    return [0]\n}\n
    two_sum.js
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m = {};\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        if (m[target - nums[i]] !== undefined) {\n            return [m[target - nums[i]], i];\n        } else {\n            m[nums[i]] = i;\n        }\n    }\n    return [];\n}\n
    two_sum.ts
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let m: Map<number, number> = new Map();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (let i = 0; i < nums.length; i++) {\n        let index = m.get(target - nums[i]);\n        if (index !== undefined) {\n            return [index, i];\n        } else {\n            m.set(nums[i], i);\n        }\n    }\n    return [];\n}\n
    two_sum.dart
    /* \u65b9\u6cd5\u4e8c\uff1a \u8f85\u52a9\u54c8\u5e0c\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  Map<int, int> dic = HashMap();\n  // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for (var i = 0; i < size; i++) {\n    if (dic.containsKey(target - nums[i])) {\n      return [dic[target - nums[i]]!, i];\n    }\n    dic.putIfAbsent(nums[i], () => i);\n  }\n  return [0];\n}\n
    two_sum.rs
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    let mut dic = HashMap::new();\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i, num) in nums.iter().enumerate() {\n        match dic.get(&(target - num)) {\n            Some(v) => return Some(vec![*v as i32, i as i32]),\n            None => dic.insert(num, i as i32),\n        };\n    }\n    None\n}\n
    two_sum.c
    /* \u54c8\u5e0c\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u4e8e uthash.h \u5b9e\u73b0\n} HashTable;\n\n/* \u54c8\u5e0c\u8868\u67e5\u8be2 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u54c8\u5e0c\u8868\u5143\u7d20\u63d2\u5165 */\nvoid insert(HashTable *h, int key, int val) {\n    HashTable *t = find(h, key);\n    if (t == NULL) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = key, tmp->val = val;\n        HASH_ADD_INT(h, key, tmp);\n    } else {\n        t->val = val;\n    }\n}\n\n/* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\n    HashTable *hashtable = NULL;\n    for (int i = 0; i < numsSize; i++) {\n        HashTable *t = find(hashtable, target - nums[i]);\n        if (t != NULL) {\n            int *res = malloc(sizeof(int) * 2);\n            res[0] = t->val, res[1] = i;\n            *returnSize = 2;\n            return res;\n        }\n        insert(hashtable, nums[i], i);\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
    two_sum.kt
    /* \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    val dic = HashMap<Int, Int>()\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    for (i in 0..<size) {\n        if (dic.containsKey(target - nums[i])) {\n            return intArrayOf(dic[target - nums[i]]!!, i)\n        }\n        dic[nums[i]] = i\n    }\n    return IntArray(0)\n}\n
    two_sum.rb
    ### \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  dic = {}\n  # \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n  for i in 0...nums.length\n    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])\n\n    dic[nums[i]] = i\n  end\n\n  []\nend\n
    two_sum.zig
    // \u65b9\u6cd5\u4e8c\uff1a\u8f85\u52a9\u54c8\u5e0c\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f85\u52a9\u54c8\u5e0c\u8868\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u5355\u5c42\u5faa\u73af\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\n    while (i < size) : (i += 1) {\n        if (dic.contains(target - nums[i])) {\n            return [_]i32{dic.get(target - nums[i]).?, @intCast(i)};\n        }\n        try dic.put(nums[i], @intCast(i));\n    }\n    return null;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u6b64\u65b9\u6cd5\u901a\u8fc7\u54c8\u5e0c\u67e5\u627e\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u8fd0\u884c\u6548\u7387\u3002

    \u7531\u4e8e\u9700\u8981\u7ef4\u62a4\u4e00\u4e2a\u989d\u5916\u7684\u54c8\u5e0c\u8868\uff0c\u56e0\u6b64\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \u3002\u5c3d\u7ba1\u5982\u6b64\uff0c\u8be5\u65b9\u6cd5\u7684\u6574\u4f53\u65f6\u7a7a\u6548\u7387\u66f4\u4e3a\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u9898\u7684\u6700\u4f18\u89e3\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8bc6\u641c\u7d22\u7b97\u6cd5","text":"

    \u641c\u7d22\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u4e8e\u5728\u6570\u636e\u7ed3\u6784\uff08\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u6216\u56fe\uff09\u4e2d\u641c\u7d22\u4e00\u4e2a\u6216\u4e00\u7ec4\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u7684\u5143\u7d20\u3002

    \u641c\u7d22\u7b97\u6cd5\u53ef\u6839\u636e\u5b9e\u73b0\u601d\u8def\u5206\u4e3a\u4ee5\u4e0b\u4e24\u7c7b\u3002

    • \u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\uff0c\u4f8b\u5982\u6570\u7ec4\u3001\u94fe\u8868\u3001\u6811\u548c\u56fe\u7684\u904d\u5386\u7b49\u3002
    • \u5229\u7528\u6570\u636e\u7ec4\u7ec7\u7ed3\u6784\u6216\u6570\u636e\u5305\u542b\u7684\u5148\u9a8c\u4fe1\u606f\uff0c\u5b9e\u73b0\u9ad8\u6548\u5143\u7d20\u67e5\u627e\uff0c\u4f8b\u5982\u4e8c\u5206\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u548c\u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u7b49\u3002

    \u4e0d\u96be\u53d1\u73b0\uff0c\u8fd9\u4e9b\u77e5\u8bc6\u70b9\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u56e0\u6b64\u641c\u7d22\u7b97\u6cd5\u5bf9\u4e8e\u6211\u4eec\u6765\u8bf4\u5e76\u4e0d\u964c\u751f\u3002\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ece\u66f4\u52a0\u7cfb\u7edf\u7684\u89c6\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5ba1\u89c6\u641c\u7d22\u7b97\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u7d22","text":"

    \u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u7684\u6bcf\u4e2a\u5143\u7d20\u6765\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

    • \u201c\u7ebf\u6027\u641c\u7d22\u201d\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\u7b49\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u5b83\u4ece\u6570\u636e\u7ed3\u6784\u7684\u4e00\u7aef\u5f00\u59cb\uff0c\u9010\u4e2a\u8bbf\u95ee\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6807\u5143\u7d20\u6216\u5230\u8fbe\u53e6\u4e00\u7aef\u4ecd\u6ca1\u6709\u627e\u5230\u76ee\u6807\u5143\u7d20\u4e3a\u6b62\u3002
    • \u201c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u548c\u201c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u201d\u662f\u56fe\u548c\u6811\u7684\u4e24\u79cd\u904d\u5386\u7b56\u7565\u3002\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\u9010\u5c42\u641c\u7d22\uff0c\u7531\u8fd1\u53ca\u8fdc\u5730\u8bbf\u95ee\u5404\u4e2a\u8282\u70b9\u3002\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4ece\u521d\u59cb\u8282\u70b9\u5f00\u59cb\uff0c\u6cbf\u7740\u4e00\u6761\u8def\u5f84\u8d70\u5230\u5934\uff0c\u518d\u56de\u6eaf\u5e76\u5c1d\u8bd5\u5176\u4ed6\u8def\u5f84\uff0c\u76f4\u5230\u904d\u5386\u5b8c\u6574\u4e2a\u6570\u636e\u7ed3\u6784\u3002

    \u66b4\u529b\u641c\u7d22\u7684\u4f18\u70b9\u662f\u7b80\u5355\u4e14\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u505a\u9884\u5904\u7406\u548c\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\u3002

    \u7136\u800c\uff0c\u6b64\u7c7b\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u4e3a\u5143\u7d20\u6570\u91cf\uff0c\u56e0\u6b64\u5728\u6570\u636e\u91cf\u8f83\u5927\u7684\u60c5\u51b5\u4e0b\u6027\u80fd\u8f83\u5dee\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9002\u5e94\u641c\u7d22","text":"

    \u81ea\u9002\u5e94\u641c\u7d22\u5229\u7528\u6570\u636e\u7684\u7279\u6709\u5c5e\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u6765\u4f18\u5316\u641c\u7d22\u8fc7\u7a0b\uff0c\u4ece\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

    • \u201c\u4e8c\u5206\u67e5\u627e\u201d\u5229\u7528\u6570\u636e\u7684\u6709\u5e8f\u6027\u5b9e\u73b0\u9ad8\u6548\u67e5\u627e\uff0c\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u3002
    • \u201c\u54c8\u5e0c\u67e5\u627e\u201d\u5229\u7528\u54c8\u5e0c\u8868\u5c06\u641c\u7d22\u6570\u636e\u548c\u76ee\u6807\u6570\u636e\u5efa\u7acb\u4e3a\u952e\u503c\u5bf9\u6620\u5c04\uff0c\u4ece\u800c\u5b9e\u73b0\u67e5\u8be2\u64cd\u4f5c\u3002
    • \u201c\u6811\u67e5\u627e\u201d\u5728\u7279\u5b9a\u7684\u6811\u7ed3\u6784\uff08\u4f8b\u5982\u4e8c\u53c9\u641c\u7d22\u6811\uff09\u4e2d\uff0c\u57fa\u4e8e\u6bd4\u8f83\u8282\u70b9\u503c\u6765\u5feb\u901f\u6392\u9664\u8282\u70b9\uff0c\u4ece\u800c\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002

    \u6b64\u7c7b\u7b97\u6cd5\u7684\u4f18\u70b9\u662f\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u7136\u800c\uff0c\u4f7f\u7528\u8fd9\u4e9b\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u67e5\u627e\u9700\u8981\u9884\u5148\u5bf9\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\uff0c\u54c8\u5e0c\u67e5\u627e\u548c\u6811\u67e5\u627e\u90fd\u9700\u8981\u501f\u52a9\u989d\u5916\u7684\u6570\u636e\u7ed3\u6784\uff0c\u7ef4\u62a4\u8fd9\u4e9b\u6570\u636e\u7ed3\u6784\u4e5f\u9700\u8981\u989d\u5916\u7684\u65f6\u95f4\u548c\u7a7a\u95f4\u5f00\u9500\u3002

    Tip

    \u81ea\u9002\u5e94\u641c\u7d22\u7b97\u6cd5\u5e38\u88ab\u79f0\u4e3a\u67e5\u627e\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u4e8e\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u68c0\u7d22\u76ee\u6807\u5143\u7d20\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u7d22\u65b9\u6cd5\u9009\u53d6","text":"

    \u7ed9\u5b9a\u5927\u5c0f\u4e3a \\(n\\) \u7684\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u7ebf\u6027\u641c\u7d22\u3001\u4e8c\u5206\u67e5\u627e\u3001\u6811\u67e5\u627e\u3001\u54c8\u5e0c\u67e5\u627e\u7b49\u591a\u79cd\u65b9\u6cd5\u4ece\u4e2d\u641c\u7d22\u76ee\u6807\u5143\u7d20\u3002\u5404\u4e2a\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u56fe 10-11 \u6240\u793a\u3002

    \u56fe 10-11 \u00a0 \u591a\u79cd\u641c\u7d22\u7b56\u7565

    \u4e0a\u8ff0\u51e0\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u4e0e\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

    \u8868 10-1 \u00a0 \u67e5\u627e\u7b97\u6cd5\u6548\u7387\u5bf9\u6bd4

    \u7ebf\u6027\u641c\u7d22 \u4e8c\u5206\u67e5\u627e \u6811\u67e5\u627e \u54c8\u5e0c\u67e5\u627e \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u989d\u5916\u7a7a\u95f4 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u6570\u636e\u9884\u5904\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6811 \\(O(n \\log n)\\) \u5efa\u54c8\u5e0c\u8868 \\(O(n)\\) \u6570\u636e\u662f\u5426\u6709\u5e8f \u65e0\u5e8f \u6709\u5e8f \u6709\u5e8f \u65e0\u5e8f

    \u641c\u7d22\u7b97\u6cd5\u7684\u9009\u62e9\u8fd8\u53d6\u51b3\u4e8e\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u4e0e\u66f4\u65b0\u9891\u7387\u7b49\u3002

    \u7ebf\u6027\u641c\u7d22

    • \u901a\u7528\u6027\u8f83\u597d\uff0c\u65e0\u987b\u4efb\u4f55\u6570\u636e\u9884\u5904\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u4eec\u4ec5\u9700\u67e5\u8be2\u4e00\u6b21\u6570\u636e\uff0c\u90a3\u4e48\u5176\u4ed6\u4e09\u79cd\u65b9\u6cd5\u7684\u6570\u636e\u9884\u5904\u7406\u7684\u65f6\u95f4\u6bd4\u7ebf\u6027\u641c\u7d22\u7684\u65f6\u95f4\u8fd8\u8981\u66f4\u957f\u3002
    • \u9002\u7528\u4e8e\u4f53\u91cf\u8f83\u5c0f\u7684\u6570\u636e\uff0c\u6b64\u60c5\u51b5\u4e0b\u65f6\u95f4\u590d\u6742\u5ea6\u5bf9\u6548\u7387\u5f71\u54cd\u8f83\u5c0f\u3002
    • \u9002\u7528\u4e8e\u6570\u636e\u66f4\u65b0\u9891\u7387\u8f83\u9ad8\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u8be5\u65b9\u6cd5\u4e0d\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u4efb\u4f55\u989d\u5916\u7ef4\u62a4\u3002

    \u4e8c\u5206\u67e5\u627e

    • \u9002\u7528\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u6548\u7387\u8868\u73b0\u7a33\u5b9a\uff0c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \u3002
    • \u6570\u636e\u91cf\u4e0d\u80fd\u8fc7\u5927\uff0c\u56e0\u4e3a\u5b58\u50a8\u6570\u7ec4\u9700\u8981\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u3002
    • \u4e0d\u9002\u7528\u4e8e\u9ad8\u9891\u589e\u5220\u6570\u636e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u7ef4\u62a4\u6709\u5e8f\u6570\u7ec4\u7684\u5f00\u9500\u8f83\u5927\u3002

    \u54c8\u5e0c\u67e5\u627e

    • \u9002\u5408\u5bf9\u67e5\u8be2\u6027\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u573a\u666f\uff0c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\) \u3002
    • \u4e0d\u9002\u5408\u9700\u8981\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u65e0\u6cd5\u7ef4\u62a4\u6570\u636e\u7684\u6709\u5e8f\u6027\u3002
    • \u5bf9\u54c8\u5e0c\u51fd\u6570\u548c\u54c8\u5e0c\u51b2\u7a81\u5904\u7406\u7b56\u7565\u7684\u4f9d\u8d56\u6027\u8f83\u9ad8\uff0c\u5177\u6709\u8f83\u5927\u7684\u6027\u80fd\u52a3\u5316\u98ce\u9669\u3002
    • \u4e0d\u9002\u5408\u6570\u636e\u91cf\u8fc7\u5927\u7684\u60c5\u51b5\uff0c\u56e0\u4e3a\u54c8\u5e0c\u8868\u9700\u8981\u989d\u5916\u7a7a\u95f4\u6765\u6700\u5927\u7a0b\u5ea6\u5730\u51cf\u5c11\u51b2\u7a81\uff0c\u4ece\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8be2\u6027\u80fd\u3002

    \u6811\u67e5\u627e

    • \u9002\u7528\u4e8e\u6d77\u91cf\u6570\u636e\uff0c\u56e0\u4e3a\u6811\u8282\u70b9\u5728\u5185\u5b58\u4e2d\u662f\u5206\u6563\u5b58\u50a8\u7684\u3002
    • \u9002\u5408\u9700\u8981\u7ef4\u62a4\u6709\u5e8f\u6570\u636e\u6216\u8303\u56f4\u67e5\u627e\u7684\u573a\u666f\u3002
    • \u5728\u6301\u7eed\u589e\u5220\u8282\u70b9\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u4ea7\u751f\u503e\u659c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • \u82e5\u4f7f\u7528 AVL \u6811\u6216\u7ea2\u9ed1\u6811\uff0c\u5219\u5404\u9879\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a33\u5b9a\u8fd0\u884c\uff0c\u4f46\u7ef4\u62a4\u6811\u5e73\u8861\u7684\u64cd\u4f5c\u4f1a\u589e\u52a0\u989d\u5916\u7684\u5f00\u9500\u3002
    "},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7ed3","text":"
    • \u4e8c\u5206\u67e5\u627e\u4f9d\u8d56\u6570\u636e\u7684\u6709\u5e8f\u6027\uff0c\u901a\u8fc7\u5faa\u73af\u9010\u6b65\u7f29\u51cf\u4e00\u534a\u641c\u7d22\u533a\u95f4\u6765\u8fdb\u884c\u67e5\u627e\u3002\u5b83\u8981\u6c42\u8f93\u5165\u6570\u636e\u6709\u5e8f\uff0c\u4e14\u4ec5\u9002\u7528\u4e8e\u6570\u7ec4\u6216\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6570\u636e\u7ed3\u6784\u3002
    • \u66b4\u529b\u641c\u7d22\u901a\u8fc7\u904d\u5386\u6570\u636e\u7ed3\u6784\u6765\u5b9a\u4f4d\u6570\u636e\u3002\u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u6570\u7ec4\u548c\u94fe\u8868\uff0c\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u548c\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u9002\u7528\u4e8e\u56fe\u548c\u6811\u3002\u6b64\u7c7b\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u65e0\u987b\u5bf9\u6570\u636e\u8fdb\u884c\u9884\u5904\u7406\uff0c\u4f46\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u8f83\u9ad8\u3002
    • \u54c8\u5e0c\u67e5\u627e\u3001\u6811\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u5c5e\u4e8e\u9ad8\u6548\u641c\u7d22\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u6570\u636e\u7ed3\u6784\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6807\u5143\u7d20\u3002\u6b64\u7c7b\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u501f\u52a9\u989d\u5916\u6570\u636e\u7ed3\u6784\u3002
    • \u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u5bf9\u6570\u636e\u4f53\u91cf\u3001\u641c\u7d22\u6027\u80fd\u8981\u6c42\u3001\u6570\u636e\u67e5\u8be2\u548c\u66f4\u65b0\u9891\u7387\u7b49\u56e0\u7d20\u8fdb\u884c\u5177\u4f53\u5206\u6790\uff0c\u4ece\u800c\u9009\u62e9\u5408\u9002\u7684\u641c\u7d22\u65b9\u6cd5\u3002
    • \u7ebf\u6027\u641c\u7d22\u9002\u7528\u4e8e\u5c0f\u578b\u6216\u9891\u7e41\u66f4\u65b0\u7684\u6570\u636e\uff1b\u4e8c\u5206\u67e5\u627e\u9002\u7528\u4e8e\u5927\u578b\u3001\u6392\u5e8f\u7684\u6570\u636e\uff1b\u54c8\u5e0c\u67e5\u627e\u9002\u7528\u4e8e\u5bf9\u67e5\u8be2\u6548\u7387\u8981\u6c42\u8f83\u9ad8\u4e14\u65e0\u987b\u8303\u56f4\u67e5\u8be2\u7684\u6570\u636e\uff1b\u6811\u67e5\u627e\u9002\u7528\u4e8e\u9700\u8981\u7ef4\u62a4\u987a\u5e8f\u548c\u652f\u6301\u8303\u56f4\u67e5\u8be2\u7684\u5927\u578b\u52a8\u6001\u6570\u636e\u3002
    • \u7528\u54c8\u5e0c\u67e5\u627e\u66ff\u6362\u7ebf\u6027\u67e5\u627e\u662f\u4e00\u79cd\u5e38\u7528\u7684\u4f18\u5316\u8fd0\u884c\u65f6\u95f4\u7684\u7b56\u7565\uff0c\u53ef\u5c06\u65f6\u95f4\u590d\u6742\u5ea6\u4ece \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
    "},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

    Abstract

    \u6392\u5e8f\u72b9\u5982\u4e00\u628a\u5c06\u6df7\u4e71\u53d8\u4e3a\u79e9\u5e8f\u7684\u9b54\u6cd5\u94a5\u5319\uff0c\u4f7f\u6211\u4eec\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u4e0e\u5904\u7406\u6570\u636e\u3002

    \u65e0\u8bba\u662f\u7b80\u5355\u7684\u5347\u5e8f\uff0c\u8fd8\u662f\u590d\u6742\u7684\u5206\u7c7b\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u4eec\u5c55\u793a\u4e86\u6570\u636e\u7684\u548c\u8c10\u7f8e\u611f\u3002

    "},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5
    • 11.2 \u00a0 \u9009\u62e9\u6392\u5e8f
    • 11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f
    • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
    • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
    • 11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f
    • 11.7 \u00a0 \u5806\u6392\u5e8f
    • 11.8 \u00a0 \u6876\u6392\u5e8f
    • 11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f
    • 11.10 \u00a0 \u57fa\u6570\u6392\u5e8f
    • 11.11 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u5192\u6ce1\u6392\u5e8f","text":"

    \u5192\u6ce1\u6392\u5e8f\uff08bubble sort\uff09\u901a\u8fc7\u8fde\u7eed\u5730\u6bd4\u8f83\u4e0e\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u5b9e\u73b0\u6392\u5e8f\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u5c31\u50cf\u6c14\u6ce1\u4ece\u5e95\u90e8\u5347\u5230\u9876\u90e8\u4e00\u6837\uff0c\u56e0\u6b64\u5f97\u540d\u5192\u6ce1\u6392\u5e8f\u3002

    \u5982\u56fe 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u8fc7\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6765\u6a21\u62df\uff1a\u4ece\u6570\u7ec4\u6700\u5de6\u7aef\u5f00\u59cb\u5411\u53f3\u904d\u5386\uff0c\u4f9d\u6b21\u6bd4\u8f83\u76f8\u90bb\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u6362\u4e8c\u8005\u3002\u904d\u5386\u5b8c\u6210\u540e\uff0c\u6700\u5927\u7684\u5143\u7d20\u4f1a\u88ab\u79fb\u52a8\u5230\u6570\u7ec4\u7684\u6700\u53f3\u7aef\u3002

    <1><2><3><4><5><6><7>

    \u56fe 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u6362\u64cd\u4f5c\u6a21\u62df\u5192\u6ce1

    "},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6b65\u9aa4\u5982\u56fe 11-5 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5bf9 \\(n\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    2. \u63a5\u4e0b\u6765\uff0c\u5bf9\u5269\u4f59 \\(n - 1\\) \u4e2a\u5143\u7d20\u6267\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c06\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    3. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u201c\u5192\u6ce1\u201d\u540e\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u6362\u81f3\u6b63\u786e\u4f4d\u7f6e\u3002
    4. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002

    \u56fe 11-5 \u00a0 \u5192\u6ce1\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
    bubble_sort.cpp
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.java
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.cs
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.go
    /* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u5192\u6ce1\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
    bubble_sort.js
    /* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.ts
    /* \u5192\u6ce1\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.dart
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n      }\n    }\n  }\n}\n
    bubble_sort.rs
    /* \u5192\u6ce1\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swap(j, j + 1);\n            }\n        }\n    }\n}\n
    bubble_sort.c
    /* \u5192\u6ce1\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n            }\n        }\n    }\n}\n
    bubble_sort.kt
    /* \u5192\u6ce1\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n            }\n        }\n    }\n}\n
    bubble_sort.rb
    ### \u5192\u6ce1\u6392\u5e8f ###\ndef bubble_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (n - 1).downto(1)\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n      end\n    end\n  end\nend\n
    bubble_sort.zig
    // \u5192\u6ce1\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u4f18\u5316","text":"

    \u6211\u4eec\u53d1\u73b0\uff0c\u5982\u679c\u67d0\u8f6e\u201c\u5192\u6ce1\u201d\u4e2d\u6ca1\u6709\u6267\u884c\u4efb\u4f55\u4ea4\u6362\u64cd\u4f5c\uff0c\u8bf4\u660e\u6570\u7ec4\u5df2\u7ecf\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7ed3\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d flag \u6765\u76d1\u6d4b\u8fd9\u79cd\u60c5\u51b5\uff0c\u4e00\u65e6\u51fa\u73b0\u5c31\u7acb\u5373\u8fd4\u56de\u3002

    \u7ecf\u8fc7\u4f18\u5316\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u548c\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4ecd\u4e3a \\(O(n^2)\\) \uff1b\u4f46\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u53ef\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
    bubble_sort.cpp
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                // \u8fd9\u91cc\u4f7f\u7528\u4e86 std::swap() \u51fd\u6570\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.java
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.cs
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.go
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.js
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.ts
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.dart
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n    // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
    bubble_sort.rs
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                nums.swap(j, j + 1);\n                flag = true; // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
    bubble_sort.c
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n                flag = true;\n            }\n        }\n        if (!flag)\n            break;\n    }\n}\n
    bubble_sort.kt
    /* \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.rb
    ### \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09###\ndef bubble_sort_with_flag(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n  for i in (n - 1).downto(1)\n    flag = false # \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n\n    # \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n        flag = true # \u8bb0\u5f55\u4ea4\u6362\u5143\u7d20\n      end\n    end\n\n    break unless flag # \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  end\nend\n
    bubble_sort.zig
    // \u5192\u6ce1\u6392\u5e8f\uff08\u6807\u5fd7\u4f18\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6807\u5fd7\u4f4d\n        var j: usize = 0;\n        // \u5185\u5faa\u73af\uff1a\u5c06\u672a\u6392\u5e8f\u533a\u95f4 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u6362\u81f3\u8be5\u533a\u95f4\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u6362 nums[j] \u4e0e nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true;\n            }\n        }\n        if (!flag) break;   // \u6b64\u8f6e\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u6362\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5404\u8f6e\u201c\u5192\u6ce1\u201d\u904d\u5386\u7684\u6570\u7ec4\u957f\u5ea6\u4f9d\u6b21\u4e3a \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u603b\u548c\u4e3a \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u4f18\u5316\u540e\uff0c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe\u5230 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u6362\u3002
    "},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

    \u524d\u8ff0\u51e0\u79cd\u6392\u5e8f\u7b97\u6cd5\u90fd\u5c5e\u4e8e\u201c\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u901a\u8fc7\u6bd4\u8f83\u5143\u7d20\u95f4\u7684\u5927\u5c0f\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u6b64\u7c7b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u65e0\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u63a2\u8ba8\u51e0\u79cd\u201c\u975e\u6bd4\u8f83\u6392\u5e8f\u7b97\u6cd5\u201d\uff0c\u5b83\u4eec\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u8fbe\u5230\u7ebf\u6027\u9636\u3002

    \u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u4e2a\u5178\u578b\u5e94\u7528\u3002\u5b83\u901a\u8fc7\u8bbe\u7f6e\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u987a\u5e8f\u7684\u6876\uff0c\u6bcf\u4e2a\u6876\u5bf9\u5e94\u4e00\u4e2a\u6570\u636e\u8303\u56f4\uff0c\u5c06\u6570\u636e\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff1b\u7136\u540e\uff0c\u5728\u6bcf\u4e2a\u6876\u5185\u90e8\u5206\u522b\u6267\u884c\u6392\u5e8f\uff1b\u6700\u7ec8\u6309\u7167\u6876\u7684\u987a\u5e8f\u5c06\u6240\u6709\u6570\u636e\u5408\u5e76\u3002

    "},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8003\u8651\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\uff0c\u5176\u5143\u7d20\u662f\u8303\u56f4 \\([0, 1)\\) \u5185\u7684\u6d6e\u70b9\u6570\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-13 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316 \\(k\\) \u4e2a\u6876\uff0c\u5c06 \\(n\\) \u4e2a\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u4e2a\u6876\u4e2d\u3002
    2. \u5bf9\u6bcf\u4e2a\u6876\u5206\u522b\u6267\u884c\u6392\u5e8f\uff08\u8fd9\u91cc\u91c7\u7528\u7f16\u7a0b\u8bed\u8a00\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff09\u3002
    3. \u6309\u7167\u6876\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u5408\u5e76\u7ed3\u679c\u3002

    \u56fe 11-13 \u00a0 \u6876\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bucket_sort.py
    def bucket_sort(nums: list[float]):\n    \"\"\"\u6876\u6392\u5e8f\"\"\"\n    # \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums:\n        # \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i = int(num * k)\n        # \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    # 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i = 0\n    for bucket in buckets:\n        for num in bucket:\n            nums[i] = num\n            i += 1\n
    bucket_sort.cpp
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(vector<float> &nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = num * k;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (vector<float> &bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.java
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.length / 2;\n    List<List<Float>> buckets = new ArrayList<>();\n    for (int i = 0; i < k; i++) {\n        buckets.add(new ArrayList<>());\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int) (num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int i = 0;\n    for (List<Float> bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.cs
    /* \u6876\u6392\u5e8f */\nvoid BucketSort(float[] nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    int k = nums.Length / 2;\n    List<List<float>> buckets = [];\n    for (int i = 0; i < k; i++) {\n        buckets.Add([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        int i = (int)(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    int j = 0;\n    foreach (List<float> bucket in buckets) {\n        foreach (float num in bucket) {\n            nums[j++] = num;\n        }\n    }\n}\n
    bucket_sort.go
    /* \u6876\u6392\u5e8f */\nfunc bucketSort(nums []float64) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    k := len(nums) / 2\n    buckets := make([][]float64, k)\n    for i := 0; i < k; i++ {\n        buckets[i] = make([]float64, 0)\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        i := int(num * float64(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5185\u7f6e\u5207\u7247\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    i := 0\n    for _, bucket := range buckets {\n        for _, num := range bucket {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
    bucket_sort.swift
    /* \u6876\u6392\u5e8f */\nfunc bucketSort(nums: inout [Double]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for num in nums {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = nums.startIndex\n    for bucket in buckets {\n        for num in bucket {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
    bucket_sort.js
    /* \u6876\u6392\u5e8f */\nfunction bucketSort(nums) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.ts
    /* \u6876\u6392\u5e8f */\nfunction bucketSort(nums: number[]): void {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    const k = nums.length / 2;\n    const buckets: number[][] = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.dart
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(List<double> nums) {\n  // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 _num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c06 _num \u6dfb\u52a0\u8fdb\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n  int i = 0;\n  for (List<double> bucket in buckets) {\n    for (double _num in bucket) {\n      nums[i++] = _num;\n    }\n  }\n}\n
    bucket_sort.rs
    /* \u6876\u6392\u5e8f */\nfn bucket_sort(nums: &mut [f64]) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for &num in nums.iter() {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    let mut i = 0;\n    for bucket in buckets.iter() {\n        for &num in bucket.iter() {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    bucket_sort.c
    /* \u6876\u6392\u5e8f */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8bb0\u5f55\u6bcf\u4e2a\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52a8\u6001\u6570\u7ec4\u7684\u6570\u7ec4\uff08\u6876\uff09\n    // \u4e3a\u6bcf\u4e2a\u6876\u9884\u5206\u914d\u8db3\u591f\u7684\u7a7a\u95f4\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (int i = 0; i < n; ++i) {\n        int idx = (int)(nums[i] * k);\n        buckets[idx][sizes[idx]++] = nums[i];\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u5e76\u6392\u5e8f\u540e\u7684\u6876\n    int idx = 0;\n    for (int i = 0; i < k; ++i) {\n        for (int j = 0; j < sizes[i]; ++j) {\n            nums[idx++] = buckets[i][j];\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(buckets[i]);\n    }\n}\n
    bucket_sort.kt
    /* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n    val k = nums.size / 2\n    val buckets = mutableListOf<MutableList<Float>>()\n    for (i in 0..<k) {\n        buckets.add(mutableListOf())\n    }\n    // 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n    for (num in nums) {\n        // \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n    var i = 0\n    for (bucket in buckets) {\n        for (num in bucket) {\n            nums[i++] = num\n        }\n    }\n}\n
    bucket_sort.rb
    ### \u6876\u6392\u5e8f ###\ndef bucket_sort(nums)\n  # \u521d\u59cb\u5316 k = n/2 \u4e2a\u6876\uff0c\u9884\u671f\u5411\u6bcf\u4e2a\u6876\u5206\u914d 2 \u4e2a\u5143\u7d20\n  k = nums.length / 2\n  buckets = Array.new(k) { [] }\n\n  # 1. \u5c06\u6570\u7ec4\u5143\u7d20\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\n  nums.each do |num|\n    # \u8f93\u5165\u6570\u636e\u8303\u56f4\u4e3a [0, 1)\uff0c\u4f7f\u7528 num * k \u6620\u5c04\u5230\u7d22\u5f15\u8303\u56f4 [0, k-1]\n    i = (num * k).to_i\n    # \u5c06 num \u6dfb\u52a0\u8fdb\u6876 i\n    buckets[i] << num\n  end\n\n  # 2. \u5bf9\u5404\u4e2a\u6876\u6267\u884c\u6392\u5e8f\n  buckets.each do |bucket|\n    # \u4f7f\u7528\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u66ff\u6362\u6210\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\n    bucket.sort!\n  end\n\n  # 3. \u904d\u5386\u6876\u5408\u5e76\u7ed3\u679c\n  i = 0\n  buckets.each do |bucket|\n    bucket.each do |num|\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    bucket_sort.zig
    [class]{}-[func]{bucketSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

    \u6876\u6392\u5e8f\u9002\u7528\u4e8e\u5904\u7406\u4f53\u91cf\u5f88\u5927\u7684\u6570\u636e\u3002\u4f8b\u5982\uff0c\u8f93\u5165\u6570\u636e\u5305\u542b 100 \u4e07\u4e2a\u5143\u7d20\uff0c\u7531\u4e8e\u7a7a\u95f4\u9650\u5236\uff0c\u7cfb\u7edf\u5185\u5b58\u65e0\u6cd5\u4e00\u6b21\u6027\u52a0\u8f7d\u6240\u6709\u6570\u636e\u3002\u6b64\u65f6\uff0c\u53ef\u4ee5\u5c06\u6570\u636e\u5206\u6210 1000 \u4e2a\u6876\uff0c\u7136\u540e\u5206\u522b\u5bf9\u6bcf\u4e2a\u6876\u8fdb\u884c\u6392\u5e8f\uff0c\u6700\u540e\u5c06\u7ed3\u679c\u5408\u5e76\u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\) \uff1a\u5047\u8bbe\u5143\u7d20\u5728\u5404\u4e2a\u6876\u5185\u5e73\u5747\u5206\u5e03\uff0c\u90a3\u4e48\u6bcf\u4e2a\u6876\u5185\u7684\u5143\u7d20\u6570\u91cf\u4e3a \\(\\frac{n}{k}\\) \u3002\u5047\u8bbe\u6392\u5e8f\u5355\u4e2a\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u65f6\u95f4\uff0c\u5219\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u65f6\u95f4\u3002\u5f53\u6876\u6570\u91cf \\(k\\) \u6bd4\u8f83\u5927\u65f6\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5219\u8d8b\u5411\u4e8e \\(O(n)\\) \u3002\u5408\u5e76\u7ed3\u679c\u65f6\u9700\u8981\u904d\u5386\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8d39 \\(O(n + k)\\) \u65f6\u95f4\u3002
    • \u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u6570\u636e\u88ab\u5206\u914d\u5230\u4e00\u4e2a\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8be5\u6876\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u501f\u52a9 \\(k\\) \u4e2a\u6876\u548c\u603b\u5171 \\(n\\) \u4e2a\u5143\u7d20\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u6876\u6392\u5e8f\u662f\u5426\u7a33\u5b9a\u53d6\u51b3\u4e8e\u6392\u5e8f\u6876\u5185\u5143\u7d20\u7684\u7b97\u6cd5\u662f\u5426\u7a33\u5b9a\u3002
    "},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5b9e\u73b0\u5e73\u5747\u5206\u914d","text":"

    \u6876\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u7406\u8bba\u4e0a\u53ef\u4ee5\u8fbe\u5230 \\(O(n)\\) \uff0c\u5173\u952e\u5728\u4e8e\u5c06\u5143\u7d20\u5747\u5300\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\uff0c\u56e0\u4e3a\u5b9e\u9645\u6570\u636e\u5f80\u5f80\u4e0d\u662f\u5747\u5300\u5206\u5e03\u7684\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u60f3\u8981\u5c06\u6dd8\u5b9d\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u4ef7\u683c\u8303\u56f4\u5e73\u5747\u5206\u914d\u5230 10 \u4e2a\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u4ef7\u683c\u5206\u5e03\u4e0d\u5747\uff0c\u4f4e\u4e8e 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u4e8e 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c06\u4ef7\u683c\u533a\u95f4\u5e73\u5747\u5212\u5206\u4e3a 10 \u4e2a\uff0c\u5404\u4e2a\u6876\u4e2d\u7684\u5546\u54c1\u6570\u91cf\u5dee\u8ddd\u4f1a\u975e\u5e38\u5927\u3002

    \u4e3a\u5b9e\u73b0\u5e73\u5747\u5206\u914d\uff0c\u6211\u4eec\u53ef\u4ee5\u5148\u8bbe\u5b9a\u4e00\u6761\u5927\u81f4\u7684\u5206\u754c\u7ebf\uff0c\u5c06\u6570\u636e\u7c97\u7565\u5730\u5206\u5230 3 \u4e2a\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u6bd5\u540e\uff0c\u518d\u5c06\u5546\u54c1\u8f83\u591a\u7684\u6876\u7ee7\u7eed\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6570\u91cf\u5927\u81f4\u76f8\u7b49\u3002

    \u5982\u56fe 11-14 \u6240\u793a\uff0c\u8fd9\u79cd\u65b9\u6cd5\u672c\u8d28\u4e0a\u662f\u521b\u5efa\u4e00\u68f5\u9012\u5f52\u6811\uff0c\u76ee\u6807\u662f\u8ba9\u53f6\u8282\u70b9\u7684\u503c\u5c3d\u53ef\u80fd\u5e73\u5747\u3002\u5f53\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f6e\u5c06\u6570\u636e\u5212\u5206\u4e3a 3 \u4e2a\u6876\uff0c\u5177\u4f53\u5212\u5206\u65b9\u5f0f\u53ef\u6839\u636e\u6570\u636e\u7279\u70b9\u7075\u6d3b\u9009\u62e9\u3002

    \u56fe 11-14 \u00a0 \u9012\u5f52\u5212\u5206\u6876

    \u5982\u679c\u6211\u4eec\u63d0\u524d\u77e5\u9053\u5546\u54c1\u4ef7\u683c\u7684\u6982\u7387\u5206\u5e03\uff0c\u5219\u53ef\u4ee5\u6839\u636e\u6570\u636e\u6982\u7387\u5206\u5e03\u8bbe\u7f6e\u6bcf\u4e2a\u6876\u7684\u4ef7\u683c\u5206\u754c\u7ebf\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6570\u636e\u5206\u5e03\u5e76\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7edf\u8ba1\uff0c\u4e5f\u53ef\u4ee5\u6839\u636e\u6570\u636e\u7279\u70b9\u91c7\u7528\u67d0\u79cd\u6982\u7387\u6a21\u578b\u8fdb\u884c\u8fd1\u4f3c\u3002

    \u5982\u56fe 11-15 \u6240\u793a\uff0c\u6211\u4eec\u5047\u8bbe\u5546\u54c1\u4ef7\u683c\u670d\u4ece\u6b63\u6001\u5206\u5e03\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8bbe\u5b9a\u4ef7\u683c\u533a\u95f4\uff0c\u4ece\u800c\u5c06\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u4e2a\u6876\u4e2d\u3002

    \u56fe 11-15 \u00a0 \u6839\u636e\u6982\u7387\u5206\u5e03\u5212\u5206\u6876

    "},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8ba1\u6570\u6392\u5e8f","text":"

    \u8ba1\u6570\u6392\u5e8f\uff08counting sort\uff09\u901a\u8fc7\u7edf\u8ba1\u5143\u7d20\u6570\u91cf\u6765\u5b9e\u73b0\u6392\u5e8f\uff0c\u901a\u5e38\u5e94\u7528\u4e8e\u6574\u6570\u6570\u7ec4\u3002

    "},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7b80\u5355\u5b9e\u73b0","text":"

    \u5148\u6765\u770b\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u3002\u7ed9\u5b9a\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8d1f\u6574\u6570\u201d\uff0c\u8ba1\u6570\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-16 \u6240\u793a\u3002

    1. \u904d\u5386\u6570\u7ec4\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6570\u5b57\uff0c\u8bb0\u4e3a \\(m\\) \uff0c\u7136\u540e\u521b\u5efa\u4e00\u4e2a\u957f\u5ea6\u4e3a \\(m + 1\\) \u7684\u8f85\u52a9\u6570\u7ec4 counter \u3002
    2. \u501f\u52a9 counter \u7edf\u8ba1 nums \u4e2d\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\uff0c\u5176\u4e2d counter[num] \u5bf9\u5e94\u6570\u5b57 num \u7684\u51fa\u73b0\u6b21\u6570\u3002\u7edf\u8ba1\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u904d\u5386 nums\uff08\u8bbe\u5f53\u524d\u6570\u5b57\u4e3a num\uff09\uff0c\u6bcf\u8f6e\u5c06 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
    3. \u7531\u4e8e counter \u7684\u5404\u4e2a\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u5f53\u4e8e\u6240\u6709\u6570\u5b57\u5df2\u7ecf\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u904d\u5386 counter \uff0c\u6839\u636e\u5404\u6570\u5b57\u51fa\u73b0\u6b21\u6570\u4ece\u5c0f\u5230\u5927\u7684\u987a\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

    \u56fe 11-16 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b

    \u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    i = 0\n    for num in range(m + 1):\n        for _ in range(counter[num]):\n            nums[i] = num\n            i += 1\n
    counting_sort.cpp
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.java
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.cs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.go
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    for i, num := 0, 0; num < m+1; num++ {\n        for j := 0; j < counter[num]; j++ {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
    counting_sort.swift
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for num in 0 ..< m + 1 {\n        for _ in 0 ..< counter[num] {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
    counting_sort.js
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.ts
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.dart
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n  int i = 0;\n  for (int _num = 0; _num < m + 1; _num++) {\n    for (int j = 0; j < counter[_num]; j++, i++) {\n      nums[i] = _num;\n    }\n  }\n}\n
    counting_sort.rs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.iter().max().unwrap();\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m as usize + 1];\n    for &num in nums.iter() {\n        counter[num as usize] += 1;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    let mut i = 0;\n    for num in 0..m + 1 {\n        for _ in 0..counter[num as usize] {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    counting_sort.c
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n    // 4. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n    var i = 0\n    for (num in 0..<m + 1) {\n        var j = 0\n        while (j < counter[num]) {\n            nums[i] = num\n            j++\n            i++\n        }\n    }\n}\n
    counting_sort.rb
    ### \u8ba1\u6570\u6392\u5e8f ###\ndef counting_sort_naive(nums)\n  # \u7b80\u5355\u5b9e\u73b0\uff0c\u65e0\u6cd5\u7528\u4e8e\u6392\u5e8f\u5bf9\u8c61\n  # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  m = 0\n  nums.each { |num| m = [m, num].max }\n  # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n  counter = Array.new(m + 1, 0)\n  nums.each { |num| counter[num] += 1 }\n  # 3. \u904d\u5386 counter \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u539f\u6570\u7ec4 nums\n  i = 0\n  for num in 0...(m + 1)\n    (0...counter[num]).each do\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    counting_sort.zig
    [class]{}-[func]{countingSortNaive}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u8ba1\u6570\u6392\u5e8f\u4e0e\u6876\u6392\u5e8f\u7684\u8054\u7cfb

    \u4ece\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8ba1\u6570\u6392\u5e8f\u4e2d\u7684\u8ba1\u6570\u6570\u7ec4 counter \u7684\u6bcf\u4e2a\u7d22\u5f15\u89c6\u4e3a\u4e00\u4e2a\u6876\uff0c\u5c06\u7edf\u8ba1\u6570\u91cf\u7684\u8fc7\u7a0b\u770b\u4f5c\u5c06\u5404\u4e2a\u5143\u7d20\u5206\u914d\u5230\u5bf9\u5e94\u7684\u6876\u4e2d\u3002\u672c\u8d28\u4e0a\uff0c\u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u6570\u636e\u4e0b\u7684\u4e00\u4e2a\u7279\u4f8b\u3002

    "},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5b9e\u73b0","text":"

    \u7ec6\u5fc3\u7684\u8bfb\u8005\u53ef\u80fd\u53d1\u73b0\u4e86\uff0c\u5982\u679c\u8f93\u5165\u6570\u636e\u662f\u5bf9\u8c61\uff0c\u4e0a\u8ff0\u6b65\u9aa4 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8bbe\u8f93\u5165\u6570\u636e\u662f\u5546\u54c1\u5bf9\u8c61\uff0c\u6211\u4eec\u60f3\u6309\u7167\u5546\u54c1\u4ef7\u683c\uff08\u7c7b\u7684\u6210\u5458\u53d8\u91cf\uff09\u5bf9\u5546\u54c1\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u7b97\u6cd5\u53ea\u80fd\u7ed9\u51fa\u4ef7\u683c\u7684\u6392\u5e8f\u7ed3\u679c\u3002

    \u90a3\u4e48\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u6570\u636e\u7684\u6392\u5e8f\u7ed3\u679c\u5462\uff1f\u6211\u4eec\u9996\u5148\u8ba1\u7b97 counter \u7684\u201c\u524d\u7f00\u548c\u201d\u3002\u987e\u540d\u601d\u4e49\uff0c\u7d22\u5f15 i \u5904\u7684\u524d\u7f00\u548c prefix[i] \u7b49\u4e8e\u6570\u7ec4\u524d i \u4e2a\u5143\u7d20\u4e4b\u548c\uff1a

    \\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

    \u524d\u7f00\u548c\u5177\u6709\u660e\u786e\u7684\u610f\u4e49\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7ed3\u679c\u6570\u7ec4 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\u3002\u8fd9\u4e2a\u4fe1\u606f\u975e\u5e38\u5173\u952e\uff0c\u56e0\u4e3a\u5b83\u544a\u8bc9\u6211\u4eec\u5404\u4e2a\u5143\u7d20\u5e94\u8be5\u51fa\u73b0\u5728\u7ed3\u679c\u6570\u7ec4\u7684\u54ea\u4e2a\u4f4d\u7f6e\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5012\u5e8f\u904d\u5386\u539f\u6570\u7ec4 nums \u7684\u6bcf\u4e2a\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f6e\u8fed\u4ee3\u4e2d\u6267\u884c\u4ee5\u4e0b\u4e24\u6b65\u3002

    1. \u5c06 num \u586b\u5165\u6570\u7ec4 res \u7684\u7d22\u5f15 prefix[num] - 1 \u5904\u3002
    2. \u4ee4\u524d\u7f00\u548c prefix[num] \u51cf\u5c0f \\(1\\) \uff0c\u4ece\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

    \u904d\u5386\u5b8c\u6210\u540e\uff0c\u6570\u7ec4 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7ed3\u679c\uff0c\u6700\u540e\u4f7f\u7528 res \u8986\u76d6\u539f\u6570\u7ec4 nums \u5373\u53ef\u3002\u56fe 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8ba1\u6570\u6392\u5e8f\u6d41\u7a0b\u3002

    <1><2><3><4><5><6><7><8>

    \u56fe 11-17 \u00a0 \u8ba1\u6570\u6392\u5e8f\u6b65\u9aa4

    \u8ba1\u6570\u6392\u5e8f\u7684\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort(nums: list[int]):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\n    # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    # \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n = len(nums)\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        num = nums[i]\n        res[counter[num] - 1] = num  # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1  # \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n
    counting_sort.cpp
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.size();\n    vector<int> res(n);\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums = res;\n}\n
    counting_sort.java
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.cs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int n = nums.Length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.go
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    copy(nums, res)\n}\n
    counting_sort.swift
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num] -= 1 // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.js
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res = new Array(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.ts
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    const n = nums.length;\n    const res: number[] = new Array<number>(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.dart
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73b0\u6b21\u6570\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n  // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n  int n = nums.length;\n  List<int> res = List.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int _num = nums[i];\n    res[counter[_num] - 1] = _num; // \u5c06 _num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n    counter[_num]--; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n  nums.setAll(0, res);\n}\n
    counting_sort.rs
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    let m = *nums.iter().max().unwrap() as usize;\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    let mut counter = vec![0; m + 1];\n    for &num in nums.iter() {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for i in 0..m {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    let n = nums.len();\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let num = nums[i];\n        res[counter[num as usize] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums.copy_from_slice(&res)\n}\n
    counting_sort.c
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    int *counter = calloc(m, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    int *res = malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]--;              // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91ca\u653e\u5185\u5b58\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8ba1\u6570\u6392\u5e8f */\n// \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u904d\u5386 nums \uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n    // \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n    val n = nums.size\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val num = nums[i]\n        res[counter[num] - 1] = num // \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n        counter[num]-- // \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.rb
    ### \u8ba1\u6570\u6392\u5e8f ###\ndef counting_sort(nums)\n  # \u5b8c\u6574\u5b9e\u73b0\uff0c\u53ef\u6392\u5e8f\u5bf9\u8c61\uff0c\u5e76\u4e14\u662f\u7a33\u5b9a\u6392\u5e8f\n  # 1. \u7edf\u8ba1\u6570\u7ec4\u6700\u5927\u5143\u7d20 m\n  m = nums.max\n  # 2. \u7edf\u8ba1\u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73b0\u6b21\u6570\n  counter = Array.new(m + 1, 0)\n  nums.each { |num| counter[num] += 1 }\n  # 3. \u6c42 counter \u7684\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u6b21\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u5c3e\u7d22\u5f15\u201d\n  # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u540e\u4e00\u6b21\u51fa\u73b0\u7684\u7d22\u5f15\n  (0...m).each { |i| counter[i + 1] += counter[i] }\n  # 4. \u5012\u5e8f\u904d\u5386 nums, \u5c06\u5404\u5143\u7d20\u586b\u5165\u7ed3\u679c\u6570\u7ec4 res\n  # \u521d\u59cb\u5316\u6570\u7ec4 res \u7528\u4e8e\u8bb0\u5f55\u7ed3\u679c\n  n = nums.length\n  res = Array.new(n, 0)\n  (n - 1).downto(0).each do |i|\n    num = nums[i]\n    res[counter[num] - 1] = num # \u5c06 num \u653e\u7f6e\u5230\u5bf9\u5e94\u7d22\u5f15\u5904\n    counter[num] -= 1 # \u4ee4\u524d\u7f00\u548c\u81ea\u51cf 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n  end\n  # \u4f7f\u7528\u7ed3\u679c\u6570\u7ec4 res \u8986\u76d6\u539f\u6570\u7ec4 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\n
    counting_sort.zig
    [class]{}-[func]{countingSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f \uff1a\u6d89\u53ca\u904d\u5386 nums \u548c\u904d\u5386 counter \uff0c\u90fd\u4f7f\u7528\u7ebf\u6027\u65f6\u95f4\u3002\u4e00\u822c\u60c5\u51b5\u4e0b \\(n \\gg m\\) \uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u4e8e \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u501f\u52a9\u4e86\u957f\u5ea6\u5206\u522b\u4e3a \\(n\\) \u548c \\(m\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u7531\u4e8e\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u987a\u5e8f\u662f\u201c\u4ece\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u904d\u5386 nums \u53ef\u4ee5\u907f\u514d\u6539\u53d8\u76f8\u7b49\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b9e\u73b0\u7a33\u5b9a\u6392\u5e8f\u3002\u5b9e\u9645\u4e0a\uff0c\u6b63\u5e8f\u904d\u5386 nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\uff0c\u4f46\u7ed3\u679c\u662f\u975e\u7a33\u5b9a\u7684\u3002
    "},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u5c40\u9650\u6027","text":"

    \u770b\u5230\u8fd9\u91cc\uff0c\u4f60\u4e5f\u8bb8\u4f1a\u89c9\u5f97\u8ba1\u6570\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u4ec5\u901a\u8fc7\u7edf\u8ba1\u6570\u91cf\u5c31\u53ef\u4ee5\u5b9e\u73b0\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u7684\u524d\u7f6e\u6761\u4ef6\u76f8\u5bf9\u8f83\u4e3a\u4e25\u683c\u3002

    \u8ba1\u6570\u6392\u5e8f\u53ea\u9002\u7528\u4e8e\u975e\u8d1f\u6574\u6570\u3002\u82e5\u60f3\u5c06\u5176\u7528\u4e8e\u5176\u4ed6\u7c7b\u578b\u7684\u6570\u636e\uff0c\u9700\u8981\u786e\u4fdd\u8fd9\u4e9b\u6570\u636e\u53ef\u4ee5\u8f6c\u6362\u4e3a\u975e\u8d1f\u6574\u6570\uff0c\u5e76\u4e14\u5728\u8f6c\u6362\u8fc7\u7a0b\u4e2d\u4e0d\u80fd\u6539\u53d8\u5404\u4e2a\u5143\u7d20\u4e4b\u95f4\u7684\u76f8\u5bf9\u5927\u5c0f\u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u5bf9\u4e8e\u5305\u542b\u8d1f\u6570\u7684\u6574\u6570\u6570\u7ec4\uff0c\u53ef\u4ee5\u5148\u7ed9\u6240\u6709\u6570\u5b57\u52a0\u4e0a\u4e00\u4e2a\u5e38\u6570\uff0c\u5c06\u5168\u90e8\u6570\u5b57\u8f6c\u5316\u4e3a\u6b63\u6570\uff0c\u6392\u5e8f\u5b8c\u6210\u540e\u518d\u8f6c\u6362\u56de\u53bb\u3002

    \u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5219\u4f1a\u5360\u7528\u8fc7\u591a\u7a7a\u95f4\u3002\u800c\u5f53 \\(n \\ll m\\) \u65f6\uff0c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u65f6\u95f4\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u7b97\u6cd5\u8fd8\u8981\u6162\u3002

    "},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u6392\u5e8f","text":"

    Tip

    \u9605\u8bfb\u672c\u8282\u524d\uff0c\u8bf7\u786e\u4fdd\u5df2\u5b66\u5b8c\u201c\u5806\u201c\u7ae0\u8282\u3002

    \u5806\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5806\u6570\u636e\u7ed3\u6784\u5b9e\u73b0\u7684\u9ad8\u6548\u6392\u5e8f\u7b97\u6cd5\u3002\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u5df2\u7ecf\u5b66\u8fc7\u7684\u201c\u5efa\u5806\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u201d\u5b9e\u73b0\u5806\u6392\u5e8f\u3002

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5c0f\u9876\u5806\uff0c\u6b64\u65f6\u6700\u5c0f\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u4e0d\u65ad\u6267\u884c\u51fa\u5806\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8bb0\u5f55\u51fa\u5806\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

    \u4ee5\u4e0a\u65b9\u6cd5\u867d\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u989d\u5916\u6570\u7ec4\u6765\u4fdd\u5b58\u5f39\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f83\u6d6a\u8d39\u7a7a\u95f4\u3002\u5728\u5b9e\u9645\u4e2d\uff0c\u6211\u4eec\u901a\u5e38\u4f7f\u7528\u4e00\u79cd\u66f4\u52a0\u4f18\u96c5\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002

    "},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u5806\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-12 \u6240\u793a\u3002

    1. \u8f93\u5165\u6570\u7ec4\u5e76\u5efa\u7acb\u5927\u9876\u5806\u3002\u5b8c\u6210\u540e\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u4e8e\u5806\u9876\u3002
    2. \u5c06\u5806\u9876\u5143\u7d20\uff08\u7b2c\u4e00\u4e2a\u5143\u7d20\uff09\u4e0e\u5806\u5e95\u5143\u7d20\uff08\u6700\u540e\u4e00\u4e2a\u5143\u7d20\uff09\u4ea4\u6362\u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u5806\u7684\u957f\u5ea6\u51cf \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6570\u91cf\u52a0 \\(1\\) \u3002
    3. \u4ece\u5806\u9876\u5143\u7d20\u5f00\u59cb\uff0c\u4ece\u9876\u5230\u5e95\u6267\u884c\u5806\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u5316\u540e\uff0c\u5806\u7684\u6027\u8d28\u5f97\u5230\u4fee\u590d\u3002
    4. \u5faa\u73af\u6267\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u5faa\u73af \\(n - 1\\) \u8f6e\u540e\uff0c\u5373\u53ef\u5b8c\u6210\u6570\u7ec4\u6392\u5e8f\u3002

    Tip

    \u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u4e2a\u5f39\u51fa\u5143\u7d20\u7684\u6b65\u9aa4\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12>

    \u56fe 11-12 \u00a0 \u5806\u6392\u5e8f\u6b65\u9aa4

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u4e86\u4e0e\u201c\u5806\u201d\u7ae0\u8282\u76f8\u540c\u7684\u4ece\u9876\u81f3\u5e95\u5806\u5316 sift_down() \u51fd\u6570\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u4e8e\u5806\u7684\u957f\u5ea6\u4f1a\u968f\u7740\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u51cf\u5c0f\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u7ed9 sift_down() \u51fd\u6570\u6dfb\u52a0\u4e00\u4e2a\u957f\u5ea6\u53c2\u6570 \\(n\\) \uff0c\u7528\u4e8e\u6307\u5b9a\u5806\u7684\u5f53\u524d\u6709\u6548\u957f\u5ea6\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316\"\"\"\n    while True:\n        # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l = 2 * i + 1\n        r = 2 * i + 2\n        ma = i\n        if l < n and nums[l] > nums[ma]:\n            ma = l\n        if r < n and nums[r] > nums[ma]:\n            ma = r\n        # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u6362\u4e24\u8282\u70b9\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0)\n
    heap_sort.cpp
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        swap(nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.java
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.cs
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
    heap_sort.go
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        l := 2*i + 1\n        r := 2*i + 2\n        ma := i\n        if l < n && (*nums)[l] > (*nums)[ma] {\n            ma = l\n        }\n        if r < n && (*nums)[r] > (*nums)[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.swift
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1\n        let r = 2 * i + 2\n        var ma = i\n        if l < n, nums[l] > nums[ma] {\n            ma = l\n        }\n        if r < n, nums[r] > nums[ma] {\n            ma = r\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        nums.swapAt(i, ma)\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\n        siftDown(nums: &nums, n: nums.count, i: i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
    heap_sort.js
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.ts
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.dart
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    int l = 2 * i + 1;\n    int r = 2 * i + 2;\n    int ma = i;\n    if (l < n && nums[l] > nums[ma]) ma = l;\n    if (r < n && nums[r] > nums[ma]) ma = r;\n    // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u6362\u4e24\u8282\u70b9\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
    heap_sort.rs
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let mut ma = i;\n        if l < n && nums[l] > nums[ma] {\n            ma = l;\n        }\n        if r < n && nums[r] > nums[ma] {\n            ma = r;\n        }\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        nums.swap(i, ma);\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for i in (0..nums.len() / 2).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for i in (1..nums.len()).rev() {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        nums.swap(0, i);\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
    heap_sort.c
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.kt
    /* \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n        val l = 2 * i + 1\n        val r = 2 * i + 2\n        var ma = i\n        if (l < n && nums[l] > nums[ma]) \n            ma = l\n        if (r < n && nums[r] > nums[ma]) \n            ma = r\n        // \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u6362\u4e24\u8282\u70b9\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u5faa\u73af\u5411\u4e0b\u5806\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.rb
    ### \u5806\u7684\u957f\u5ea6\u4e3a n \uff0c\u4ece\u8282\u70b9 i \u5f00\u59cb\uff0c\u4ece\u9876\u81f3\u5e95\u5806\u5316 ###\ndef sift_down(nums, n, i)\n  while true\n    # \u5224\u65ad\u8282\u70b9 i, l, r \u4e2d\u503c\u6700\u5927\u7684\u8282\u70b9\uff0c\u8bb0\u4e3a ma\n    l = 2 * i + 1\n    r = 2 * i + 2\n    ma = i\n    ma = l if l < n && nums[l] > nums[ma]\n    ma = r if r < n && nums[r] > nums[ma]\n    # \u82e5\u8282\u70b9 i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5219\u65e0\u987b\u7ee7\u7eed\u5806\u5316\uff0c\u8df3\u51fa\n    break if ma == i\n    # \u4ea4\u6362\u4e24\u8282\u70b9\n    nums[i], nums[ma] = nums[ma], nums[i]\n    # \u5faa\u73af\u5411\u4e0b\u5806\u5316\n    i = ma\n  end\nend\n\n### \u5806\u6392\u5e8f ###\ndef heap_sort(nums)\n  # \u5efa\u5806\u64cd\u4f5c\uff1a\u5806\u5316\u9664\u53f6\u8282\u70b9\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u8282\u70b9\n  (nums.length / 2 - 1).downto(0) do |i|\n    sift_down(nums, nums.length, i)\n  end\n  # \u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u5faa\u73af n-1 \u8f6e\n  (nums.length - 1).downto(1) do |i|\n    # \u4ea4\u6362\u6839\u8282\u70b9\u4e0e\u6700\u53f3\u53f6\u8282\u70b9\uff08\u4ea4\u6362\u9996\u5143\u7d20\u4e0e\u5c3e\u5143\u7d20\uff09\n    nums[0], nums[i] = nums[i], nums[0]\n    # \u4ee5\u6839\u8282\u70b9\u4e3a\u8d77\u70b9\uff0c\u4ece\u9876\u81f3\u5e95\u8fdb\u884c\u5806\u5316\n    sift_down(nums, i, 0)\n  end\nend\n
    heap_sort.zig
    [class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5efa\u5806\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002\u4ece\u5806\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(\\log n)\\) \uff0c\u5171\u5faa\u73af \\(n - 1\\) \u8f6e\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u51e0\u4e2a\u6307\u9488\u53d8\u91cf\u4f7f\u7528 \\(O(1)\\) \u7a7a\u95f4\u3002\u5143\u7d20\u4ea4\u6362\u548c\u5806\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u6362\u5806\u9876\u5143\u7d20\u548c\u5806\u5e95\u5143\u7d20\u65f6\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5bf9\u4f4d\u7f6e\u53ef\u80fd\u53d1\u751f\u53d8\u5316\u3002
    "},{"location":"chapter_sorting/insertion_sort/","title":"11.4 \u00a0 \u63d2\u5165\u6392\u5e8f","text":"

    \u63d2\u5165\u6392\u5e8f\uff08insertion sort\uff09\u662f\u4e00\u79cd\u7b80\u5355\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u4e0e\u624b\u52a8\u6574\u7406\u4e00\u526f\u724c\u7684\u8fc7\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

    \u5177\u4f53\u6765\u8bf4\uff0c\u6211\u4eec\u5728\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u4e00\u4e2a\u57fa\u51c6\u5143\u7d20\uff0c\u5c06\u8be5\u5143\u7d20\u4e0e\u5176\u5de6\u4fa7\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f83\u5927\u5c0f\uff0c\u5e76\u5c06\u8be5\u5143\u7d20\u63d2\u5165\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002

    \u56fe 11-6 \u5c55\u793a\u4e86\u6570\u7ec4\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8bbe\u57fa\u51c6\u5143\u7d20\u4e3a base \uff0c\u6211\u4eec\u9700\u8981\u5c06\u4ece\u76ee\u6807\u7d22\u5f15\u5230 base \u4e4b\u95f4\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\uff0c\u7136\u540e\u5c06 base \u8d4b\u503c\u7ed9\u76ee\u6807\u7d22\u5f15\u3002

    \u56fe 11-6 \u00a0 \u5355\u6b21\u63d2\u5165\u64cd\u4f5c

    "},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-7 \u6240\u793a\u3002

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6570\u7ec4\u7684\u7b2c 1 \u4e2a\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
    2. \u9009\u53d6\u6570\u7ec4\u7684\u7b2c 2 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u7b2c 3 \u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6570\u7ec4\u7684\u524d 3 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\uff0c\u5728\u6700\u540e\u4e00\u8f6e\u4e2d\uff0c\u9009\u53d6\u6700\u540e\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a base \uff0c\u5c06\u5176\u63d2\u5165\u5230\u6b63\u786e\u4f4d\u7f6e\u540e\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

    \u56fe 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
    def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n
    insertion_sort.cpp
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.java
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.cs
    /* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.go
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.swift
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.js
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.ts
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.dart
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  }\n}\n
    insertion_sort.rs
    /* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.c
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
    insertion_sort.kt
    /* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u5faa\u73af: \u5df2\u6392\u5e8f\u5143\u7d20\u4e3a 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.rb
    ### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n  end\nend\n
    insertion_sort.zig
    // \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u5faa\u73af\uff1a\u5df2\u6392\u5e8f\u533a\u95f4\u4e3a [0, i-1]\n    var i: usize = 1;\n    while (i < nums.len) : (i += 1) {\n        var base = nums[i];\n        var j: usize = i;\n        // \u5185\u5faa\u73af\uff1a\u5c06 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4 [0, i-1] \u4e2d\u7684\u6b63\u786e\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c06 nums[j] \u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c06 base \u8d4b\u503c\u5230\u6b63\u786e\u4f4d\u7f6e\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u522b\u9700\u8981\u5faa\u73af \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u6570\u636e\u65f6\uff0c\u63d2\u5165\u64cd\u4f5c\u4f1a\u63d0\u524d\u7ec8\u6b62\u3002\u5f53\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u6709\u5e8f\u65f6\uff0c\u63d2\u5165\u6392\u5e8f\u8fbe\u5230\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u4f1a\u5c06\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\uff0c\u4e0d\u4f1a\u6539\u53d8\u5b83\u4eec\u7684\u987a\u5e8f\u3002
    "},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u4f18\u52bf","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u800c\u6211\u4eec\u5373\u5c06\u5b66\u4e60\u7684\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u5c3d\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

    \u8fd9\u4e2a\u7ed3\u8bba\u4e0e\u7ebf\u6027\u67e5\u627e\u548c\u4e8c\u5206\u67e5\u627e\u7684\u9002\u7528\u60c5\u51b5\u7684\u7ed3\u8bba\u7c7b\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u8fd9\u7c7b \\(O(n \\log n)\\) \u7684\u7b97\u6cd5\u5c5e\u4e8e\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u5355\u5143\u8ba1\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u6570\u636e\u91cf\u8f83\u5c0f\u65f6\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6570\u503c\u6bd4\u8f83\u63a5\u8fd1\uff0c\u590d\u6742\u5ea6\u4e0d\u5360\u4e3b\u5bfc\u5730\u4f4d\uff0c\u6bcf\u8f6e\u4e2d\u7684\u5355\u5143\u64cd\u4f5c\u6570\u91cf\u8d77\u5230\u51b3\u5b9a\u6027\u4f5c\u7528\u3002

    \u5b9e\u9645\u4e0a\uff0c\u8bb8\u591a\u7f16\u7a0b\u8bed\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5185\u7f6e\u6392\u5e8f\u51fd\u6570\u91c7\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u4e3a\uff1a\u5bf9\u4e8e\u957f\u6570\u7ec4\uff0c\u91c7\u7528\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5bf9\u4e8e\u77ed\u6570\u7ec4\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

    \u867d\u7136\u5192\u6ce1\u6392\u5e8f\u3001\u9009\u62e9\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u5728\u5b9e\u9645\u60c5\u51b5\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u9891\u7387\u663e\u8457\u9ad8\u4e8e\u5192\u6ce1\u6392\u5e8f\u548c\u9009\u62e9\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u5192\u6ce1\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u4ea4\u6362\u5b9e\u73b0\uff0c\u9700\u8981\u501f\u52a9\u4e00\u4e2a\u4e34\u65f6\u53d8\u91cf\uff0c\u5171\u6d89\u53ca 3 \u4e2a\u5355\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u4e8e\u5143\u7d20\u8d4b\u503c\u5b9e\u73b0\uff0c\u4ec5\u9700 1 \u4e2a\u5355\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u5192\u6ce1\u6392\u5e8f\u7684\u8ba1\u7b97\u5f00\u9500\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u51b5\u4e0b\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(n^2)\\) \u3002\u5982\u679c\u7ed9\u5b9a\u4e00\u7ec4\u90e8\u5206\u6709\u5e8f\u7684\u6570\u636e\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9009\u62e9\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
    • \u9009\u62e9\u6392\u5e8f\u4e0d\u7a33\u5b9a\uff0c\u65e0\u6cd5\u5e94\u7528\u4e8e\u591a\u7ea7\u6392\u5e8f\u3002
    "},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5f52\u5e76\u6392\u5e8f","text":"

    \u5f52\u5e76\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u5305\u542b\u56fe 11-10 \u6240\u793a\u7684\u201c\u5212\u5206\u201d\u548c\u201c\u5408\u5e76\u201d\u9636\u6bb5\u3002

    1. \u5212\u5206\u9636\u6bb5\uff1a\u901a\u8fc7\u9012\u5f52\u4e0d\u65ad\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5904\u5206\u5f00\uff0c\u5c06\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u8f6c\u6362\u4e3a\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002
    2. \u5408\u5e76\u9636\u6bb5\uff1a\u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u5212\u5206\uff0c\u5f00\u59cb\u5408\u5e76\uff0c\u6301\u7eed\u5730\u5c06\u5de6\u53f3\u4e24\u4e2a\u8f83\u77ed\u7684\u6709\u5e8f\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u8f83\u957f\u7684\u6709\u5e8f\u6570\u7ec4\uff0c\u76f4\u81f3\u7ed3\u675f\u3002

    \u56fe 11-10 \u00a0 \u5f52\u5e76\u6392\u5e8f\u7684\u5212\u5206\u4e0e\u5408\u5e76\u9636\u6bb5

    "},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5982\u56fe 11-11 \u6240\u793a\uff0c\u201c\u5212\u5206\u9636\u6bb5\u201d\u4ece\u9876\u81f3\u5e95\u9012\u5f52\u5730\u5c06\u6570\u7ec4\u4ece\u4e2d\u70b9\u5207\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002

    1. \u8ba1\u7b97\u6570\u7ec4\u4e2d\u70b9 mid \uff0c\u9012\u5f52\u5212\u5206\u5de6\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [left, mid] \uff09\u548c\u53f3\u5b50\u6570\u7ec4\uff08\u533a\u95f4 [mid + 1, right] \uff09\u3002
    2. \u9012\u5f52\u6267\u884c\u6b65\u9aa4 1. \uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u533a\u95f4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u3002

    \u201c\u5408\u5e76\u9636\u6bb5\u201d\u4ece\u5e95\u81f3\u9876\u5730\u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5408\u5e76\u4e3a\u4e00\u4e2a\u6709\u5e8f\u6570\u7ec4\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ece\u957f\u5ea6\u4e3a 1 \u7684\u5b50\u6570\u7ec4\u5f00\u59cb\u5408\u5e76\uff0c\u5408\u5e76\u9636\u6bb5\u4e2d\u7684\u6bcf\u4e2a\u5b50\u6570\u7ec4\u90fd\u662f\u6709\u5e8f\u7684\u3002

    <1><2><3><4><5><6><7><8><9><10>

    \u56fe 11-11 \u00a0 \u5f52\u5e76\u6392\u5e8f\u6b65\u9aa4

    \u89c2\u5bdf\u53d1\u73b0\uff0c\u5f52\u5e76\u6392\u5e8f\u4e0e\u4e8c\u53c9\u6811\u540e\u5e8f\u904d\u5386\u7684\u9012\u5f52\u987a\u5e8f\u662f\u4e00\u81f4\u7684\u3002

    • \u540e\u5e8f\u904d\u5386\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6811\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6811\uff0c\u6700\u540e\u5904\u7406\u6839\u8282\u70b9\u3002
    • \u5f52\u5e76\u6392\u5e8f\uff1a\u5148\u9012\u5f52\u5de6\u5b50\u6570\u7ec4\uff0c\u518d\u9012\u5f52\u53f3\u5b50\u6570\u7ec4\uff0c\u6700\u540e\u5904\u7406\u5408\u5e76\u3002

    \u5f52\u5e76\u6392\u5e8f\u7684\u5b9e\u73b0\u5982\u4ee5\u4e0b\u4ee3\u7801\u6240\u793a\u3002\u8bf7\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u5e76\u533a\u95f4\u4e3a [left, right] \uff0c\u800c tmp \u7684\u5bf9\u5e94\u533a\u95f4\u4e3a [0, right - left] \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
    def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\"\"\"\n    # \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    # \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid and j <= right:\n        if nums[i] <= nums[j]:\n            tmp[k] = nums[i]\n            i += 1\n        else:\n            tmp[k] = nums[j]\n            j += 1\n        k += 1\n    # \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid:\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    while j <= right:\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    # \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in range(0, len(tmp)):\n        nums[left + k] = tmp[k]\n\ndef merge_sort(nums: list[int], left: int, right: int):\n    \"\"\"\u5f52\u5e76\u6392\u5e8f\"\"\"\n    # \u7ec8\u6b62\u6761\u4ef6\n    if left >= right:\n        return  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    # \u5212\u5206\u9636\u6bb5\n    mid = (left + right) // 2 # \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid)  # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right)  # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    # \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n
    merge_sort.cpp
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.java
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.cs
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;       // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    MergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    MergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    Merge(nums, left, mid, right);\n}\n
    merge_sort.go
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i++\n        } else {\n            tmp[k] = nums[j]\n            j++\n        }\n        k++\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    for i <= mid {\n        tmp[k] = nums[i]\n        i++\n        k++\n    }\n    for j <= right {\n        tmp[k] = nums[j]\n        j++\n        k++\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    mid := left + (right - left) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.swift
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid, j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i += 1\n        } else {\n            tmp[k] = nums[j]\n            j += 1\n        }\n        k += 1\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    }\n    while j <= right {\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right { // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n        return\n    }\n    // \u5212\u5206\u9636\u6bb5\n    let mid = left + (right - left) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums: &nums, left: left, right: mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
    merge_sort.js
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor(left + (right - left) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.ts
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    let mid = Math.floor(left + (right - left) / 2); // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.dart
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n  // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid && j <= right) {\n    if (nums[i] <= nums[j])\n      tmp[k++] = nums[i++];\n    else\n      tmp[k++] = nums[j++];\n  }\n  // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7ec8\u6b62\u6761\u4ef6\n  if (left >= right) return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  // \u5212\u5206\u9636\u6bb5\n  int mid = left + (right - left) ~/ 2; // \u8ba1\u7b97\u4e2d\u70b9\n  mergeSort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n  mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n  // \u5408\u5e76\u9636\u6bb5\n  merge(nums, left, mid, right);\n}\n
    merge_sort.rs
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i];\n            i += 1;\n        } else {\n            tmp[k] = nums[j];\n            j += 1;\n        }\n        k += 1;\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while i <= mid {\n        tmp[k] = nums[i];\n        k += 1;\n        i += 1;\n    }\n    while j <= right {\n        tmp[k] = nums[j];\n        k += 1;\n        j += 1;\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if left >= right {\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    }\n\n    // \u5212\u5206\u9636\u6bb5\n    let mid = left + (right - left) / 2; // \u8ba1\u7b97\u4e2d\u70b9\n    merge_sort(nums, left, mid); // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    merge_sort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.c
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right)\n        return; // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    int mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid);      // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right); // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.kt
    /* \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n    // \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp \uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++]\n        else\n            tmp[k++] = nums[j++]\n    }\n    // \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5f52\u5e76\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return  // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    val mid = left + (right - left) / 2 // \u8ba1\u7b97\u4e2d\u70b9\n    mergeSort(nums, left, mid) // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    mergeSort(nums, mid + 1, right) // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.rb
    ### \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4 ###\ndef merge(nums, left, mid, right)\n  # \u5de6\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [left, mid], \u53f3\u5b50\u6570\u7ec4\u533a\u95f4\u4e3a [mid+1, right]\n  # \u521b\u5efa\u4e00\u4e2a\u4e34\u65f6\u6570\u7ec4 tmp\uff0c\u7528\u4e8e\u5b58\u653e\u5408\u5e76\u540e\u7684\u7ed3\u679c\n  tmp = Array.new(right - left + 1, 0)\n  # \u521d\u59cb\u5316\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\n  i, j, k = left, mid + 1, 0\n  # \u5f53\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u8fd8\u6709\u5143\u7d20\u65f6\uff0c\u8fdb\u884c\u6bd4\u8f83\u5e76\u5c06\u8f83\u5c0f\u7684\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while i <= mid && j <= right\n    if nums[i] <= nums[j]\n      tmp[k] = nums[i]\n      i += 1\n    else\n      tmp[k] = nums[j]\n      j += 1\n    end\n    k += 1\n  end\n  # \u5c06\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u7684\u5269\u4f59\u5143\u7d20\u590d\u5236\u5230\u4e34\u65f6\u6570\u7ec4\u4e2d\n  while i <= mid\n    tmp[k] = nums[i]\n    i += 1\n    k += 1\n  end\n  while j <= right\n    tmp[k] = nums[j]\n    j += 1\n    k += 1\n  end\n  # \u5c06\u4e34\u65f6\u6570\u7ec4 tmp \u4e2d\u7684\u5143\u7d20\u590d\u5236\u56de\u539f\u6570\u7ec4 nums \u7684\u5bf9\u5e94\u533a\u95f4\n  (0...tmp.length).each do |k|\n    nums[left + k] = tmp[k]\n  end\nend\n\n### \u5f52\u5e76\u6392\u5e8f ###\ndef merge_sort(nums, left, right)\n  # \u7ec8\u6b62\u6761\u4ef6\n  # \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  return if left >= right\n  # \u5212\u5206\u9636\u6bb5\n  mid = left + (right - left) / 2 # \u8ba1\u7b97\u4e2d\u70b9\n  merge_sort(nums, left, mid) # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n  merge_sort(nums, mid + 1, right) # \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n  # \u5408\u5e76\u9636\u6bb5\n  merge(nums, left, mid, right)\nend\n
    merge_sort.zig
    // \u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n// \u5de6\u5b50\u6570\u7ec4\u533a\u95f4 [left, mid]\n// \u53f3\u5b50\u6570\u7ec4\u533a\u95f4 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f85\u52a9\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var tmp = try mem_allocator.alloc(i32, right + 1 - left);\n    std.mem.copy(i32, tmp, nums[left..right+1]);\n    // \u5de6\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u6570\u7ec4\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7ed3\u675f\u7d22\u5f15\n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u522b\u6307\u5411\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u901a\u8fc7\u8986\u76d6\u539f\u6570\u7ec4 nums \u6765\u5408\u5e76\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u53f3\u5b50\u6570\u7ec4\u5df2\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 <= \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u5de6\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5219\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u6570\u7ec4\u90fd\u672a\u5168\u90e8\u5408\u5e76\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u6570\u7ec4\u5143\u7d20 > \u53f3\u5b50\u6570\u7ec4\u5143\u7d20\u201d\uff0c\u5219\u9009\u53d6\u53f3\u5b50\u6570\u7ec4\u5143\u7d20\uff0c\u5e76\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5f52\u5e76\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7ec8\u6b62\u6761\u4ef6\n    if (left >= right) return;              // \u5f53\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    // \u5212\u5206\u9636\u6bb5\n    var mid = left + (right - left) / 2;    // \u8ba1\u7b97\u4e2d\u70b9\n    try mergeSort(nums, left, mid);         // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\n    try mergeSort(nums, mid + 1, right);    // \u9012\u5f52\u53f3\u5b50\u6570\u7ec4\n    // \u5408\u5e76\u9636\u6bb5\n    try merge(nums, left, mid, right);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5212\u5206\u4ea7\u751f\u9ad8\u5ea6\u4e3a \\(\\log n\\) \u7684\u9012\u5f52\u6811\uff0c\u6bcf\u5c42\u5408\u5e76\u7684\u603b\u64cd\u4f5c\u6570\u91cf\u4e3a \\(n\\) \uff0c\u56e0\u6b64\u603b\u4f53\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9012\u5f52\u6df1\u5ea6\u4e3a \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002\u5408\u5e76\u64cd\u4f5c\u9700\u8981\u501f\u52a9\u8f85\u52a9\u6570\u7ec4\u5b9e\u73b0\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u5e76\u8fc7\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u53d8\u3002
    "},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u94fe\u8868\u6392\u5e8f","text":"

    \u5bf9\u4e8e\u94fe\u8868\uff0c\u5f52\u5e76\u6392\u5e8f\u76f8\u8f83\u4e8e\u5176\u4ed6\u6392\u5e8f\u7b97\u6cd5\u5177\u6709\u663e\u8457\u4f18\u52bf\uff0c\u53ef\u4ee5\u5c06\u94fe\u8868\u6392\u5e8f\u4efb\u52a1\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(1)\\) \u3002

    • \u5212\u5206\u9636\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u9012\u5f52\u201d\u6765\u5b9e\u73b0\u94fe\u8868\u5212\u5206\u5de5\u4f5c\uff0c\u4ece\u800c\u7701\u53bb\u9012\u5f52\u4f7f\u7528\u7684\u6808\u5e27\u7a7a\u95f4\u3002
    • \u5408\u5e76\u9636\u6bb5\uff1a\u5728\u94fe\u8868\u4e2d\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u4ec5\u9700\u6539\u53d8\u5f15\u7528\uff08\u6307\u9488\uff09\u5373\u53ef\u5b9e\u73b0\uff0c\u56e0\u6b64\u5408\u5e76\u9636\u6bb5\uff08\u5c06\u4e24\u4e2a\u77ed\u6709\u5e8f\u94fe\u8868\u5408\u5e76\u4e3a\u4e00\u4e2a\u957f\u6709\u5e8f\u94fe\u8868\uff09\u65e0\u987b\u521b\u5efa\u989d\u5916\u94fe\u8868\u3002

    \u5177\u4f53\u5b9e\u73b0\u7ec6\u8282\u6bd4\u8f83\u590d\u6742\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u67e5\u9605\u76f8\u5173\u8d44\u6599\u8fdb\u884c\u5b66\u4e60\u3002

    "},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

    \u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u7b97\u6cd5\uff0c\u8fd0\u884c\u9ad8\u6548\uff0c\u5e94\u7528\u5e7f\u6cdb\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5176\u76ee\u6807\u662f\uff1a\u9009\u62e9\u6570\u7ec4\u4e2d\u7684\u67d0\u4e2a\u5143\u7d20\u4f5c\u4e3a\u201c\u57fa\u51c6\u6570\u201d\uff0c\u5c06\u6240\u6709\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u4fa7\uff0c\u800c\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u4fa7\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u54e8\u5175\u5212\u5206\u7684\u6d41\u7a0b\u5982\u56fe 11-8 \u6240\u793a\u3002

    1. \u9009\u53d6\u6570\u7ec4\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u521d\u59cb\u5316\u4e24\u4e2a\u6307\u9488 i \u548c j \u5206\u522b\u6307\u5411\u6570\u7ec4\u7684\u4e24\u7aef\u3002
    2. \u8bbe\u7f6e\u4e00\u4e2a\u5faa\u73af\uff0c\u5728\u6bcf\u8f6e\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u522b\u5bfb\u627e\u7b2c\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u540e\u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\u3002
    3. \u5faa\u73af\u6267\u884c\u6b65\u9aa4 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u65f6\u505c\u6b62\uff0c\u6700\u540e\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\u3002
    <1><2><3><4><5><6><7><8><9>

    \u56fe 11-8 \u00a0 \u54e8\u5175\u5212\u5206\u6b65\u9aa4

    \u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u539f\u6570\u7ec4\u88ab\u5212\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u6570\u7ec4\u3001\u57fa\u51c6\u6570\u3001\u53f3\u5b50\u6570\u7ec4\uff0c\u4e14\u6ee1\u8db3\u201c\u5de6\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u51c6\u6570 \\(\\leq\\) \u53f3\u5b50\u6570\u7ec4\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u63a5\u4e0b\u6765\u53ea\u9700\u5bf9\u8fd9\u4e24\u4e2a\u5b50\u6570\u7ec4\u8fdb\u884c\u6392\u5e8f\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    \u54e8\u5175\u5212\u5206\u7684\u5b9e\u8d28\u662f\u5c06\u4e00\u4e2a\u8f83\u957f\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u7b80\u5316\u4e3a\u4e24\u4e2a\u8f83\u77ed\u6570\u7ec4\u7684\u6392\u5e8f\u95ee\u9898\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(vector<int> &nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int[] nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u54e8\u5175\u5212\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u54e8\u5175\u5212\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.js
    /* \u5143\u7d20\u4ea4\u6362 */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u5143\u7d20\u4ea4\u6362 */\nswap(nums: number[], i: number, j: number): void {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u6362\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid _swap(List<int> nums, int i, int j) {\n  int tmp = nums[i];\n  nums[i] = nums[j];\n  nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u54e8\u5175\u5212\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u5143\u7d20\u4ea4\u6362 */\nvoid swap(int nums[], int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n    return i;\n}\n
    quick_sort.kt
    /* \u5143\u7d20\u4ea4\u6362 */\nfun swap(nums: IntArray, i: Int, j: Int) {\n    val temp = nums[i]\n    nums[i] = nums[j]\n    nums[j] = temp\n}\n\n/* \u54e8\u5175\u5212\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i              // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    ### \u54e8\u5175\u5212\u5206 ###\ndef partition(nums, left, right)\n  # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    while i < j && nums[i] <= nums[left]\n      i += 1 # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    # \u5143\u7d20\u4ea4\u6362\n    nums[i], nums[j] = nums[j], nums[i]\n  end\n  # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  nums[i], nums[left] = nums[left], nums[i]\n  i # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nend\n
    quick_sort.zig
    // \u5143\u7d20\u4ea4\u6362\nfn swap(nums: []i32, i: usize, j: usize) void {\n    var tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n// \u54e8\u5175\u5212\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5feb\u901f\u6392\u5e8f\u7684\u6574\u4f53\u6d41\u7a0b\u5982\u56fe 11-9 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5bf9\u539f\u6570\u7ec4\u6267\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5212\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u3002
    2. \u7136\u540e\uff0c\u5bf9\u5de6\u5b50\u6570\u7ec4\u548c\u53f3\u5b50\u6570\u7ec4\u5206\u522b\u9012\u5f52\u6267\u884c\u201c\u54e8\u5175\u5212\u5206\u201d\u3002
    3. \u6301\u7eed\u9012\u5f52\uff0c\u76f4\u81f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\uff0c\u4ece\u800c\u5b8c\u6210\u6574\u4e2a\u6570\u7ec4\u7684\u6392\u5e8f\u3002

    \u56fe 11-9 \u00a0 \u5feb\u901f\u6392\u5e8f\u6d41\u7a0b

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right:\n        return\n    # \u54e8\u5175\u5212\u5206\n    pivot = self.partition(nums, left, right)\n    # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    self.quick_sort(nums, left, pivot - 1)\n    self.quick_sort(nums, pivot + 1, right)\n
    quick_sort.cpp
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.java
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5212\u5206\n    int pivot = Partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    QuickSort(nums, left, pivot - 1);\n    QuickSort(nums, pivot + 1, right);\n}\n
    quick_sort.go
    /* \u5feb\u901f\u6392\u5e8f */\nfunc (q *quickSort) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    pivot := q.partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    q.quickSort(nums, left, pivot-1)\n    q.quickSort(nums, pivot+1, right)\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f */\nfunc quickSort(nums: inout [Int], left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums: &nums, left: left, right: pivot - 1)\n    quickSort(nums: &nums, left: pivot + 1, right: right)\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.dart
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n  if (left >= right) return;\n  // \u54e8\u5175\u5212\u5206\n  int pivot = _partition(nums, left, right);\n  // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n  quickSort(nums, left, pivot - 1);\n  quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.rs
    /* \u5feb\u901f\u6392\u5e8f */\npub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    Self::quick_sort(left, pivot - 1, nums);\n    Self::quick_sort(pivot + 1, right, nums);\n}\n
    quick_sort.c
    /* \u5feb\u901f\u6392\u5e8f */\nvoid quickSort(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5212\u5206\n    int pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.kt
    /* \u5feb\u901f\u6392\u5e8f */\nfun quickSort(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return\n    // \u54e8\u5175\u5212\u5206\n    val pivot = partition(nums, left, right)\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
    quick_sort.rb
    ### \u5feb\u901f\u6392\u5e8f\u7c7b ###\ndef quick_sort(nums, left, right)\n  # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e0d\u4e3a 1 \u65f6\u9012\u5f52\n  if left < right\n    # \u54e8\u5175\u5212\u5206\n    pivot = partition(nums, left, right)\n    # \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    if (left >= right) return;\n    // \u54e8\u5175\u5212\u5206\n    var pivot = partition(nums, left, right);\n    // \u9012\u5f52\u5de6\u5b50\u6570\u7ec4\u3001\u53f3\u5b50\u6570\u7ec4\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\)\u3001\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u51b5\u4e0b\uff0c\u54e8\u5175\u5212\u5206\u7684\u9012\u5f52\u5c42\u6570\u4e3a \\(\\log n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u603b\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n \\log n)\\) \u65f6\u95f4\u3002\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u957f\u5ea6\u4e3a \\(n\\) \u7684\u6570\u7ec4\u5212\u5206\u4e3a\u957f\u5ea6\u4e3a \\(0\\) \u548c \\(n - 1\\) \u7684\u4e24\u4e2a\u5b50\u6570\u7ec4\uff0c\u6b64\u65f6\u9012\u5f52\u5c42\u6570\u8fbe\u5230 \\(n\\) \uff0c\u6bcf\u5c42\u4e2d\u7684\u5faa\u73af\u6570\u4e3a \\(n\\) \uff0c\u603b\u4f53\u4f7f\u7528 \\(O(n^2)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f93\u5165\u6570\u7ec4\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u51b5\u4e0b\uff0c\u8fbe\u5230\u6700\u5dee\u9012\u5f52\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u6570\u7ec4\u4e0a\u8fdb\u884c\u7684\uff0c\u672a\u501f\u52a9\u989d\u5916\u6570\u7ec4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5212\u5206\u7684\u6700\u540e\u4e00\u6b65\uff0c\u57fa\u51c6\u6570\u53ef\u80fd\u4f1a\u88ab\u4ea4\u6362\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u4fa7\u3002
    "},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u4e3a\u4ec0\u4e48\u5feb","text":"

    \u4ece\u540d\u79f0\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u5e94\u8be5\u5177\u6709\u4e00\u5b9a\u7684\u4f18\u52bf\u3002\u5c3d\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u4e0e\u201c\u5f52\u5e76\u6392\u5e8f\u201d\u548c\u201c\u5806\u6392\u5e8f\u201d\u76f8\u540c\uff0c\u4f46\u901a\u5e38\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u51fa\u73b0\u6700\u5dee\u60c5\u51b5\u7684\u6982\u7387\u5f88\u4f4e\uff1a\u867d\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u6ca1\u6709\u5f52\u5e76\u6392\u5e8f\u7a33\u5b9a\uff0c\u4f46\u5728\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e0b\u8fd0\u884c\u3002
    • \u7f13\u5b58\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u6267\u884c\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u65f6\uff0c\u7cfb\u7edf\u53ef\u5c06\u6574\u4e2a\u5b50\u6570\u7ec4\u52a0\u8f7d\u5230\u7f13\u5b58\uff0c\u56e0\u6b64\u8bbf\u95ee\u5143\u7d20\u7684\u6548\u7387\u8f83\u9ad8\u3002\u800c\u50cf\u201c\u5806\u6392\u5e8f\u201d\u8fd9\u7c7b\u7b97\u6cd5\u9700\u8981\u8df3\u8dc3\u5f0f\u8bbf\u95ee\u5143\u7d20\uff0c\u4ece\u800c\u7f3a\u4e4f\u8fd9\u4e00\u7279\u6027\u3002
    • \u590d\u6742\u5ea6\u7684\u5e38\u6570\u7cfb\u6570\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u79cd\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f83\u3001\u8d4b\u503c\u3001\u4ea4\u6362\u7b49\u64cd\u4f5c\u7684\u603b\u6570\u91cf\u6700\u5c11\u3002\u8fd9\u4e0e\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u7c7b\u4f3c\u3002
    "},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u51c6\u6570\u4f18\u5316","text":"

    \u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\u7684\u65f6\u95f4\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u4e3e\u4e00\u4e2a\u6781\u7aef\u4f8b\u5b50\uff0c\u5047\u8bbe\u8f93\u5165\u6570\u7ec4\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u4e8e\u6211\u4eec\u9009\u62e9\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u5728\u54e8\u5175\u5212\u5206\u5b8c\u6210\u540e\uff0c\u57fa\u51c6\u6570\u88ab\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u53f3\u7aef\uff0c\u5bfc\u81f4\u5de6\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(n - 1\\)\u3001\u53f3\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(0\\) \u3002\u5982\u6b64\u9012\u5f52\u4e0b\u53bb\uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u540e\u90fd\u6709\u4e00\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u4e3a\u201c\u5192\u6ce1\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

    \u4e3a\u4e86\u5c3d\u91cf\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u53d1\u751f\uff0c\u6211\u4eec\u53ef\u4ee5\u4f18\u5316\u54e8\u5175\u5212\u5206\u4e2d\u7684\u57fa\u51c6\u6570\u7684\u9009\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u968f\u673a\u9009\u53d6\u4e00\u4e2a\u5143\u7d20\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u7136\u800c\uff0c\u5982\u679c\u8fd0\u6c14\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9009\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u51c6\u6570\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u5c3d\u5982\u4eba\u610f\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7f16\u7a0b\u8bed\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u4f2a\u968f\u673a\u6570\u201d\u3002\u5982\u679c\u6211\u4eec\u9488\u5bf9\u4f2a\u968f\u673a\u6570\u5e8f\u5217\u6784\u5efa\u4e00\u4e2a\u7279\u5b9a\u7684\u6d4b\u8bd5\u6837\u4f8b\uff0c\u90a3\u4e48\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

    \u4e3a\u4e86\u8fdb\u4e00\u6b65\u6539\u8fdb\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6570\u7ec4\u4e2d\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\uff08\u901a\u5e38\u4e3a\u6570\u7ec4\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u70b9\u5143\u7d20\uff09\uff0c\u5e76\u5c06\u8fd9\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\u4f5c\u4e3a\u57fa\u51c6\u6570\u3002\u8fd9\u6837\u4e00\u6765\uff0c\u57fa\u51c6\u6570\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6982\u7387\u5c06\u5927\u5e45\u63d0\u5347\u3002\u5f53\u7136\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u9009\u53d6\u66f4\u591a\u5019\u9009\u5143\u7d20\uff0c\u4ee5\u8fdb\u4e00\u6b65\u63d0\u9ad8\u7b97\u6cd5\u7684\u7a33\u5065\u6027\u3002\u91c7\u7528\u8fd9\u79cd\u65b9\u6cd5\u540e\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6982\u7387\u5927\u5927\u964d\u4f4e\u3002

    \u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\"\"\"\n    l, m, r = nums[left], nums[mid], nums[right]\n    if (l <= m <= r) or (r <= m <= l):\n        return mid  # m \u5728 l \u548c r \u4e4b\u95f4\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint MedianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;             // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n    l, m, r := nums[left], nums[mid], nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\n    let l = nums[left]\n    let m = nums[mid]\n    let r = nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = medianThree(nums: nums, left: left, mid: left + (right - left) / 2, right: right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
    quick_sort.js
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(nums, left, mid, right) {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nmedianThree(\n    nums: number[],\n    left: number,\n    mid: number,\n    right: number\n): number {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint _medianThree(List<int> nums, int left, int mid, int right) {\n  int l = nums[left], m = nums[mid], r = nums[right];\n  if ((l <= m && m <= r) || (r <= m && m <= l))\n    return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u95f4\n  return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  return i; // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {\n    let (l, m, r) = (nums[left], nums[mid], nums[right]);\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    }\n    right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    i // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nint medianThree(int nums[], int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;            // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.kt
    /* \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 */\nfun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {\n    val l = nums[left]\n    val m = nums[mid]\n    val r = nums[right]\n    if ((m in l..r) || (m in r..l))\n        return mid  // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u95f4\n    return right\n}\n\n/* \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i                         // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    ### \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570 ###\ndef median_three(nums, left, mid, right)\n  # \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n  _l, _m, _r = nums[left], nums[mid], nums[right]\n  # m \u5728 l \u548c r \u4e4b\u95f4\n  return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l)\n  # l \u5728 m \u548c r \u4e4b\u95f4\n  return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m)\n  return right\nend\n\n### \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09###\ndef partition(nums, left, right)\n  ### \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n  med = median_three(nums, left, (left + right) / 2, right)\n  # \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u65ad\n  nums[left], nums[med] = nums[med], nums[left]\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    while i < j && nums[i] <= nums[left]\n      i += 1 # \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n    end\n    # \u5143\u7d20\u4ea4\u6362\n    nums[i], nums[j] = nums[j], nums[i]\n  end\n  # \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n  nums[i], nums[left] = nums[left], nums[i]\n  i # \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\nend\n
    quick_sort.zig
    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\nfn medianThree(nums: []i32, left: usize, mid: usize, right: usize) usize {\n    var l = nums[left];\n    var m = nums[mid];\n    var r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u5728 l \u548c r \u4e4b\u95f4\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u95f4\n    return right;\n}\n\n// \u54e8\u5175\u5212\u5206\uff08\u4e09\u6570\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9009\u53d6\u4e09\u4e2a\u5019\u9009\u5143\u7d20\u7684\u4e2d\u4f4d\u6570\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c06\u4e2d\u4f4d\u6570\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u4e3a\u57fa\u51c6\u6570\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u4ece\u53f3\u5411\u5de6\u627e\u9996\u4e2a\u5c0f\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u4ece\u5de6\u5411\u53f3\u627e\u9996\u4e2a\u5927\u4e8e\u57fa\u51c6\u6570\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u6362\u8fd9\u4e24\u4e2a\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c06\u57fa\u51c6\u6570\u4ea4\u6362\u81f3\u4e24\u5b50\u6570\u7ec4\u7684\u5206\u754c\u7ebf\n    return i;               // \u8fd4\u56de\u57fa\u51c6\u6570\u7684\u7d22\u5f15\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u9012\u5f52\u4f18\u5316","text":"

    \u5728\u67d0\u4e9b\u8f93\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u5360\u7528\u7a7a\u95f4\u8f83\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f93\u5165\u6570\u7ec4\u4e3a\u4f8b\uff0c\u8bbe\u9012\u5f52\u4e2d\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a \\(m\\) \uff0c\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u90fd\u5c06\u4ea7\u751f\u957f\u5ea6\u4e3a \\(0\\) \u7684\u5de6\u5b50\u6570\u7ec4\u548c\u957f\u5ea6\u4e3a \\(m - 1\\) \u7684\u53f3\u5b50\u6570\u7ec4\uff0c\u8fd9\u610f\u5473\u7740\u6bcf\u4e00\u5c42\u9012\u5f52\u8c03\u7528\u51cf\u5c11\u7684\u95ee\u9898\u89c4\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u51cf\u5c11\u4e00\u4e2a\u5143\u7d20\uff09\uff0c\u9012\u5f52\u6811\u7684\u9ad8\u5ea6\u4f1a\u8fbe\u5230 \\(n - 1\\) \uff0c\u6b64\u65f6\u9700\u8981\u5360\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u6808\u5e27\u7a7a\u95f4\u3002

    \u4e3a\u4e86\u9632\u6b62\u6808\u5e27\u7a7a\u95f4\u7684\u7d2f\u79ef\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u6bcf\u8f6e\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u540e\uff0c\u6bd4\u8f83\u4e24\u4e2a\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\uff0c\u4ec5\u5bf9\u8f83\u77ed\u7684\u5b50\u6570\u7ec4\u8fdb\u884c\u9012\u5f52\u3002\u7531\u4e8e\u8f83\u77ed\u5b50\u6570\u7ec4\u7684\u957f\u5ea6\u4e0d\u4f1a\u8d85\u8fc7 \\(n / 2\\) \uff0c\u56e0\u6b64\u8fd9\u79cd\u65b9\u6cd5\u80fd\u786e\u4fdd\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff0c\u4ece\u800c\u5c06\u6700\u5dee\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u81f3 \\(O(\\log n)\\) \u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\"\"\"\n    # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right:\n        # \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1  # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n
    quick_sort.cpp
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.java
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.go
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    for left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1                 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.dart
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n      left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n      right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n    }\n  }\n}\n
    quick_sort.rs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while left < right {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1; // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.c
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
    quick_sort.kt
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            l = pivot + 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            r = pivot - 1 // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.rb
    ### \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09###\ndef quick_sort(nums, left, right)\n  # \u5b50\u6570\u7ec4\u957f\u5ea6\u4e0d\u4e3a 1 \u65f6\u9012\u5f52\n  while left < right\n    # \u54e8\u5175\u5212\u5206\n    pivot = partition(nums, left, right)\n    # \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n    if pivot - left < right - pivot\n      quick_sort(nums, left, pivot - 1)\n      left = pivot + 1 # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n    else\n      quick_sort(nums, pivot + 1, right)\n      right = pivot - 1 # \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n    end\n  end\nend\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u9012\u5f52\u4f18\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u6570\u7ec4\u957f\u5ea6\u4e3a 1 \u65f6\u7ec8\u6b62\u9012\u5f52\n    while (left < right) {\n        // \u54e8\u5175\u5212\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5bf9\u4e24\u4e2a\u5b50\u6570\u7ec4\u4e2d\u8f83\u77ed\u7684\u90a3\u4e2a\u6267\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u9012\u5f52\u6392\u5e8f\u5de6\u5b50\u6570\u7ec4\n            left = pivot + 1;                   // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u9012\u5f52\u6392\u5e8f\u53f3\u5b50\u6570\u7ec4\n            right = pivot - 1;                  // \u5269\u4f59\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [left, pivot - 1]\n        }\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6570\u6392\u5e8f","text":"

    \u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u8ba1\u6570\u6392\u5e8f\uff0c\u5b83\u9002\u7528\u4e8e\u6570\u636e\u91cf \\(n\\) \u8f83\u5927\u4f46\u6570\u636e\u8303\u56f4 \\(m\\) \u8f83\u5c0f\u7684\u60c5\u51b5\u3002\u5047\u8bbe\u6211\u4eec\u9700\u8981\u5bf9 \\(n = 10^6\\) \u4e2a\u5b66\u53f7\u8fdb\u884c\u6392\u5e8f\uff0c\u800c\u5b66\u53f7\u662f\u4e00\u4e2a \\(8\\) \u4f4d\u6570\u5b57\uff0c\u8fd9\u610f\u5473\u7740\u6570\u636e\u8303\u56f4 \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8ba1\u6570\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u5185\u5b58\u7a7a\u95f4\uff0c\u800c\u57fa\u6570\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u3002

    \u57fa\u6570\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u4e0e\u8ba1\u6570\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u901a\u8fc7\u7edf\u8ba1\u4e2a\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u57fa\u6570\u6392\u5e8f\u5229\u7528\u6570\u5b57\u5404\u4f4d\u4e4b\u95f4\u7684\u9012\u8fdb\u5173\u7cfb\uff0c\u4f9d\u6b21\u5bf9\u6bcf\u4e00\u4f4d\u8fdb\u884c\u6392\u5e8f\uff0c\u4ece\u800c\u5f97\u5230\u6700\u7ec8\u7684\u6392\u5e8f\u7ed3\u679c\u3002

    "},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u7b97\u6cd5\u6d41\u7a0b","text":"

    \u4ee5\u5b66\u53f7\u6570\u636e\u4e3a\u4f8b\uff0c\u5047\u8bbe\u6570\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6570\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u56fe 11-18 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4f4d\u6570 \\(k = 1\\) \u3002
    2. \u5bf9\u5b66\u53f7\u7684\u7b2c \\(k\\) \u4f4d\u6267\u884c\u201c\u8ba1\u6570\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u540e\uff0c\u6570\u636e\u4f1a\u6839\u636e\u7b2c \\(k\\) \u4f4d\u4ece\u5c0f\u5230\u5927\u6392\u5e8f\u3002
    3. \u5c06 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u540e\u8fd4\u56de\u6b65\u9aa4 2. \u7ee7\u7eed\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u540e\u7ed3\u675f\u3002

    \u56fe 11-18 \u00a0 \u57fa\u6570\u6392\u5e8f\u7b97\u6cd5\u6d41\u7a0b

    \u4e0b\u9762\u5256\u6790\u4ee3\u7801\u5b9e\u73b0\u3002\u5bf9\u4e8e\u4e00\u4e2a \\(d\\) \u8fdb\u5236\u7684\u6570\u5b57 \\(x\\) \uff0c\u8981\u83b7\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8ba1\u7b97\u516c\u5f0f\uff1a

    \\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

    \u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5bf9\u6d6e\u70b9\u6570 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5bf9 \\(d\\) \u53d6\u6a21\uff08\u53d6\u4f59\uff09\u3002\u5bf9\u4e8e\u5b66\u53f7\u6570\u636e\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

    \u6b64\u5916\uff0c\u6211\u4eec\u9700\u8981\u5c0f\u5e45\u6539\u52a8\u8ba1\u6570\u6392\u5e8f\u4ee3\u7801\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u636e\u6570\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u8fdb\u884c\u6392\u5e8f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
    def digit(num: int, exp: int) -> int:\n    \"\"\"\u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter = [0] * 10\n    n = len(nums)\n    # \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1  # \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    # \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        d = digit(nums[i], exp)\n        j = counter[d] - 1  # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    # \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6570\u6392\u5e8f\"\"\"\n    # \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    m = max(nums)\n    # \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    exp = 1\n    while exp <= m:\n        # \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        # k = 1 -> exp = 1\n        # k = 2 -> exp = 10\n        # \u5373 exp = 10^(k-1)\n        counting_sort_digit(nums, exp)\n        exp *= 10\n
    radix_sort.cpp
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    vector<int> res(n, 0);\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n}\n
    radix_sort.java
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.cs
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++;                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = Digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        CountingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.go
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++             // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        d := digit(nums[i], exp)\n        j := counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n    }\n}\n
    radix_sort.swift
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var counter = Array(repeating: 0, count: 10)\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1 // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let d = digit(num: nums[i], exp: exp)\n        let j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums: &nums, exp: exp)\n    }\n}\n
    radix_sort.js
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.ts
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.dart
    /* \u83b7\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n    counter[d]++; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n  }\n  // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n  List<int> res = List<int>.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int d = digit(nums[i], exp);\n    int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n  }\n  // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n  // dart \u4e2d int \u7684\u957f\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n    // k = 1 -> exp = 1\n    // k = 2 -> exp = 10\n    // \u5373 exp = 10^(k-1)\n    countingSortDigit(nums, exp);\n}\n
    radix_sort.rs
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let d = digit(nums[i], exp);\n        let j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    nums.copy_from_slice(&res);\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
    radix_sort.c
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (int i = 0; i < size; i++) {\n        // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        int d = digit(nums[i], exp);\n        // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    int *res = (int *)malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    int max = INT32_MIN;\n    for (size_t i = 0; i < size - 1; i++) {\n        if (nums[i] > max) {\n            max = nums[i];\n        }\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, size, exp);\n}\n
    radix_sort.kt
    /* \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d]++                // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val d = digit(nums[i], exp)\n        val j = counter[d] - 1 // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6570\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    while (exp <= m) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n        exp *= 10\n    }\n}\n
    radix_sort.rb
    ### \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) ###\ndef digit(num, exp)\n  # \u8f6c\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n  (num / exp) % 10\nend\n\n### \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09###\ndef counting_sort_digit(nums, exp)\n  # \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n  counter = Array.new(10, 0)\n  n = nums.length\n  # \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n  for i in 0...n\n    d = digit(nums[i], exp) # \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n    counter[d] += 1 # \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n  end\n  # \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n  (1...10).each { |i| counter[i] += counter[i - 1] }\n  # \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n  res = Array.new(n, 0)\n  for i in (n - 1).downto(0)\n    d = digit(nums[i], exp)\n    j = counter[d] - 1 # \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i] # \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d] -= 1 # \u5c06 d \u7684\u6570\u91cf\u51cf 1\n  end\n  # \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n  (0...n).each { |i| nums[i] = res[i] }\nend\n\n### \u57fa\u6570\u6392\u5e8f ###\ndef radix_sort(nums)\n  # \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n  m = nums.max\n  # \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n  exp = 1\n  while exp <= m\n    # \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n    # k = 1 -> exp = 1\n    # k = 2 -> exp = 10\n    # \u5373 exp = 10^(k-1)\n    counting_sort_digit(nums, exp)\n    exp *= 10\n  end\nend\n
    radix_sort.zig
    // \u83b7\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u4f20\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u590d\u6267\u884c\u6602\u8d35\u7684\u6b21\u65b9\u8ba1\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8ba1\u6570\u6392\u5e8f\uff08\u6839\u636e nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u8fdb\u5236\u7684\u4f4d\u8303\u56f4\u4e3a 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u957f\u5ea6\u4e3a 10 \u7684\u6876\u6570\u7ec4\n    var mem_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);\n    // defer mem_arena.deinit();\n    const mem_allocator = mem_arena.allocator();\n    var counter = try mem_allocator.alloc(usize, 10);\n    @memset(counter, 0);\n    var n = nums.len;\n    // \u7edf\u8ba1 0~9 \u5404\u6570\u5b57\u7684\u51fa\u73b0\u6b21\u6570\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u83b7\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8bb0\u4e3a d\n        counter[d] += 1; // \u7edf\u8ba1\u6570\u5b57 d \u7684\u51fa\u73b0\u6b21\u6570\n    }\n    // \u6c42\u524d\u7f00\u548c\uff0c\u5c06\u201c\u51fa\u73b0\u4e2a\u6570\u201d\u8f6c\u6362\u4e3a\u201c\u6570\u7ec4\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u904d\u5386\uff0c\u6839\u636e\u6876\u5185\u7edf\u8ba1\u7ed3\u679c\uff0c\u5c06\u5404\u5143\u7d20\u586b\u5165 res\n    var res = try mem_allocator.alloc(i32, n);\n    i = n - 1;\n    while (i >= 0) : (i -= 1) {\n        var d: u32 = @bitCast(digit(nums[i], exp));\n        var j = counter[d] - 1; // \u83b7\u53d6 d \u5728\u6570\u7ec4\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c06\u5f53\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c06 d \u7684\u6570\u91cf\u51cf 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7ed3\u679c\u8986\u76d6\u539f\u6570\u7ec4 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6570\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u83b7\u53d6\u6570\u7ec4\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u4e8e\u5224\u65ad\u6700\u5927\u4f4d\u6570\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u4ece\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u987a\u5e8f\u904d\u5386\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5bf9\u6570\u7ec4\u5143\u7d20\u7684\u7b2c k \u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u5373 exp = 10^(k-1)\n        try countingSortDigit(nums, exp);    \n    }\n} \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4e3a\u4ec0\u4e48\u4ece\u6700\u4f4e\u4f4d\u5f00\u59cb\u6392\u5e8f\uff1f

    \u5728\u8fde\u7eed\u7684\u6392\u5e8f\u8f6e\u6b21\u4e2d\uff0c\u540e\u4e00\u8f6e\u6392\u5e8f\u4f1a\u8986\u76d6\u524d\u4e00\u8f6e\u6392\u5e8f\u7684\u7ed3\u679c\u3002\u4e3e\u4f8b\u6765\u8bf4\uff0c\u5982\u679c\u7b2c\u4e00\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f6e\u6392\u5e8f\u7ed3\u679c \\(a > b\\) \uff0c\u90a3\u4e48\u7b2c\u4e8c\u8f6e\u7684\u7ed3\u679c\u5c06\u53d6\u4ee3\u7b2c\u4e00\u8f6e\u7684\u7ed3\u679c\u3002\u7531\u4e8e\u6570\u5b57\u7684\u9ad8\u4f4d\u4f18\u5148\u7ea7\u9ad8\u4e8e\u4f4e\u4f4d\uff0c\u56e0\u6b64\u5e94\u8be5\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

    "},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"

    \u76f8\u8f83\u4e8e\u8ba1\u6570\u6392\u5e8f\uff0c\u57fa\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u503c\u8303\u56f4\u8f83\u5927\u7684\u60c5\u51b5\uff0c\u4f46\u524d\u63d0\u662f\u6570\u636e\u5fc5\u987b\u53ef\u4ee5\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6570\u4e0d\u80fd\u8fc7\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u70b9\u6570\u4e0d\u9002\u5408\u4f7f\u7528\u57fa\u6570\u6392\u5e8f\uff0c\u56e0\u4e3a\u5176\u4f4d\u6570 \\(k\\) \u8fc7\u5927\uff0c\u53ef\u80fd\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(nk)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u8bbe\u6570\u636e\u91cf\u4e3a \\(n\\)\u3001\u6570\u636e\u4e3a \\(d\\) \u8fdb\u5236\u3001\u6700\u5927\u4f4d\u6570\u4e3a \\(k\\) \uff0c\u5219\u5bf9\u67d0\u4e00\u4f4d\u6267\u884c\u8ba1\u6570\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u65f6\u95f4\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u65f6\u95f4\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5bf9\u8f83\u5c0f\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u8d8b\u5411 \\(O(n)\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u4e0e\u8ba1\u6570\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6570\u6392\u5e8f\u9700\u8981\u501f\u52a9\u957f\u5ea6\u4e3a \\(n\\) \u548c \\(d\\) \u7684\u6570\u7ec4 res \u548c counter \u3002
    • \u7a33\u5b9a\u6392\u5e8f\uff1a\u5f53\u8ba1\u6570\u6392\u5e8f\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u4e5f\u7a33\u5b9a\uff1b\u5f53\u8ba1\u6570\u6392\u5e8f\u4e0d\u7a33\u5b9a\u65f6\uff0c\u57fa\u6570\u6392\u5e8f\u65e0\u6cd5\u4fdd\u8bc1\u5f97\u5230\u6b63\u786e\u7684\u6392\u5e8f\u7ed3\u679c\u3002
    "},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9009\u62e9\u6392\u5e8f","text":"

    \u9009\u62e9\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7b80\u5355\uff1a\u5f00\u542f\u4e00\u4e2a\u5faa\u73af\uff0c\u6bcf\u8f6e\u4ece\u672a\u6392\u5e8f\u533a\u95f4\u9009\u62e9\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c06\u5176\u653e\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u672b\u5c3e\u3002

    \u8bbe\u6570\u7ec4\u7684\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u9009\u62e9\u6392\u5e8f\u7684\u7b97\u6cd5\u6d41\u7a0b\u5982\u56fe 11-2 \u6240\u793a\u3002

    1. \u521d\u59cb\u72b6\u6001\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u533a\u95f4\u4e3a \\([0, n-1]\\) \u3002
    2. \u9009\u53d6\u533a\u95f4 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(0\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 1 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9009\u53d6\u533a\u95f4 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c06\u5176\u4e0e\u7d22\u5f15 \\(1\\) \u5904\u7684\u5143\u7d20\u4ea4\u6362\u3002\u5b8c\u6210\u540e\uff0c\u6570\u7ec4\u524d 2 \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u7c7b\u63a8\u3002\u7ecf\u8fc7 \\(n - 1\\) \u8f6e\u9009\u62e9\u4e0e\u4ea4\u6362\u540e\uff0c\u6570\u7ec4\u524d \\(n - 1\\) \u4e2a\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    5. \u4ec5\u5269\u7684\u4e00\u4e2a\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u65e0\u987b\u6392\u5e8f\uff0c\u56e0\u6b64\u6570\u7ec4\u6392\u5e8f\u5b8c\u6210\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 11-2 \u00a0 \u9009\u62e9\u6392\u5e8f\u6b65\u9aa4

    \u5728\u4ee3\u7801\u4e2d\uff0c\u6211\u4eec\u7528 \\(k\\) \u6765\u8bb0\u5f55\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
    def selection_sort(nums: list[int]):\n    \"\"\"\u9009\u62e9\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in range(n - 1):\n        # \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k = i\n        for j in range(i + 1, n):\n            if nums[j] < nums[k]:\n                k = j  # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n
    selection_sort.cpp
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        swap(nums[i], nums[k]);\n    }\n}\n
    selection_sort.java
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.cs
    /* \u9009\u62e9\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
    selection_sort.go
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
    selection_sort.swift
    /* \u9009\u62e9\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        var k = i\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[j] < nums[k] {\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swapAt(i, k)\n    }\n}\n
    selection_sort.js
    /* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.ts
    /* \u9009\u62e9\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.dart
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n    int k = i;\n    for (int j = i + 1; j < n; j++) {\n      if (nums[j] < nums[k]) k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
    selection_sort.rs
    /* \u9009\u62e9\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for i in 0..n - 1 {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        let mut k = i;\n        for j in i + 1..n {\n            if nums[j] < nums[k] {\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        nums.swap(i, k);\n    }\n}\n
    selection_sort.c
    /* \u9009\u62e9\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.kt
    /* \u9009\u62e9\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
    selection_sort.rb
    ### \u9009\u62e9\u6392\u5e8f ###\ndef selection_sort(nums)\n  n = nums.length\n  # \u5916\u5faa\u73af\uff1a\u672a\u6392\u5e8f\u533a\u95f4\u4e3a [i, n-1]\n  for i in 0...(n - 1)\n    # \u5185\u5faa\u73af\uff1a\u627e\u5230\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u6700\u5c0f\u5143\u7d20\n    k = i\n    for j in (i + 1)...n\n      if nums[j] < nums[k]\n        k = j # \u8bb0\u5f55\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n      end\n    end\n    # \u5c06\u8be5\u6700\u5c0f\u5143\u7d20\u4e0e\u672a\u6392\u5e8f\u533a\u95f4\u7684\u9996\u4e2a\u5143\u7d20\u4ea4\u6362\n    nums[i], nums[k] = nums[k], nums[i]\n  end\nend\n
    selection_sort.zig
    [class]{}-[func]{selectionSort}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u7b97\u6cd5\u7279\u6027","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\)\u3001\u975e\u81ea\u9002\u5e94\u6392\u5e8f\uff1a\u5916\u5faa\u73af\u5171 \\(n - 1\\) \u8f6e\uff0c\u7b2c\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(n\\) \uff0c\u6700\u540e\u4e00\u8f6e\u7684\u672a\u6392\u5e8f\u533a\u95f4\u957f\u5ea6\u4e3a \\(2\\) \uff0c\u5373\u5404\u8f6e\u5916\u5faa\u73af\u5206\u522b\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f6e\u5185\u5faa\u73af\uff0c\u6c42\u548c\u4e3a \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u9488 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6570\u5927\u5c0f\u7684\u989d\u5916\u7a7a\u95f4\u3002
    • \u975e\u7a33\u5b9a\u6392\u5e8f\uff1a\u5982\u56fe 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u6362\u81f3\u4e0e\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u8fb9\uff0c\u5bfc\u81f4\u4e24\u8005\u7684\u76f8\u5bf9\u987a\u5e8f\u53d1\u751f\u6539\u53d8\u3002

    \u56fe 11-3 \u00a0 \u9009\u62e9\u6392\u5e8f\u975e\u7a33\u5b9a\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u7b97\u6cd5","text":"

    \u6392\u5e8f\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u4e8e\u5bf9\u4e00\u7ec4\u6570\u636e\u6309\u7167\u7279\u5b9a\u987a\u5e8f\u8fdb\u884c\u6392\u5217\u3002\u6392\u5e8f\u7b97\u6cd5\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\uff0c\u56e0\u4e3a\u6709\u5e8f\u6570\u636e\u901a\u5e38\u80fd\u591f\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u627e\u3001\u5206\u6790\u548c\u5904\u7406\u3002

    \u5982\u56fe 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u7b97\u6cd5\u4e2d\u7684\u6570\u636e\u7c7b\u578b\u53ef\u4ee5\u662f\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u6216\u5b57\u7b26\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65ad\u89c4\u5219\u53ef\u6839\u636e\u9700\u6c42\u8bbe\u5b9a\uff0c\u5982\u6570\u5b57\u5927\u5c0f\u3001\u5b57\u7b26 ASCII \u7801\u987a\u5e8f\u6216\u81ea\u5b9a\u4e49\u89c4\u5219\u3002

    \u56fe 11-1 \u00a0 \u6570\u636e\u7c7b\u578b\u548c\u5224\u65ad\u89c4\u5219\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8bc4\u4ef7\u7ef4\u5ea6","text":"

    \u8fd0\u884c\u6548\u7387\uff1a\u6211\u4eec\u671f\u671b\u6392\u5e8f\u7b97\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c3d\u91cf\u4f4e\uff0c\u4e14\u603b\u4f53\u64cd\u4f5c\u6570\u91cf\u8f83\u5c11\uff08\u65f6\u95f4\u590d\u6742\u5ea6\u4e2d\u7684\u5e38\u6570\u9879\u53d8\u5c0f\uff09\u3002\u5bf9\u4e8e\u5927\u6570\u636e\u91cf\u7684\u60c5\u51b5\uff0c\u8fd0\u884c\u6548\u7387\u663e\u5f97\u5c24\u4e3a\u91cd\u8981\u3002

    \u5c31\u5730\u6027\uff1a\u987e\u540d\u601d\u4e49\uff0c\u539f\u5730\u6392\u5e8f\u901a\u8fc7\u5728\u539f\u6570\u7ec4\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\uff0c\u65e0\u987b\u501f\u52a9\u989d\u5916\u7684\u8f85\u52a9\u6570\u7ec4\uff0c\u4ece\u800c\u8282\u7701\u5185\u5b58\u3002\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u6570\u636e\u642c\u8fd0\u64cd\u4f5c\u8f83\u5c11\uff0c\u8fd0\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

    \u7a33\u5b9a\u6027\uff1a\u7a33\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u540e\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u6570\u7ec4\u4e2d\u7684\u76f8\u5bf9\u987a\u5e8f\u4e0d\u53d1\u751f\u6539\u53d8\u3002

    \u7a33\u5b9a\u6392\u5e8f\u662f\u591a\u7ea7\u6392\u5e8f\u573a\u666f\u7684\u5fc5\u8981\u6761\u4ef6\u3002\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u5b58\u50a8\u5b66\u751f\u4fe1\u606f\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u522b\u662f\u59d3\u540d\u548c\u5e74\u9f84\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u975e\u7a33\u5b9a\u6392\u5e8f\u53ef\u80fd\u5bfc\u81f4\u8f93\u5165\u6570\u636e\u7684\u6709\u5e8f\u6027\u4e27\u5931\uff1a

    # \u8f93\u5165\u6570\u636e\u662f\u6309\u7167\u59d3\u540d\u6392\u5e8f\u597d\u7684\n# (name, age)\n  ('A', 19)\n  ('B', 18)\n  ('C', 21)\n  ('D', 19)\n  ('E', 23)\n\n# \u5047\u8bbe\u4f7f\u7528\u975e\u7a33\u5b9a\u6392\u5e8f\u7b97\u6cd5\u6309\u5e74\u9f84\u6392\u5e8f\u5217\u8868\uff0c\n# \u7ed3\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5bf9\u4f4d\u7f6e\u6539\u53d8\uff0c\n# \u8f93\u5165\u6570\u636e\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8d28\u4e22\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

    \u81ea\u9002\u5e94\u6027\uff1a\u81ea\u9002\u5e94\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u53d7\u8f93\u5165\u6570\u636e\u7684\u5f71\u54cd\uff0c\u5373\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u3001\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\u5e76\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

    \u81ea\u9002\u5e94\u6027\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u6765\u8bc4\u4f30\u3002\u5982\u679c\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u5dee\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u8bf4\u660e\u6392\u5e8f\u7b97\u6cd5\u5728\u67d0\u4e9b\u6570\u636e\u4e0b\u6027\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u89c6\u4e3a\u8d1f\u9762\u5c5e\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u4e8e\u5e73\u5747\u65f6\u95f4\u590d\u6742\u5ea6\uff0c\u5219\u88ab\u89c6\u4e3a\u6b63\u9762\u5c5e\u6027\u3002

    \u662f\u5426\u57fa\u4e8e\u6bd4\u8f83\uff1a\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u4f9d\u8d56\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u6765\u5224\u65ad\u5143\u7d20\u7684\u76f8\u5bf9\u987a\u5e8f\uff0c\u4ece\u800c\u6392\u5e8f\u6574\u4e2a\u6570\u7ec4\uff0c\u7406\u8bba\u6700\u4f18\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f83\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f83\u8fd0\u7b97\u7b26\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u53ef\u8fbe \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5bf9\u8f83\u5dee\u3002

    "},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u7b97\u6cd5","text":"

    \u8fd0\u884c\u5feb\u3001\u539f\u5730\u3001\u7a33\u5b9a\u3001\u6b63\u5411\u81ea\u9002\u5e94\u3001\u901a\u7528\u6027\u597d\u3002\u663e\u7136\uff0c\u8fc4\u4eca\u4e3a\u6b62\u5c1a\u672a\u53d1\u73b0\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9009\u62e9\u6392\u5e8f\u7b97\u6cd5\u65f6\uff0c\u9700\u8981\u6839\u636e\u5177\u4f53\u7684\u6570\u636e\u7279\u70b9\u548c\u95ee\u9898\u9700\u6c42\u6765\u51b3\u5b9a\u3002

    \u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u5171\u540c\u5b66\u4e60\u5404\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5e76\u57fa\u4e8e\u4e0a\u8ff0\u8bc4\u4ef7\u7ef4\u5ea6\u5bf9\u5404\u4e2a\u6392\u5e8f\u7b97\u6cd5\u7684\u4f18\u7f3a\u70b9\u8fdb\u884c\u5206\u6790\u3002

    "},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u5192\u6ce1\u6392\u5e8f\u901a\u8fc7\u4ea4\u6362\u76f8\u90bb\u5143\u7d20\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u901a\u8fc7\u6dfb\u52a0\u4e00\u4e2a\u6807\u5fd7\u4f4d\u6765\u5b9e\u73b0\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5192\u6ce1\u6392\u5e8f\u7684\u6700\u4f73\u65f6\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(n)\\) \u3002
    • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f6e\u5c06\u672a\u6392\u5e8f\u533a\u95f4\u5185\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u533a\u95f4\u7684\u6b63\u786e\u4f4d\u7f6e\uff0c\u4ece\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u867d\u7136\u63d2\u5165\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \uff0c\u4f46\u7531\u4e8e\u5355\u5143\u64cd\u4f5c\u76f8\u5bf9\u8f83\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u6570\u636e\u91cf\u7684\u6392\u5e8f\u4efb\u52a1\u4e2d\u975e\u5e38\u53d7\u6b22\u8fce\u3002
    • \u5feb\u901f\u6392\u5e8f\u57fa\u4e8e\u54e8\u5175\u5212\u5206\u64cd\u4f5c\u5b9e\u73b0\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5212\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9009\u53d6\u5230\u6700\u5dee\u7684\u57fa\u51c6\u6570\uff0c\u5bfc\u81f4\u65f6\u95f4\u590d\u6742\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6570\u57fa\u51c6\u6570\u6216\u968f\u673a\u57fa\u51c6\u6570\u53ef\u4ee5\u964d\u4f4e\u8fd9\u79cd\u52a3\u5316\u7684\u6982\u7387\u3002\u5c3e\u9012\u5f52\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u51cf\u5c11\u9012\u5f52\u6df1\u5ea6\uff0c\u5c06\u7a7a\u95f4\u590d\u6742\u5ea6\u4f18\u5316\u5230 \\(O(\\log n)\\) \u3002
    • \u5f52\u5e76\u6392\u5e8f\u5305\u62ec\u5212\u5206\u548c\u5408\u5e76\u4e24\u4e2a\u9636\u6bb5\uff0c\u5178\u578b\u5730\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5f52\u5e76\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u6570\u7ec4\u9700\u8981\u521b\u5efa\u8f85\u52a9\u6570\u7ec4\uff0c\u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u94fe\u8868\u7684\u7a7a\u95f4\u590d\u6742\u5ea6\u53ef\u4ee5\u4f18\u5316\u81f3 \\(O(1)\\) \u3002
    • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u4e2a\u6b65\u9aa4\uff1a\u6570\u636e\u5206\u6876\u3001\u6876\u5185\u6392\u5e8f\u548c\u5408\u5e76\u7ed3\u679c\u3002\u5b83\u540c\u6837\u4f53\u73b0\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9002\u7528\u4e8e\u6570\u636e\u4f53\u91cf\u5f88\u5927\u7684\u60c5\u51b5\u3002\u6876\u6392\u5e8f\u7684\u5173\u952e\u5728\u4e8e\u5bf9\u6570\u636e\u8fdb\u884c\u5e73\u5747\u5206\u914d\u3002
    • \u8ba1\u6570\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u4e2a\u7279\u4f8b\uff0c\u5b83\u901a\u8fc7\u7edf\u8ba1\u6570\u636e\u51fa\u73b0\u7684\u6b21\u6570\u6765\u5b9e\u73b0\u6392\u5e8f\u3002\u8ba1\u6570\u6392\u5e8f\u9002\u7528\u4e8e\u6570\u636e\u91cf\u5927\u4f46\u6570\u636e\u8303\u56f4\u6709\u9650\u7684\u60c5\u51b5\uff0c\u5e76\u4e14\u8981\u6c42\u6570\u636e\u80fd\u591f\u8f6c\u6362\u4e3a\u6b63\u6574\u6570\u3002
    • \u57fa\u6570\u6392\u5e8f\u901a\u8fc7\u9010\u4f4d\u6392\u5e8f\u6765\u5b9e\u73b0\u6570\u636e\u6392\u5e8f\uff0c\u8981\u6c42\u6570\u636e\u80fd\u591f\u8868\u793a\u4e3a\u56fa\u5b9a\u4f4d\u6570\u7684\u6570\u5b57\u3002
    • \u603b\u7684\u6765\u8bf4\uff0c\u6211\u4eec\u5e0c\u671b\u627e\u5230\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a33\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9002\u5e94\u6027\u7b49\u4f18\u70b9\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e00\u6837\uff0c\u6ca1\u6709\u4e00\u79cd\u6392\u5e8f\u7b97\u6cd5\u80fd\u591f\u540c\u65f6\u6ee1\u8db3\u6240\u6709\u8fd9\u4e9b\u6761\u4ef6\u3002\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u6839\u636e\u6570\u636e\u7684\u7279\u6027\u6765\u9009\u62e9\u5408\u9002\u7684\u6392\u5e8f\u7b97\u6cd5\u3002
    • \u56fe 11-19 \u5bf9\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a33\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9002\u5e94\u6027\u7b49\u3002

    \u56fe 11-19 \u00a0 \u6392\u5e8f\u7b97\u6cd5\u5bf9\u6bd4

    "},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6392\u5e8f\u7b97\u6cd5\u7a33\u5b9a\u6027\u5728\u4ec0\u4e48\u60c5\u51b5\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

    \u5728\u73b0\u5b9e\u4e2d\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u57fa\u4e8e\u5bf9\u8c61\u7684\u67d0\u4e2a\u5c5e\u6027\u8fdb\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b66\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u4e24\u4e2a\u5c5e\u6027\uff0c\u6211\u4eec\u5e0c\u671b\u5b9e\u73b0\u4e00\u4e2a\u591a\u7ea7\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u8fdb\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5bf9\u8eab\u9ad8\u8fdb\u884c\u6392\u5e8f\u3002\u7531\u4e8e\u6392\u5e8f\u7b97\u6cd5\u4e0d\u7a33\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

    \u53ef\u4ee5\u53d1\u73b0\uff0c\u5b66\u751f D \u548c C \u7684\u4f4d\u7f6e\u53d1\u751f\u4e86\u4ea4\u6362\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u574f\u4e86\uff0c\u800c\u8fd9\u662f\u6211\u4eec\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

    Q\uff1a\u54e8\u5175\u5212\u5206\u4e2d\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u4e0e\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u7684\u987a\u5e8f\u53ef\u4ee5\u4ea4\u6362\u5417\uff1f

    \u4e0d\u884c\uff0c\u5f53\u6211\u4eec\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u4e3a\u57fa\u51c6\u6570\u65f6\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u53f3\u5f80\u5de6\u67e5\u627e\u201d\u518d\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002\u8fd9\u4e2a\u7ed3\u8bba\u6709\u4e9b\u53cd\u76f4\u89c9\uff0c\u6211\u4eec\u6765\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

    \u54e8\u5175\u5212\u5206 partition() \u7684\u6700\u540e\u4e00\u6b65\u662f\u4ea4\u6362 nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u6362\u540e\uff0c\u57fa\u51c6\u6570\u5de6\u8fb9\u7684\u5143\u7d20\u90fd <= \u57fa\u51c6\u6570\uff0c\u8fd9\u5c31\u8981\u6c42\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u524d nums[left] >= nums[i] \u5fc5\u987b\u6210\u7acb\u3002\u5047\u8bbe\u6211\u4eec\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\uff0c\u90a3\u4e48\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5219\u4f1a\u5728 i == j \u65f6\u8df3\u51fa\u5faa\u73af\uff0c\u6b64\u65f6\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u6b64\u65f6\u6700\u540e\u4e00\u6b65\u4ea4\u6362\u64cd\u4f5c\u4f1a\u628a\u4e00\u4e2a\u6bd4\u57fa\u51c6\u6570\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u6362\u81f3\u6570\u7ec4\u6700\u5de6\u7aef\uff0c\u5bfc\u81f4\u54e8\u5175\u5212\u5206\u5931\u8d25\u3002

    \u4e3e\u4e2a\u4f8b\u5b50\uff0c\u7ed9\u5b9a\u6570\u7ec4 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u4ece\u5de6\u5411\u53f3\u67e5\u627e\u201d\uff0c\u54e8\u5175\u5212\u5206\u540e\u6570\u7ec4\u4e3a [1, 0, 0, 0, 0] \uff0c\u8fd9\u4e2a\u7ed3\u679c\u662f\u4e0d\u6b63\u786e\u7684\u3002

    \u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u4eec\u9009\u62e9 nums[right] \u4e3a\u57fa\u51c6\u6570\uff0c\u90a3\u4e48\u6b63\u597d\u53cd\u8fc7\u6765\uff0c\u5fc5\u987b\u5148\u201c\u4ece\u5de6\u5f80\u53f3\u67e5\u627e\u201d\u3002

    Q\uff1a\u5173\u4e8e\u5c3e\u9012\u5f52\u4f18\u5316\uff0c\u4e3a\u4ec0\u4e48\u9009\u77ed\u7684\u6570\u7ec4\u80fd\u4fdd\u8bc1\u9012\u5f52\u6df1\u5ea6\u4e0d\u8d85\u8fc7 \\(\\log n\\) \uff1f

    \u9012\u5f52\u6df1\u5ea6\u5c31\u662f\u5f53\u524d\u672a\u8fd4\u56de\u7684\u9012\u5f52\u65b9\u6cd5\u7684\u6570\u91cf\u3002\u6bcf\u8f6e\u54e8\u5175\u5212\u5206\u6211\u4eec\u5c06\u539f\u6570\u7ec4\u5212\u5206\u4e3a\u4e24\u4e2a\u5b50\u6570\u7ec4\u3002\u5728\u5c3e\u9012\u5f52\u4f18\u5316\u540e\uff0c\u5411\u4e0b\u9012\u5f52\u7684\u5b50\u6570\u7ec4\u957f\u5ea6\u6700\u5927\u4e3a\u539f\u6570\u7ec4\u957f\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8bbe\u6700\u5dee\u60c5\u51b5\uff0c\u4e00\u76f4\u4e3a\u4e00\u534a\u957f\u5ea6\uff0c\u90a3\u4e48\u6700\u7ec8\u7684\u9012\u5f52\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

    \u56de\u987e\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u4eec\u6709\u53ef\u80fd\u4f1a\u8fde\u7eed\u5730\u9012\u5f52\u957f\u5ea6\u8f83\u5927\u7684\u6570\u7ec4\uff0c\u6700\u5dee\u60c5\u51b5\u4e0b\u4e3a \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u9012\u5f52\u6df1\u5ea6\u4e3a \\(n\\) \u3002\u5c3e\u9012\u5f52\u4f18\u5316\u53ef\u4ee5\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u51fa\u73b0\u3002

    Q\uff1a\u5f53\u6570\u7ec4\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u65f6\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u662f \\(O(n^2)\\) \u5417\uff1f\u8be5\u5982\u4f55\u5904\u7406\u8fd9\u79cd\u9000\u5316\u60c5\u51b5\uff1f

    \u662f\u7684\u3002\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5\uff0c\u53ef\u4ee5\u8003\u8651\u901a\u8fc7\u54e8\u5175\u5212\u5206\u5c06\u6570\u7ec4\u5212\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1a\u5c0f\u4e8e\u3001\u7b49\u4e8e\u3001\u5927\u4e8e\u57fa\u51c6\u6570\u3002\u4ec5\u5411\u4e0b\u9012\u5f52\u5c0f\u4e8e\u548c\u5927\u4e8e\u7684\u4e24\u90e8\u5206\u3002\u5728\u8be5\u65b9\u6cd5\u4e0b\uff0c\u8f93\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u6570\u7ec4\uff0c\u4ec5\u4e00\u8f6e\u54e8\u5175\u5212\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

    Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a\u4ec0\u4e48\u662f \\(O(n^2)\\) \uff1f

    \u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u4e2a\u6876\u4e2d\u3002\u5982\u679c\u6211\u4eec\u91c7\u7528\u4e00\u4e2a \\(O(n^2)\\) \u7b97\u6cd5\u6765\u6392\u5e8f\u8fd9\u4e9b\u5143\u7d20\uff0c\u5219\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^2)\\) \u3002

    "},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u6808\u4e0e\u961f\u5217","text":"

    Abstract

    \u6808\u5982\u540c\u53e0\u732b\u732b\uff0c\u800c\u961f\u5217\u5c31\u50cf\u732b\u732b\u6392\u961f\u3002

    \u4e24\u8005\u5206\u522b\u4ee3\u8868\u5148\u5165\u540e\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u903b\u8f91\u5173\u7cfb\u3002

    "},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 5.1 \u00a0 \u6808
    • 5.2 \u00a0 \u961f\u5217
    • 5.3 \u00a0 \u53cc\u5411\u961f\u5217
    • 5.4 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u53cc\u5411\u961f\u5217","text":"

    \u5728\u961f\u5217\u4e2d\uff0c\u6211\u4eec\u4ec5\u80fd\u5220\u9664\u5934\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u3002\u5982\u56fe 5-7 \u6240\u793a\uff0c\u53cc\u5411\u961f\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u7075\u6d3b\u6027\uff0c\u5141\u8bb8\u5728\u5934\u90e8\u548c\u5c3e\u90e8\u6267\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u6216\u5220\u9664\u64cd\u4f5c\u3002

    \u56fe 5-7 \u00a0 \u53cc\u5411\u961f\u5217\u7684\u64cd\u4f5c

    "},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u53cc\u5411\u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u53cc\u5411\u961f\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u79f0\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002

    \u8868 5-3 \u00a0 \u53cc\u5411\u961f\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push_first() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u9996 \\(O(1)\\) push_last() \u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop_first() \u5220\u9664\u961f\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u5220\u9664\u961f\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 \\(O(1)\\)

    \u540c\u6837\u5730\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u5df2\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\ndeq: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\ndeq.append(2)      # \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # \u6dfb\u52a0\u81f3\u961f\u9996\ndeq.appendleft(1)\n\n# \u8bbf\u95ee\u5143\u7d20\nfront: int = deq[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deq[-1]  # \u961f\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u961f\npop_front: int = deq.popleft()  # \u961f\u9996\u5143\u7d20\u51fa\u961f\npop_rear: int = deq.pop()       # \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deq)\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deq) == 0\n
    deque.cpp
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint front = deque.front(); // \u961f\u9996\u5143\u7d20\nint back = deque.back();   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.pop_front();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.pop_back();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = deque.empty();\n
    deque.java
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.pollFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.pollLast();    // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
    deque.cs
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c06\u94fe\u8868 LinkedList \u770b\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.AddLast(2);   // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.AddFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u961f\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.RemoveFirst();  // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.RemoveLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.Count == 0;\n
    deque_test.go
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.PushBack(2)      // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.PushFront(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nfront := deque.Front() // \u961f\u9996\u5143\u7d20\nrear := deque.Back()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\ndeque.Remove(front)    // \u961f\u9996\u5143\u7d20\u51fa\u961f\ndeque.Remove(rear)     // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := deque.Len() == 0\n
    deque.swift
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u5411\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u53cc\u5411\u961f\u5217\u6765\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.append(2) // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.insert(1, at: 0)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nlet peekFirst = deque.first! // \u961f\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u4f7f\u7528 Array \u6a21\u62df\u65f6 popFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet popFirst = deque.removeFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nlet popLast = deque.removeLast() // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = deque.isEmpty\n
    deque.js
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty = size === 0;\n
    deque.ts
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cunshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cshift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst isEmpty: boolean = size === 0;\n
    deque.dart
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u4e49\u4e3a\u53cc\u5411\u961f\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.addLast(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.addFirst(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nint peekFirst = deque.first; // \u961f\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nint popFirst = deque.removeFirst(); // \u961f\u9996\u5143\u7d20\u51fa\u961f\nint popLast = deque.removeLast();   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = deque.isEmpty;\n
    deque.rs
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(2);  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.push_front(1);\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u961f\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u961f\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop_front) = deque.pop_front() { // \u961f\u9996\u5143\u7d20\u51fa\u961f\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
    deque.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u53cc\u5411\u961f\u5217\n
    deque.kt
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.offerLast(2)  // \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.offerFirst(1)\n\n/* \u8bbf\u95ee\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u961f\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u961f\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u961f */\nval popFirst = deque.pollFirst() // \u961f\u9996\u5143\u7d20\u51fa\u961f\nval popLast = deque.pollLast()   // \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = deque.isEmpty()\n
    deque.rb
    # \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217\n# Ruby \u6ca1\u6709\u5185\u76f4\u7684\u53cc\u7aef\u961f\u5217\uff0c\u53ea\u80fd\u628a Array \u5f53\u4f5c\u53cc\u7aef\u961f\u5217\u6765\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u961f\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#unshift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8bbf\u95ee\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u961f\n# \u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0c Array#shift \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize = deque.length\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = size.zero?\n
    deque.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u53cc\u5411\u961f\u5217\u5b9e\u73b0 *","text":"

    \u53cc\u5411\u961f\u5217\u7684\u5b9e\u73b0\u4e0e\u961f\u5217\u7c7b\u4f3c\uff0c\u53ef\u4ee5\u9009\u62e9\u94fe\u8868\u6216\u6570\u7ec4\u4f5c\u4e3a\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

    "},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u7684\u5b9e\u73b0","text":"

    \u56de\u987e\u4e0a\u4e00\u8282\u5185\u5bb9\uff0c\u6211\u4eec\u4f7f\u7528\u666e\u901a\u5355\u5411\u94fe\u8868\u6765\u5b9e\u73b0\u961f\u5217\uff0c\u56e0\u4e3a\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u5220\u9664\u5934\u8282\u70b9\uff08\u5bf9\u5e94\u51fa\u961f\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0\u65b0\u8282\u70b9\uff08\u5bf9\u5e94\u5165\u961f\u64cd\u4f5c\uff09\u3002

    \u5bf9\u4e8e\u53cc\u5411\u961f\u5217\u800c\u8a00\uff0c\u5934\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u6267\u884c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u53cc\u5411\u961f\u5217\u9700\u8981\u5b9e\u73b0\u53e6\u4e00\u4e2a\u5bf9\u79f0\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u91c7\u7528\u201c\u53cc\u5411\u94fe\u8868\u201d\u4f5c\u4e3a\u53cc\u5411\u961f\u5217\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002

    \u5982\u56fe 5-8 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u53cc\u5411\u94fe\u8868\u7684\u5934\u8282\u70b9\u548c\u5c3e\u8282\u70b9\u89c6\u4e3a\u53cc\u5411\u961f\u5217\u7684\u961f\u9996\u548c\u961f\u5c3e\uff0c\u540c\u65f6\u5b9e\u73b0\u5728\u4e24\u7aef\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u7684\u529f\u80fd\u3002

    LinkedListDequepush_last()push_first()pop_last()pop_first()

    \u56fe 5-8 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
    class ListNode:\n    \"\"\"\u53cc\u5411\u94fe\u8868\u8282\u70b9\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0  # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u961f\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        elif is_front:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else:\n            # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size += 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u961f\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u6682\u5b58\u5934\u8282\u70b9\u503c\n            # \u5220\u9664\u5934\u8282\u70b9\n            fnext: ListNode | None = self._front.next\n            if fnext != None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u66f4\u65b0\u5934\u8282\u70b9\n        # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            # \u5220\u9664\u5c3e\u8282\u70b9\n            rprev: ListNode | None = self._rear.prev\n            if rprev != None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u66f4\u65b0\u5c3e\u8282\u70b9\n        self._size -= 1  # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
    linkedlist_deque.cpp
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nstruct DoublyListNode {\n    int val;              // \u8282\u70b9\u503c\n    DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\u6307\u9488\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize = 0;              // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u6784\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_deque.java
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    int val; // \u8282\u70b9\u503c\n    ListNode next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    ListNode prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_deque.cs
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(int val) {\n    public int val = val;       // \u8282\u70b9\u503c\n    public ListNode? next = null; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u5934\u8282\u70b9 front, \u5c3e\u8282\u70b9 rear\n    int queSize = 0;      // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u5934\u8282\u70b9                           \n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n\n        queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
    linkedlist_deque.go
    /* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u53cc\u7aef\u961f\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u961f\u9996\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u5165\u961f */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u961f\u9996\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u961f\u5c3e\u5143\u7d20\u51fa\u961f */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
    linkedlist_deque.swift
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    var val: Int // \u8282\u70b9\u503c\n    var next: ListNode? // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u5934\u8282\u70b9 front\n    private var rear: ListNode? // \u5c3e\u8282\u70b9 rear\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        else if isFront {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size += 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        let val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            val = rear!.val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        _size -= 1 // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_deque.js
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val; // \u8282\u70b9\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    #front; // \u5934\u8282\u70b9 front\n    #rear; // \u5c3e\u8282\u70b9 rear\n    #queSize; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
    linkedlist_deque.ts
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a71\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    next: ListNode; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528 (\u6307\u9488)\n    val: number; // \u8282\u70b9\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u5934\u8282\u70b9 front\n    private rear: ListNode; // \u5c3e\u8282\u70b9 rear\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u5165\u961f\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n        }\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5c3e\u8282\u70b9\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u66f4\u65b0\u5c3e\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u961f\u9996\u51fa\u961f\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5b58\u50a8\u5c3e\u8282\u70b9\u503c\n        // \u5220\u9664\u5934\u8282\u70b9\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u66f4\u65b0\u5934\u8282\u70b9\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u6253\u5370\u53cc\u5411\u961f\u5217 */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
    linkedlist_deque.dart
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode {\n  int val; // \u8282\u70b9\u503c\n  ListNode? next; // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  ListNode? prev; // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u5bf9\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u5934\u8282\u70b9 _front\n  late ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u957f\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u961f\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n      // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u961f\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n      val = _front!.val; // \u6682\u5b58\u5934\u8282\u70b9\u503c\n      // \u5220\u9664\u5934\u8282\u70b9\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    } else {\n      // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n      val = _rear!.val; // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      // \u5220\u9664\u5c3e\u8282\u70b9\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    _queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
    linkedlist_deque.rs
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\npub struct ListNode<T> {\n    pub val: T,                                 // \u8282\u70b9\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a71\u8282\u70b9\u6307\u9488\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u66f4\u65b0\u5934\u8282\u70b9\n                }\n            }\n        }\n        // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u961f\u5217\u4e3a\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u66f4\u65b0\u5934\u8282\u70b9\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u66f4\u65b0\u5c3e\u8282\u70b9\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
    linkedlist_deque.c
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\ntypedef struct DoublyListNode {\n    int val;                     // \u8282\u70b9\u503c\n    struct DoublyListNode *next; // \u540e\u7ee7\u8282\u70b9\n    struct DoublyListNode *prev; // \u524d\u9a71\u8282\u70b9\n} DoublyListNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;                  // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n} LinkedListDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e deque \u7ed3\u6784\u4f53\n    free(deque);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else {\n        // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u6682\u5b58\u5934\u8282\u70b9\u503c\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u66f4\u65b0\u5934\u8282\u70b9\n    }\n    // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u66f4\u65b0\u5c3e\u8282\u70b9\n    }\n    deque->queSize--; // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    return val;\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
    linkedlist_deque.kt
    /* \u53cc\u5411\u94fe\u8868\u8282\u70b9 */\nclass ListNode(var _val: Int) {\n    // \u8282\u70b9\u503c\n    var next: ListNode? = null // \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a71\u8282\u70b9\u5f15\u7528\n}\n\n/* \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u5934\u8282\u70b9 front\n    private var rear: ListNode? = null // \u5c3e\u8282\u70b9 rear\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n        } else {\n            // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize++ // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u961f\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u6682\u5b58\u5934\u8282\u70b9\u503c\n            // \u5220\u9664\u5934\u8282\u70b9\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n            // \u5220\u9664\u5c3e\u8282\u70b9\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u8282\u70b9\n        }\n        queSize-- // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        return _val\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_deque.rb
    =begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n### \u53cc\u5411\u94fe\u8868\u8282\u70b9\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u540e\u7ee7\u8282\u70b9\u5f15\u7528\n  attr_accessor :prev # \u524d\u8eaf\u8282\u70b9\u5f15\u7528\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass LinkedListDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0     # \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c \u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u961f\u9996\u5165\u961f\u64cd\u4f5c\n    elsif is_front\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n    else\n      # \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size += 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u961f\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u6682\u5b58\u5934\u8282\u70b9\u503c\n      # \u5220\u9664\u5934\u8282\u70b9\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u5934\u8282\u70b9\n    # \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n    else\n      val = @rear.val # \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n      # \u5220\u9664\u5c3e\u8282\u70b9\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u8282\u70b9\n    end\n    @size -= 1 # \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n\n    val\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
    linkedlist_deque.zig
    // \u53cc\u5411\u94fe\u8868\u8282\u70b9\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u8282\u70b9\u503c\n        next: ?*Self = null,    // \u540e\u7ee7\u8282\u70b9\u6307\u9488\n        prev: ?*Self = null,    // \u524d\u9a71\u8282\u70b9\u6307\u9488\n\n        // Initialize a list node with specific value\n        pub fn init(self: *Self, x: i32) void {\n            self.val = x;\n            self.next = null;\n            self.prev = null;\n        }\n    };\n}\n\n// \u57fa\u4e8e\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u5934\u8282\u70b9 front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                             // \u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u961f\u64cd\u4f5c\n        pub fn push(self: *Self, num: T, is_front: bool) !void {\n            var node = try self.mem_allocator.create(ListNode(T));\n            node.init(num);\n            // \u82e5\u94fe\u8868\u4e3a\u7a7a\uff0c\u5219\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u961f\u9996\u5165\u961f\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5934\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u5165\u961f\u64cd\u4f5c\n            } else {\n                // \u5c06 node \u6dfb\u52a0\u81f3\u94fe\u8868\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n        } \n\n        // \u961f\u9996\u5165\u961f\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u961f\u5c3e\u5165\u961f\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u961f\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            var val: T = undefined;\n            // \u961f\u9996\u51fa\u961f\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u6682\u5b58\u5934\u8282\u70b9\u503c\n                // \u5220\u9664\u5934\u8282\u70b9\n                var fNext = self.front.?.next;\n                if (fNext != null) {\n                    fNext.?.prev = null;\n                    self.front.?.next = null;\n                }\n                self.front = fNext;         // \u66f4\u65b0\u5934\u8282\u70b9\n            // \u961f\u5c3e\u51fa\u961f\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u6682\u5b58\u5c3e\u8282\u70b9\u503c\n                // \u5220\u9664\u5c3e\u8282\u70b9\n                var rPrev = self.rear.?.prev;\n                if (rPrev != null) {\n                    rPrev.?.next = null;\n                    self.rear.?.prev = null;\n                }\n                self.rear = rPrev;          // \u66f4\u65b0\u5c3e\u8282\u70b9\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u961f\u5217\u957f\u5ea6\n            return val;\n        } \n\n        // \u961f\u9996\u51fa\u961f\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u961f\u5c3e\u51fa\u961f\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
    "},{"location":"chapter_stack_and_queue/deque/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

    \u5982\u56fe 5-9 \u6240\u793a\uff0c\u4e0e\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7c7b\u4f3c\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528\u73af\u5f62\u6570\u7ec4\u6765\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u3002

    ArrayDequepush_last()push_first()pop_last()pop_first()

    \u56fe 5-9 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u53cc\u5411\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u5728\u961f\u5217\u7684\u5b9e\u73b0\u57fa\u7840\u4e0a\uff0c\u4ec5\u9700\u589e\u52a0\u201c\u961f\u9996\u5165\u961f\u201d\u548c\u201c\u961f\u5c3e\u51fa\u961f\u201d\u7684\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
    class ArrayDeque:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15\"\"\"\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u961f\u9996\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u961f\u5c3e\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u961f\u9996\u51fa\u961f\"\"\"\n        num = self.peek_first()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u961f\u5c3e\u51fa\u961f\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370\"\"\"\n        # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
    array_deque.cpp
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;      // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
    array_deque.java
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private int index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.cs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    int Index(int i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.go
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u961f\u9996\u5165\u961f */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u961f\u9996\u51fa\u961f */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    if num == nil {\n        return nil\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    if num == nil {\n        return nil\n    }\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
    array_deque.swift
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        }\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
    array_deque.js
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i) {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.ts
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    index(i: number): number {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u53cc\u5411\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.dart
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n  int index(int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u961f\u9996\u5165\u961f */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 _front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u5c3e\u5165\u961f */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u961f\u9996\u51fa\u961f */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u961f\u9996\u6307\u9488\u5411\u53f3\u79fb\u52a8\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u961f\u5c3e\u51fa\u961f */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\");\n    }\n    // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
    array_deque.rs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: usize,    // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: usize, // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![0; capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\")\n        };\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        let mut res = vec![0; self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
    array_deque.c
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u56de\u5230\u5934\u90e8\n    // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u961f\u9996\u5165\u961f */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c06 num \u6dfb\u52a0\u5230\u961f\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u961f\u5c3e\u5165\u961f */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8bbf\u95ee\u5f02\u5e38\uff1a\u53cc\u5411\u961f\u5217\u4e3a\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u961f\u9996\u51fa\u961f */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u961f\u5c3e\u51fa\u961f */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
    array_deque.kt
    /* \u6784\u9020\u65b9\u6cd5 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u53cc\u5411\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u53cc\u5411\u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n        // \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u961f\u9996\u5165\u961f */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u961f\u5c3e\u5165\u961f */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u53cc\u5411\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u961f\u9996\u51fa\u961f */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u961f\u5c3e\u51fa\u961f */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
    array_deque.rb
    ### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u53cc\u5411\u961f\u5217 ###\nclass ArrayDeque\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u961f\u9996\u5165\u961f ###\n  def push_first(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u961f\u9996\u6307\u9488\u5411\u5de6\u79fb\u52a8\u4e00\u4f4d\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 front \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u961f\u5c3e\u5165\u961f ###\n  def push_last(num)\n    if size == capacity\n      puts '\u53cc\u5411\u961f\u5217\u5df2\u6ee1'\n      return\n    end\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u961f\u9996\u51fa\u961f ###\n  def pop_first\n    num = peek_first\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u961f\u5c3e\u51fa\u961f ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8bbf\u95ee\u961f\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u53cc\u5411\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    # \u8ba1\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u6570\u7ec4\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    # \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  ### \u8ba1\u7b97\u73af\u5f62\u6570\u7ec4\u7d22\u5f15 ###\n  def index(i)\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0\u6570\u7ec4\u9996\u5c3e\u76f8\u8fde\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\uff0c\u56de\u5230\u5934\u90e8\n    # \u5f53 i \u8d8a\u8fc7\u6570\u7ec4\u5934\u90e8\u540e\uff0c\u56de\u5230\u5c3e\u90e8\n    (i + capacity) % capacity\n  end\nend\n
    array_deque.zig
    [class]{ArrayDeque}-[func]{}\n
    "},{"location":"chapter_stack_and_queue/deque/#533","title":"5.3.3 \u00a0 \u53cc\u5411\u961f\u5217\u5e94\u7528","text":"

    \u53cc\u5411\u961f\u5217\u517c\u5177\u6808\u4e0e\u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5b9e\u73b0\u8fd9\u4e24\u8005\u7684\u6240\u6709\u5e94\u7528\u573a\u666f\uff0c\u540c\u65f6\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

    \u6211\u4eec\u77e5\u9053\uff0c\u8f6f\u4ef6\u7684\u201c\u64a4\u9500\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u6808\u6765\u5b9e\u73b0\uff1a\u7cfb\u7edf\u5c06\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u6808\u4e2d\uff0c\u7136\u540e\u901a\u8fc7 pop \u5b9e\u73b0\u64a4\u9500\u3002\u7136\u800c\uff0c\u8003\u8651\u5230\u7cfb\u7edf\u8d44\u6e90\u7684\u9650\u5236\uff0c\u8f6f\u4ef6\u901a\u5e38\u4f1a\u9650\u5236\u64a4\u9500\u7684\u6b65\u6570\uff08\u4f8b\u5982\u4ec5\u5141\u8bb8\u4fdd\u5b58 \\(50\\) \u6b65\uff09\u3002\u5f53\u6808\u7684\u957f\u5ea6\u8d85\u8fc7 \\(50\\) \u65f6\uff0c\u8f6f\u4ef6\u9700\u8981\u5728\u6808\u5e95\uff08\u961f\u9996\uff09\u6267\u884c\u5220\u9664\u64cd\u4f5c\u3002\u4f46\u6808\u65e0\u6cd5\u5b9e\u73b0\u8be5\u529f\u80fd\uff0c\u6b64\u65f6\u5c31\u9700\u8981\u4f7f\u7528\u53cc\u5411\u961f\u5217\u6765\u66ff\u4ee3\u6808\u3002\u8bf7\u6ce8\u610f\uff0c\u201c\u64a4\u9500\u201d\u7684\u6838\u5fc3\u903b\u8f91\u4ecd\u7136\u9075\u5faa\u6808\u7684\u5148\u5165\u540e\u51fa\u539f\u5219\uff0c\u53ea\u662f\u53cc\u5411\u961f\u5217\u80fd\u591f\u66f4\u52a0\u7075\u6d3b\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u903b\u8f91\u3002

    "},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u961f\u5217","text":"

    \u961f\u5217\uff08queue\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u89c4\u5219\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002\u987e\u540d\u601d\u4e49\uff0c\u961f\u5217\u6a21\u62df\u4e86\u6392\u961f\u73b0\u8c61\uff0c\u5373\u65b0\u6765\u7684\u4eba\u4e0d\u65ad\u52a0\u5165\u961f\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u4e8e\u961f\u5217\u5934\u90e8\u7684\u4eba\u9010\u4e2a\u79bb\u5f00\u3002

    \u5982\u56fe 5-4 \u6240\u793a\uff0c\u6211\u4eec\u5c06\u961f\u5217\u5934\u90e8\u79f0\u4e3a\u201c\u961f\u9996\u201d\uff0c\u5c3e\u90e8\u79f0\u4e3a\u201c\u961f\u5c3e\u201d\uff0c\u5c06\u628a\u5143\u7d20\u52a0\u5165\u961f\u5c3e\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u5165\u961f\u201d\uff0c\u5220\u9664\u961f\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u79f0\u4e3a\u201c\u51fa\u961f\u201d\u3002

    \u56fe 5-4 \u00a0 \u961f\u5217\u7684\u5148\u5165\u5148\u51fa\u89c4\u5219

    "},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u961f\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u961f\u5217\u7684\u5e38\u89c1\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7f16\u7a0b\u8bed\u8a00\u7684\u65b9\u6cd5\u540d\u79f0\u53ef\u80fd\u4f1a\u6709\u6240\u4e0d\u540c\u3002\u6211\u4eec\u5728\u6b64\u91c7\u7528\u4e0e\u6808\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

    \u8868 5-2 \u00a0 \u961f\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u961f\uff0c\u5373\u5c06\u5143\u7d20\u6dfb\u52a0\u81f3\u961f\u5c3e \\(O(1)\\) pop() \u961f\u9996\u5143\u7d20\u51fa\u961f \\(O(1)\\) peek() \u8bbf\u95ee\u961f\u9996\u5143\u7d20 \\(O(1)\\)

    \u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u4e2d\u73b0\u6210\u7684\u961f\u5217\u7c7b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u961f\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u4eec\u4e00\u822c\u5c06\u53cc\u5411\u961f\u5217\u7c7b deque \u5f53\u4f5c\u961f\u5217\u4f7f\u7528\n# \u867d\u7136 queue.Queue() \u662f\u7eaf\u6b63\u7684\u961f\u5217\u7c7b\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u8350\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8bbf\u95ee\u961f\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u961f\npop: int = que.popleft()\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(que)\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(que) == 0\n
    queue.cpp
    /* \u521d\u59cb\u5316\u961f\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u961f */\nqueue.pop();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty = queue.empty();\n
    queue.java
    /* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.poll();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
    queue.cs
    /* \u521d\u59cb\u5316\u961f\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.Dequeue();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.Count == 0;\n
    queue_test.go
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c06 list \u4f5c\u4e3a\u961f\u5217\u6765\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u961f */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nisEmpty := queue.Len() == 0\n
    queue.swift
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u7531\u4e8e\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 removeFirst \u7684\u590d\u6742\u5ea6\u4e3a O(n)\nlet pool = queue.removeFirst()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = queue.isEmpty\n
    queue.js
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
    queue.ts
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u961f\u5217\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u961f */\n// \u5e95\u5c42\u662f\u6570\u7ec4\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\nconst pop = queue.shift();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nconst empty = queue.length === 0;\n
    queue.dart
    /* \u521d\u59cb\u5316\u961f\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u961f\u5217\u7c7b Qeque \u662f\u53cc\u5411\u961f\u5217\uff0c\u4e5f\u53ef\u4f5c\u4e3a\u961f\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u961f */\nint pop = queue.removeFirst();\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = queue.isEmpty;\n
    queue.rs
    /* \u521d\u59cb\u5316\u53cc\u5411\u961f\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u53cc\u5411\u961f\u5217\u4f5c\u4e3a\u666e\u901a\u961f\u5217\u6765\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u961f */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u961f */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = deque.is_empty();\n
    queue.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u961f\u5217\n
    queue.kt
    /* \u521d\u59cb\u5316\u961f\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u961f */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u961f */\nval pop = queue.poll()\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = queue.isEmpty()\n
    queue.rb
    # \u521d\u59cb\u5316\u961f\u5217\n# Ruby \u5185\u7f6e\u7684\u961f\u5217\uff08Thread::Queue) \u6ca1\u6709 peek \u548c\u904d\u5386\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u961f\u5217\u6765\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u961f\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8bbf\u95ee\u961f\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u961f\n# \u6e05\u6ce8\u610f\uff0c\u7531\u4e8e\u662f\u6570\u7ec4\uff0cArray#shift \u65b9\u6cd5\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a O(n)\npop = queue.shift\n\n# \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\nsize = queue.length\n\n# \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty = queue.empty?\n
    queue.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u961f\u5217\u5b9e\u73b0","text":"

    \u4e3a\u4e86\u5b9e\u73b0\u961f\u5217\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u6dfb\u52a0\u5143\u7d20\uff0c\u5e76\u5728\u53e6\u4e00\u7aef\u5220\u9664\u5143\u7d20\uff0c\u94fe\u8868\u548c\u6570\u7ec4\u90fd\u7b26\u5408\u8981\u6c42\u3002

    "},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

    \u5982\u56fe 5-5 \u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u201c\u5934\u8282\u70b9\u201d\u548c\u201c\u5c3e\u8282\u70b9\u201d\u5206\u522b\u89c6\u4e3a\u201c\u961f\u9996\u201d\u548c\u201c\u961f\u5c3e\u201d\uff0c\u89c4\u5b9a\u961f\u5c3e\u4ec5\u53ef\u6dfb\u52a0\u8282\u70b9\uff0c\u961f\u9996\u4ec5\u53ef\u5220\u9664\u8282\u70b9\u3002

    LinkedListQueuepush()pop()

    \u56fe 5-5 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u7528\u94fe\u8868\u5b9e\u73b0\u961f\u5217\u7684\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
    class LinkedListQueue:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._front: ListNode | None = None  # \u5934\u8282\u70b9 front\n        self._rear: ListNode | None = None  # \u5c3e\u8282\u70b9 rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        node = ListNode(num)\n        # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num = self.peek()\n        # \u5220\u9664\u5934\u8282\u70b9\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
    linkedlist_queue.cpp
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_queue.java
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.cs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        ListNode node = new(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.go
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u961f\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u961f */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u961f */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
    linkedlist_queue.swift
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u5934\u8282\u70b9\n    private var rear: ListNode? // \u5c3e\u8282\u70b9\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_queue.js
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    #front; // \u5934\u8282\u70b9 #front\n    #rear; // \u5c3e\u8282\u70b9 #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.ts
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u5934\u8282\u70b9 front\n    private rear: ListNode | null; // \u5c3e\u8282\u70b9 rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        const node = new ListNode(num);\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        // \u5220\u9664\u5934\u8282\u70b9\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.dart
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u5934\u8282\u70b9 _front\n  ListNode? _rear; // \u5c3e\u8282\u70b9 _rear\n  int _queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    final int _num = peek();\n    // \u5220\u9664\u5934\u8282\u70b9\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u961f\u5217\u4e3a\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
    linkedlist_queue.rs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u5934\u8282\u70b9 front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u8282\u70b9 rear\n    que_size: usize,                         // \u961f\u5217\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u961f */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.insert(0, node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
    linkedlist_queue.c
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91ca\u653e\u6240\u6709\u8282\u70b9\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91ca\u653e queue \u7ed3\u6784\u4f53\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u961f */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u8282\u70b9\u5904\u6dfb\u52a0 node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u961f */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u6253\u5370\u961f\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u62f7\u8d1d\u94fe\u8868\u4e2d\u7684\u6570\u636e\u5230\u6570\u7ec4\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
    linkedlist_queue.kt
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217 */\nclass LinkedListQueue(\n    // \u5934\u8282\u70b9 front \uff0c\u5c3e\u8282\u70b9 rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n        val node = ListNode(num)\n        // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u5220\u9664\u5934\u8282\u70b9\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_queue.rb
    ### \u57fa\u4e8e\u94fe\u8868\u5934\u73b0\u7684\u961f\u5217 ###\nclass LinkedListQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @front = nil  # \u5934\u8282\u70b9 front\n    @rear = nil   # \u5c3e\u8282\u70b9 rear\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    # \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\uff0c\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u4ee4\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u5220\u9664\u5934\u8282\u70b9\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c06\u94fe\u8868\u4e3a Array \u5e76\u8fd4\u56de ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
    linkedlist_queue.zig
    // \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u961f\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u5934\u8282\u70b9 front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u8282\u70b9 rear\n        que_size: usize = 0,                            // \u961f\u5217\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u961f\u5217\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.front = null;\n            self.rear = null;\n            self.que_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u961f\u5217\u4e3a\u7a7a\uff0c\u5219\u4ee4\u5934\u3001\u5c3e\u8282\u70b9\u90fd\u6307\u5411\u8be5\u8282\u70b9\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u961f\u5217\u4e0d\u4e3a\u7a7a\uff0c\u5219\u5c06\u8be5\u8282\u70b9\u6dfb\u52a0\u5230\u5c3e\u8282\u70b9\u540e\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u5220\u9664\u5934\u8282\u70b9\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u94fe\u8868\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.front;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[i] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

    \u5728\u6570\u7ec4\u4e2d\u5220\u9664\u9996\u5143\u7d20\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff0c\u8fd9\u4f1a\u5bfc\u81f4\u51fa\u961f\u64cd\u4f5c\u6548\u7387\u8f83\u4f4e\u3002\u7136\u800c\uff0c\u6211\u4eec\u53ef\u4ee5\u91c7\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u6765\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\u3002

    \u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u53d8\u91cf front \u6307\u5411\u961f\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u5e76\u7ef4\u62a4\u4e00\u4e2a\u53d8\u91cf size \u7528\u4e8e\u8bb0\u5f55\u961f\u5217\u957f\u5ea6\u3002\u5b9a\u4e49 rear = front + size \uff0c\u8fd9\u4e2a\u516c\u5f0f\u8ba1\u7b97\u51fa\u7684 rear \u6307\u5411\u961f\u5c3e\u5143\u7d20\u4e4b\u540e\u7684\u4e0b\u4e00\u4e2a\u4f4d\u7f6e\u3002

    \u57fa\u4e8e\u6b64\u8bbe\u8ba1\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u533a\u95f4\u4e3a [front, rear - 1]\uff0c\u5404\u79cd\u64cd\u4f5c\u7684\u5b9e\u73b0\u65b9\u6cd5\u5982\u56fe 5-6 \u6240\u793a\u3002

    • \u5165\u961f\u64cd\u4f5c\uff1a\u5c06\u8f93\u5165\u5143\u7d20\u8d4b\u503c\u7ed9 rear \u7d22\u5f15\u5904\uff0c\u5e76\u5c06 size \u589e\u52a0 1 \u3002
    • \u51fa\u961f\u64cd\u4f5c\uff1a\u53ea\u9700\u5c06 front \u589e\u52a0 1 \uff0c\u5e76\u5c06 size \u51cf\u5c11 1 \u3002

    \u53ef\u4ee5\u770b\u5230\uff0c\u5165\u961f\u548c\u51fa\u961f\u64cd\u4f5c\u90fd\u53ea\u9700\u8fdb\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(1)\\) \u3002

    ArrayQueuepush()pop()

    \u56fe 5-6 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u961f\u5217\u7684\u5165\u961f\u51fa\u961f\u64cd\u4f5c

    \u4f60\u53ef\u80fd\u4f1a\u53d1\u73b0\u4e00\u4e2a\u95ee\u9898\uff1a\u5728\u4e0d\u65ad\u8fdb\u884c\u5165\u961f\u548c\u51fa\u961f\u7684\u8fc7\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52a8\uff0c\u5f53\u5b83\u4eec\u5230\u8fbe\u6570\u7ec4\u5c3e\u90e8\u65f6\u5c31\u65e0\u6cd5\u7ee7\u7eed\u79fb\u52a8\u4e86\u3002\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u89c6\u4e3a\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u73af\u5f62\u6570\u7ec4\u201d\u3002

    \u5bf9\u4e8e\u73af\u5f62\u6570\u7ec4\uff0c\u6211\u4eec\u9700\u8981\u8ba9 front \u6216 rear \u5728\u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u65f6\uff0c\u76f4\u63a5\u56de\u5230\u6570\u7ec4\u5934\u90e8\u7ee7\u7eed\u904d\u5386\u3002\u8fd9\u79cd\u5468\u671f\u6027\u89c4\u5f8b\u53ef\u4ee5\u901a\u8fc7\u201c\u53d6\u4f59\u64cd\u4f5c\u201d\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
    class ArrayQueue:\n    \"\"\"\u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n        self._front: int = 0  # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        self._size: int = 0  # \u961f\u5217\u957f\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u961f\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u961f\u5217\u5df2\u6ee1\")\n        # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u961f\"\"\"\n        num: int = self.peek()\n        # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u961f\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u961f\u5217\u4e3a\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
    array_queue.cpp
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u961f\u5217\u957f\u5ea6\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u961f */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u961f\u5217\u5df2\u6ee1\" << endl;\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u961f\u5217\u4e3a\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c06\u6570\u7ec4\u8f6c\u5316\u4e3a Vector \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
    array_queue.java
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private int front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int pop() {\n        int num = peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
    array_queue.cs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize; // \u961f\u5217\u957f\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u961f */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u961f */\n    public int Pop() {\n        int num = Peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    public int[] ToArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
    array_queue.go
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front       int   // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    queSize     int   // \u961f\u5217\u957f\u5ea6\n    queCapacity int   // \u961f\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7eb3\u5143\u7d20\u6570\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u961f\u5217 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u961f */\nfunc (q *arrayQueue) push(num int) {\n    // \u5f53 rear == queCapacity \u8868\u793a\u961f\u5217\u5df2\u6ee1\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u961f */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    if num == nil {\n        return nil\n    }\n\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
    array_queue.swift
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var _size: Int // \u961f\u5217\u957f\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u6570\u7ec4\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u961f */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u961f */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u961f\u5217\u4e3a\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    func toArray() -> [Int] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
    array_queue.js
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    #front = 0; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    #queSize = 0; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop() {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
    array_queue.ts
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private front: number; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private queSize: number; // \u961f\u5217\u957f\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u961f */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u961f\u5217\u5df2\u6ee1');\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u961f */\n    pop(): number {\n        const num = this.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u961f\u5217\u4e3a\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
    array_queue.dart
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u4e8e\u50a8\u5b58\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n  late int _front; // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n  late int _queSize; // \u961f\u5217\u957f\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u961f */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u961f\u5217\u5df2\u6ee1\");\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c06 _num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u961f */\n  int pop() {\n    int _num = peek();\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u961f\u5217\u4e3a\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
    array_queue.rs
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    front: i32,        // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    que_size: i32,     // \u961f\u5217\u957f\u5ea6\n    que_capacity: i32, // \u961f\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(capacity: i32) -> ArrayQueue {\n        ArrayQueue {\n            nums: vec![0; capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u961f */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u961f\u5217\u5df2\u6ee1\");\n            return;\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u961f */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fn peek(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fn to_vector(&self) -> Vec<i32> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![0; self.que_size as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
    array_queue.c
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    int front;       // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n    int queCapacity; // \u961f\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u6570\u7ec4\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u961f */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u961f\u5217\u5df2\u6ee1\\r\\n\");\n        return;\n    }\n    // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u961f */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
    array_queue.kt
    /* \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    private var front: Int = 0 // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u961f\u5217\u957f\u5ea6\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u961f */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u961f\u5217\u5df2\u6ee1\")\n            return\n        }\n        // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n        // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u961f */\n    fun pop(): Int {\n        val num = peek()\n        // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u961f\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u6570\u7ec4 */\n    fun toArray(): IntArray {\n        // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
    array_queue.rb
    ### \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217 ###\nclass ArrayQueue\n  ### \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6 ###\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4\n    @front = 0 # \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n    @size = 0 # \u961f\u5217\u957f\u5ea6\n  end\n\n  ### \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u961f ###\n  def push(num)\n    raise IndexError, '\u961f\u5217\u5df2\u6ee1' if size == capacity\n\n    # \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n    # \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n    rear = (@front + size) % capacity\n    # \u5c06 num \u6dfb\u52a0\u81f3\u961f\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u961f ###\n  def pop\n    num = peek\n    # \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u961f\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u961f\u5217\u4e3a\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
    array_queue.zig
    // \u57fa\u4e8e\u73af\u5f62\u6570\u7ec4\u5b9e\u73b0\u7684\u961f\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u4e8e\u5b58\u50a8\u961f\u5217\u5143\u7d20\u7684\u6570\u7ec4     \n        cap: usize = 0,                                 // \u961f\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u961f\u9996\u6307\u9488\uff0c\u6307\u5411\u961f\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6570\u7ec4\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator, cap: usize) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.cap = cap;\n            self.nums = try self.mem_allocator.alloc(T, self.cap);\n            @memset(self.nums, @as(T, 0));\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u83b7\u53d6\u961f\u5217\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65ad\u961f\u5217\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u961f\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u961f\u5217\u5df2\u6ee1\\n\", .{});\n                return;\n            }\n            // \u8ba1\u7b97\u961f\u5c3e\u6307\u9488\uff0c\u6307\u5411\u961f\u5c3e\u7d22\u5f15 + 1\n            // \u901a\u8fc7\u53d6\u4f59\u64cd\u4f5c\u5b9e\u73b0 rear \u8d8a\u8fc7\u6570\u7ec4\u5c3e\u90e8\u540e\u56de\u5230\u5934\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u8282\u70b9\u540e\u6dfb\u52a0 num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u961f\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u961f\u9996\u6307\u9488\u5411\u540e\u79fb\u52a8\u4e00\u4f4d\uff0c\u82e5\u8d8a\u8fc7\u5c3e\u90e8\uff0c\u5219\u8fd4\u56de\u5230\u6570\u7ec4\u5934\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8bbf\u95ee\u961f\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u961f\u5217\u4e3a\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            // \u4ec5\u8f6c\u6362\u6709\u6548\u957f\u5ea6\u8303\u56f4\u5185\u7684\u5217\u8868\u5143\u7d20\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            var j: usize = self.front;\n            while (i < self.size()) : ({ i += 1; j += 1; }) {\n                res[i] = self.nums[j % self.capacity()];\n            }\n            return res;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4ee5\u4e0a\u5b9e\u73b0\u7684\u961f\u5217\u4ecd\u7136\u5177\u6709\u5c40\u9650\u6027\uff1a\u5176\u957f\u5ea6\u4e0d\u53ef\u53d8\u3002\u7136\u800c\uff0c\u8fd9\u4e2a\u95ee\u9898\u4e0d\u96be\u89e3\u51b3\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u66ff\u6362\u4e3a\u52a8\u6001\u6570\u7ec4\uff0c\u4ece\u800c\u5f15\u5165\u6269\u5bb9\u673a\u5236\u3002\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u5c1d\u8bd5\u81ea\u884c\u5b9e\u73b0\u3002

    \u4e24\u79cd\u5b9e\u73b0\u7684\u5bf9\u6bd4\u7ed3\u8bba\u4e0e\u6808\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

    "},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u961f\u5217\u5178\u578b\u5e94\u7528","text":"
    • \u6dd8\u5b9d\u8ba2\u5355\u3002\u8d2d\u7269\u8005\u4e0b\u5355\u540e\uff0c\u8ba2\u5355\u5c06\u52a0\u5165\u961f\u5217\u4e2d\uff0c\u7cfb\u7edf\u968f\u540e\u4f1a\u6839\u636e\u987a\u5e8f\u5904\u7406\u961f\u5217\u4e2d\u7684\u8ba2\u5355\u3002\u5728\u53cc\u5341\u4e00\u671f\u95f4\uff0c\u77ed\u65f6\u95f4\u5185\u4f1a\u4ea7\u751f\u6d77\u91cf\u8ba2\u5355\uff0c\u9ad8\u5e76\u53d1\u6210\u4e3a\u5de5\u7a0b\u5e08\u4eec\u9700\u8981\u91cd\u70b9\u653b\u514b\u7684\u95ee\u9898\u3002
    • \u5404\u7c7b\u5f85\u529e\u4e8b\u9879\u3002\u4efb\u4f55\u9700\u8981\u5b9e\u73b0\u201c\u5148\u6765\u540e\u5230\u201d\u529f\u80fd\u7684\u573a\u666f\uff0c\u4f8b\u5982\u6253\u5370\u673a\u7684\u4efb\u52a1\u961f\u5217\u3001\u9910\u5385\u7684\u51fa\u9910\u961f\u5217\u7b49\uff0c\u961f\u5217\u5728\u8fd9\u4e9b\u573a\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7ef4\u62a4\u5904\u7406\u987a\u5e8f\u3002
    "},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u6808","text":"

    \u6808\uff08stack\uff09\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u903b\u8f91\u7684\u7ebf\u6027\u6570\u636e\u7ed3\u6784\u3002

    \u6211\u4eec\u53ef\u4ee5\u5c06\u6808\u7c7b\u6bd4\u4e3a\u684c\u9762\u4e0a\u7684\u4e00\u645e\u76d8\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76d8\u5b50\uff0c\u5219\u9700\u8981\u5148\u5c06\u4e0a\u9762\u7684\u76d8\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u4eec\u5c06\u76d8\u5b50\u66ff\u6362\u4e3a\u5404\u79cd\u7c7b\u578b\u7684\u5143\u7d20\uff08\u5982\u6574\u6570\u3001\u5b57\u7b26\u3001\u5bf9\u8c61\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u6808\u8fd9\u79cd\u6570\u636e\u7ed3\u6784\u3002

    \u5982\u56fe 5-1 \u6240\u793a\uff0c\u6211\u4eec\u628a\u5806\u53e0\u5143\u7d20\u7684\u9876\u90e8\u79f0\u4e3a\u201c\u6808\u9876\u201d\uff0c\u5e95\u90e8\u79f0\u4e3a\u201c\u6808\u5e95\u201d\u3002\u5c06\u628a\u5143\u7d20\u6dfb\u52a0\u5230\u6808\u9876\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u6808\u201d\uff0c\u5220\u9664\u6808\u9876\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u6808\u201d\u3002

    \u56fe 5-1 \u00a0 \u6808\u7684\u5148\u5165\u540e\u51fa\u89c4\u5219

    "},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u6808\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u6808\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u4f53\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u636e\u6240\u4f7f\u7528\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u786e\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u4eec\u4ee5\u5e38\u89c1\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u4e3a\u4f8b\u3002

    \u8868 5-1 \u00a0 \u6808\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5 \u63cf\u8ff0 \u65f6\u95f4\u590d\u6742\u5ea6 push() \u5143\u7d20\u5165\u6808\uff08\u6dfb\u52a0\u81f3\u6808\u9876\uff09 \\(O(1)\\) pop() \u6808\u9876\u5143\u7d20\u51fa\u6808 \\(O(1)\\) peek() \u8bbf\u95ee\u6808\u9876\u5143\u7d20 \\(O(1)\\)

    \u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\u5185\u7f6e\u7684\u6808\u7c7b\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8bed\u8a00\u53ef\u80fd\u6ca1\u6709\u4e13\u95e8\u63d0\u4f9b\u6808\u7c7b\uff0c\u8fd9\u65f6\u6211\u4eec\u53ef\u4ee5\u5c06\u8be5\u8bed\u8a00\u7684\u201c\u6570\u7ec4\u201d\u6216\u201c\u94fe\u8868\u201d\u5f53\u4f5c\u6808\u6765\u4f7f\u7528\uff0c\u5e76\u5728\u7a0b\u5e8f\u903b\u8f91\u4e0a\u5ffd\u7565\u4e0e\u6808\u65e0\u5173\u7684\u64cd\u4f5c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
    # \u521d\u59cb\u5316\u6808\n# Python \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a list \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u6808\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u6808\npop: int = stack.pop()\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(stack) == 0\n
    stack.cpp
    /* \u521d\u59cb\u5316\u6808 */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u6808 */\nstack.pop(); // \u65e0\u8fd4\u56de\u503c\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool empty = stack.empty();\n
    stack.java
    /* \u521d\u59cb\u5316\u6808 */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
    stack.cs
    /* \u521d\u59cb\u5316\u6808 */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.Pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.Count == 0;\n
    stack_test.go
    /* \u521d\u59cb\u5316\u6808 */\n// \u5728 Go \u4e2d\uff0c\u63a8\u8350\u5c06 Slice \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u6808 */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u6808 */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nisEmpty := len(stack) == 0\n
    stack.swift
    /* \u521d\u59cb\u5316\u6808 */\n// Swift \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.removeLast()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet isEmpty = stack.isEmpty\n
    stack.js
    /* \u521d\u59cb\u5316\u6808 */\n// JavaScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.ts
    /* \u521d\u59cb\u5316\u6808 */\n// TypeScript \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u6808 */\nconst pop = stack.pop();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.dart
    /* \u521d\u59cb\u5316\u6808 */\n// Dart \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a List \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u6808 */\nint pop = stack.removeLast();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty = stack.isEmpty;\n
    stack.rs
    /* \u521d\u59cb\u5316\u6808 */\n// \u628a Vec \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u6808 */\nlet pop = stack.pop().unwrap();\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nlet is_empty = stack.is_empty();\n
    stack.c
    // C \u672a\u63d0\u4f9b\u5185\u7f6e\u6808\n
    stack.kt
    /* \u521d\u59cb\u5316\u6808 */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u6808 */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u6808 */\nval pop = stack.pop()\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65ad\u662f\u5426\u4e3a\u7a7a */\nval isEmpty = stack.isEmpty()\n
    stack.rb
    # \u521d\u59cb\u5316\u6808\n# Ruby \u6ca1\u6709\u5185\u7f6e\u7684\u6808\u7c7b\uff0c\u53ef\u4ee5\u628a Array \u5f53\u4f5c\u6808\u6765\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u6808\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8bbf\u95ee\u6808\u9876\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u6808\npop = stack.pop\n\n# \u83b7\u53d6\u6808\u7684\u957f\u5ea6\nsize = stack.length\n\n# \u5224\u65ad\u662f\u5426\u4e3a\u7a7a\nis_empty = stack.empty?\n
    stack.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u6808\u7684\u5b9e\u73b0","text":"

    \u4e3a\u4e86\u6df1\u5165\u4e86\u89e3\u6808\u7684\u8fd0\u884c\u673a\u5236\uff0c\u6211\u4eec\u6765\u5c1d\u8bd5\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u6808\u7c7b\u3002

    \u6808\u9075\u5faa\u5148\u5165\u540e\u51fa\u7684\u539f\u5219\uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u80fd\u5728\u6808\u9876\u6dfb\u52a0\u6216\u5220\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u6570\u7ec4\u548c\u94fe\u8868\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u6dfb\u52a0\u548c\u5220\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u6808\u53ef\u4ee5\u89c6\u4e3a\u4e00\u79cd\u53d7\u9650\u5236\u7684\u6570\u7ec4\u6216\u94fe\u8868\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u6211\u4eec\u53ef\u4ee5\u201c\u5c4f\u853d\u201d\u6570\u7ec4\u6216\u94fe\u8868\u7684\u90e8\u5206\u65e0\u5173\u64cd\u4f5c\uff0c\u4f7f\u5176\u5bf9\u5916\u8868\u73b0\u7684\u903b\u8f91\u7b26\u5408\u6808\u7684\u7279\u6027\u3002

    "},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0","text":"

    \u4f7f\u7528\u94fe\u8868\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u94fe\u8868\u7684\u5934\u8282\u70b9\u89c6\u4e3a\u6808\u9876\uff0c\u5c3e\u8282\u70b9\u89c6\u4e3a\u6808\u5e95\u3002

    \u5982\u56fe 5-2 \u6240\u793a\uff0c\u5bf9\u4e8e\u5165\u6808\u64cd\u4f5c\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u5143\u7d20\u63d2\u5165\u94fe\u8868\u5934\u90e8\uff0c\u8fd9\u79cd\u8282\u70b9\u63d2\u5165\u65b9\u6cd5\u88ab\u79f0\u4e3a\u201c\u5934\u63d2\u6cd5\u201d\u3002\u800c\u5bf9\u4e8e\u51fa\u6808\u64cd\u4f5c\uff0c\u53ea\u9700\u5c06\u5934\u8282\u70b9\u4ece\u94fe\u8868\u4e2d\u5220\u9664\u5373\u53ef\u3002

    LinkedListStackpush()pop()

    \u56fe 5-2 \u00a0 \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u6808\u7684\u793a\u4f8b\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
    class LinkedListStack:\n    \"\"\"\u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u6808\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f6c\u5316\u4e3a\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
    linkedlist_stack.cpp
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize;        // \u6808\u7684\u957f\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u904d\u5386\u94fe\u8868\u5220\u9664\u8282\u70b9\uff0c\u91ca\u653e\u5185\u5b58\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91ca\u653e\u5185\u5b58\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_stack.java
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private int stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.cs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int stkSize = 0;   // \u6808\u7684\u957f\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.go
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5185\u7f6e\u5305 list \u6765\u5b9e\u73b0\u6808\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u6808 */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u6808 */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u83b7\u53d6 List \u7528\u4e8e\u6253\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
    linkedlist_stack.swift
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var _size: Int // \u6808\u7684\u957f\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_stack.js
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    #stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    #stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.ts
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private stkSize: number = 0; // \u6808\u7684\u957f\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.dart
    /* \u57fa\u4e8e\u94fe\u8868\u7c7b\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n  int _stkSize = 0; // \u6808\u7684\u957f\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a List \u5e76\u8fd4\u56de */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
    linkedlist_stack.rs
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    stk_size: usize,                              // \u6808\u7684\u957f\u5ea6\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u51fa\u6808 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            match old_head.borrow_mut().next.take() {\n                Some(new_head) => {\n                    self.stack_peek = Some(new_head);\n                }\n                None => {\n                    self.stack_peek = None;\n                }\n            }\n            self.stk_size -= 1;\n            Rc::try_unwrap(old_head).ok().unwrap().into_inner().val\n        })\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        if let Some(node) = head {\n            let mut nums = self.to_array(node.borrow().next.as_ref());\n            nums.push(node.borrow().val);\n            return nums;\n        }\n        return Vec::new();\n    }\n}\n
    linkedlist_stack.c
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    ListNode *top; // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    int size;      // \u6808\u7684\u957f\u5ea6\n} LinkedListStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6307\u9488\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u8282\u70b9\u6570\u636e\u57df\n    s->top = node;       // \u66f4\u65b0\u6808\u9876\n    s->size++;           // \u66f4\u65b0\u6808\u5927\u5c0f\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u6808 */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91ca\u653e\u5185\u5b58\n    free(tmp);\n    s->size--;\n    return val;\n}\n
    linkedlist_stack.kt
    /* \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n    private var stkSize: Int = 0 // \u6808\u7684\u957f\u5ea6\n) {\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_stack.rb
    ### \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808 ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u6808 ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c06\u94fe\u8868\u8f6c\u5316\u4e3a Array \u5e76\u53cd\u56de ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
    linkedlist_stack.zig
    // \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c06\u5934\u8282\u70b9\u4f5c\u4e3a\u6808\u9876\n        stk_size: usize = 0,                             // \u6808\u7684\u957f\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u5185\u5b58\u5206\u914d\u5668\n\n        // \u6784\u9020\u51fd\u6570\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            if (self.mem_arena == null) {\n                self.mem_arena = std.heap.ArenaAllocator.init(allocator);\n                self.mem_allocator = self.mem_arena.?.allocator();\n            }\n            self.stack_top = null;\n            self.stk_size = 0;\n        }\n\n        // \u6790\u6784\u51fd\u6570\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            node.next = self.stack_top;\n            self.stack_top = node;\n            self.stk_size += 1;\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            self.stack_top = self.stack_top.?.next;\n            self.stk_size -= 1;\n            return num;\n        } \n\n        // \u5c06\u6808\u8f6c\u6362\u4e3a\u6570\u7ec4\n        pub fn toArray(self: *Self) ![]T {\n            var node = self.stack_top;\n            var res = try self.mem_allocator.alloc(T, self.size());\n            @memset(res, @as(T, 0));\n            var i: usize = 0;\n            while (i < res.len) : (i += 1) {\n                res[res.len - i - 1] = node.?.val;\n                node = node.?.next;\n            }\n            return res;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0","text":"

    \u4f7f\u7528\u6570\u7ec4\u5b9e\u73b0\u6808\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u6570\u7ec4\u7684\u5c3e\u90e8\u4f5c\u4e3a\u6808\u9876\u3002\u5982\u56fe 5-3 \u6240\u793a\uff0c\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u5206\u522b\u5bf9\u5e94\u5728\u6570\u7ec4\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\u4e0e\u5220\u9664\u5143\u7d20\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u4e3a \\(O(1)\\) \u3002

    ArrayStackpush()pop()

    \u56fe 5-3 \u00a0 \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u6808\u7684\u5165\u6808\u51fa\u6808\u64cd\u4f5c

    \u7531\u4e8e\u5165\u6808\u7684\u5143\u7d20\u53ef\u80fd\u4f1a\u6e90\u6e90\u4e0d\u65ad\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u52a8\u6001\u6570\u7ec4\uff0c\u8fd9\u6837\u5c31\u65e0\u987b\u81ea\u884c\u5904\u7406\u6570\u7ec4\u6269\u5bb9\u95ee\u9898\u3002\u4ee5\u4e0b\u4e3a\u793a\u4f8b\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
    class ArrayStack:\n    \"\"\"\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\"\"\"\n\n    def __init__(self):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u83b7\u53d6\u6808\u7684\u957f\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u6808\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u6808\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8bbf\u95ee\u6808\u9876\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u6808\u4e3a\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370\"\"\"\n        return self._stack\n
    array_stack.cpp
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u6808 */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u6808\u4e3a\u7a7a\");\n        return stack.back();\n    }\n\n    /* \u8fd4\u56de Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
    array_stack.java
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
    array_stack.cs
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u6808 */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u6808 */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
    array_stack.go
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntype arrayStack struct {\n    data []int // \u6570\u636e\n}\n\n/* \u521d\u59cb\u5316\u6808 */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8bbe\u7f6e\u6808\u7684\u957f\u5ea6\u4e3a 0\uff0c\u5bb9\u91cf\u4e3a 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u6808\u7684\u957f\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u6808\u662f\u5426\u4e3a\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u6808 */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u4f1a\u81ea\u52a8\u6269\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u6808 */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6\u6808\u9876\u5143\u7d20 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u83b7\u53d6 Slice \u7528\u4e8e\u6253\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
    array_stack.swift
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n        stack = []\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u6808 */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u6808 */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u6808\u4e3a\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
    array_stack.js
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
    array_stack.ts
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u6808 */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u6808\u4e3a\u7a7a');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
    array_stack.dart
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u6808 */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u6808 */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u6808\u4e3a\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c06\u6808\u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
    array_stack.rs
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u6808 */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u6808 */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u6808\u4e3a\u7a7a\")\n        };\n        self.stack.last()\n    }\n\n    /* \u8fd4\u56de &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
    array_stack.c
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u6269\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u6808 */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u6808\u5df2\u6ee1\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u6808\u4e3a\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u6808 */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
    array_stack.kt
    /* \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u5217\u8868\uff08\u52a8\u6001\u6570\u7ec4\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u83b7\u53d6\u6808\u7684\u957f\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u6808 */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u6808 */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8bbf\u95ee\u6808\u9876\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c06 List \u8f6c\u5316\u4e3a Array \u5e76\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
    array_stack.rb
    ### \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808 ###\nclass ArrayStack\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u83b7\u53d6\u6808\u7684\u957f\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u6808 ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u6808 ###\n  def pop\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8bbf\u95ee\u6808\u9876\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u6808\u4e3a\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u5217\u8868\u7528\u4e8e\u6253\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
    array_stack.zig
    // \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u6784\u9020\u65b9\u6cd5\uff08\u5206\u914d\u5185\u5b58+\u521d\u59cb\u5316\u6808\uff09\n        pub fn init(self: *Self, allocator: std.mem.Allocator) void {\n            if (self.stack == null) {\n                self.stack = std.ArrayList(T).init(allocator);\n            }\n        }\n\n        // \u6790\u6784\u65b9\u6cd5\uff08\u91ca\u653e\u5185\u5b58\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u83b7\u53d6\u6808\u7684\u957f\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65ad\u6808\u662f\u5426\u4e3a\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8bbf\u95ee\u6808\u9876\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u6808\u4e3a\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u6808\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u6808\n        pub fn pop(self: *Self) T {\n            var num = self.stack.?.pop();\n            return num;\n        } \n\n        // \u8fd4\u56de ArrayList\n        pub fn toList(self: *Self) std.ArrayList(T) {\n            return self.stack.?;\n        }\n    };\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u4e24\u79cd\u5b9e\u73b0\u5bf9\u6bd4","text":"

    \u652f\u6301\u64cd\u4f5c

    \u4e24\u79cd\u5b9e\u73b0\u90fd\u652f\u6301\u6808\u5b9a\u4e49\u4e2d\u7684\u5404\u9879\u64cd\u4f5c\u3002\u6570\u7ec4\u5b9e\u73b0\u989d\u5916\u652f\u6301\u968f\u673a\u8bbf\u95ee\uff0c\u4f46\u8fd9\u5df2\u8d85\u51fa\u4e86\u6808\u7684\u5b9a\u4e49\u8303\u7574\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u4f1a\u7528\u5230\u3002

    \u65f6\u95f4\u6548\u7387

    \u5728\u57fa\u4e8e\u6570\u7ec4\u7684\u5b9e\u73b0\u4e2d\uff0c\u5165\u6808\u548c\u51fa\u6808\u64cd\u4f5c\u90fd\u5728\u9884\u5148\u5206\u914d\u597d\u7684\u8fde\u7eed\u5185\u5b58\u4e2d\u8fdb\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u7f13\u5b58\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f83\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u6808\u65f6\u8d85\u51fa\u6570\u7ec4\u5bb9\u91cf\uff0c\u4f1a\u89e6\u53d1\u6269\u5bb9\u673a\u5236\uff0c\u5bfc\u81f4\u8be5\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u53d8\u4e3a \\(O(n)\\) \u3002

    \u5728\u57fa\u4e8e\u94fe\u8868\u7684\u5b9e\u73b0\u4e2d\uff0c\u94fe\u8868\u7684\u6269\u5bb9\u975e\u5e38\u7075\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u6570\u7ec4\u6269\u5bb9\u65f6\u6548\u7387\u964d\u4f4e\u7684\u95ee\u9898\u3002\u4f46\u662f\uff0c\u5165\u6808\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u8282\u70b9\u5bf9\u8c61\u5e76\u4fee\u6539\u6307\u9488\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5bf9\u8f83\u4f4e\u3002\u4e0d\u8fc7\uff0c\u5982\u679c\u5165\u6808\u5143\u7d20\u672c\u8eab\u5c31\u662f\u8282\u70b9\u5bf9\u8c61\uff0c\u90a3\u4e48\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9aa4\uff0c\u4ece\u800c\u63d0\u9ad8\u6548\u7387\u3002

    \u7efc\u4e0a\u6240\u8ff0\uff0c\u5f53\u5165\u6808\u4e0e\u51fa\u6808\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u6570\u636e\u7c7b\u578b\u65f6\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7ed3\u8bba\u3002

    • \u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u5728\u89e6\u53d1\u6269\u5bb9\u65f6\u6548\u7387\u4f1a\u964d\u4f4e\uff0c\u4f46\u7531\u4e8e\u6269\u5bb9\u662f\u4f4e\u9891\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    • \u57fa\u4e8e\u94fe\u8868\u5b9e\u73b0\u7684\u6808\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002

    \u7a7a\u95f4\u6548\u7387

    \u5728\u521d\u59cb\u5316\u5217\u8868\u65f6\uff0c\u7cfb\u7edf\u4f1a\u4e3a\u5217\u8868\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8be5\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\uff1b\u5e76\u4e14\uff0c\u6269\u5bb9\u673a\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u8fdb\u884c\u6269\u5bb9\u7684\uff0c\u6269\u5bb9\u540e\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5b9e\u9645\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u4e8e\u6570\u7ec4\u5b9e\u73b0\u7684\u6808\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002

    \u7136\u800c\uff0c\u7531\u4e8e\u94fe\u8868\u8282\u70b9\u9700\u8981\u989d\u5916\u5b58\u50a8\u6307\u9488\uff0c\u56e0\u6b64\u94fe\u8868\u8282\u70b9\u5360\u7528\u7684\u7a7a\u95f4\u76f8\u5bf9\u8f83\u5927\u3002

    \u7efc\u4e0a\uff0c\u6211\u4eec\u4e0d\u80fd\u7b80\u5355\u5730\u786e\u5b9a\u54ea\u79cd\u5b9e\u73b0\u66f4\u52a0\u8282\u7701\u5185\u5b58\uff0c\u9700\u8981\u9488\u5bf9\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\u3002

    "},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u6808\u7684\u5178\u578b\u5e94\u7528","text":"
    • \u6d4f\u89c8\u5668\u4e2d\u7684\u540e\u9000\u4e0e\u524d\u8fdb\u3001\u8f6f\u4ef6\u4e2d\u7684\u64a4\u9500\u4e0e\u53cd\u64a4\u9500\u3002\u6bcf\u5f53\u6211\u4eec\u6253\u5f00\u65b0\u7684\u7f51\u9875\uff0c\u6d4f\u89c8\u5668\u5c31\u4f1a\u5bf9\u4e0a\u4e00\u4e2a\u7f51\u9875\u6267\u884c\u5165\u6808\uff0c\u8fd9\u6837\u6211\u4eec\u5c31\u53ef\u4ee5\u901a\u8fc7\u540e\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u4e2a\u7f51\u9875\u3002\u540e\u9000\u64cd\u4f5c\u5b9e\u9645\u4e0a\u662f\u5728\u6267\u884c\u51fa\u6808\u3002\u5982\u679c\u8981\u540c\u65f6\u652f\u6301\u540e\u9000\u548c\u524d\u8fdb\uff0c\u90a3\u4e48\u9700\u8981\u4e24\u4e2a\u6808\u6765\u914d\u5408\u5b9e\u73b0\u3002
    • \u7a0b\u5e8f\u5185\u5b58\u7ba1\u7406\u3002\u6bcf\u6b21\u8c03\u7528\u51fd\u6570\u65f6\uff0c\u7cfb\u7edf\u90fd\u4f1a\u5728\u6808\u9876\u6dfb\u52a0\u4e00\u4e2a\u6808\u5e27\uff0c\u7528\u4e8e\u8bb0\u5f55\u51fd\u6570\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\u3002\u5728\u9012\u5f52\u51fd\u6570\u4e2d\uff0c\u5411\u4e0b\u9012\u63a8\u9636\u6bb5\u4f1a\u4e0d\u65ad\u6267\u884c\u5165\u6808\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u9636\u6bb5\u5219\u4f1a\u4e0d\u65ad\u6267\u884c\u51fa\u6808\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u6808\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u540e\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u53ef\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002
    • \u5728\u65f6\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u5177\u6709\u8f83\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u6269\u5bb9\u8fc7\u7a0b\u4e2d\uff0c\u5355\u6b21\u5165\u6808\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u6808\u7684\u94fe\u8868\u5b9e\u73b0\u5177\u6709\u66f4\u4e3a\u7a33\u5b9a\u7684\u6548\u7387\u8868\u73b0\u3002
    • \u5728\u7a7a\u95f4\u6548\u7387\u65b9\u9762\uff0c\u6808\u7684\u6570\u7ec4\u5b9e\u73b0\u53ef\u80fd\u5bfc\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u95f4\u6d6a\u8d39\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u94fe\u8868\u8282\u70b9\u6240\u5360\u7528\u7684\u5185\u5b58\u7a7a\u95f4\u6bd4\u6570\u7ec4\u5143\u7d20\u66f4\u5927\u3002
    • \u961f\u5217\u662f\u4e00\u79cd\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5219\u7684\u6570\u636e\u7ed3\u6784\uff0c\u540c\u6837\u53ef\u4ee5\u901a\u8fc7\u6570\u7ec4\u6216\u94fe\u8868\u6765\u5b9e\u73b0\u3002\u5728\u65f6\u95f4\u6548\u7387\u548c\u7a7a\u95f4\u6548\u7387\u7684\u5bf9\u6bd4\u4e0a\uff0c\u961f\u5217\u7684\u7ed3\u8bba\u4e0e\u524d\u8ff0\u6808\u7684\u7ed3\u8bba\u76f8\u4f3c\u3002
    • \u53cc\u5411\u961f\u5217\u662f\u4e00\u79cd\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u961f\u5217\uff0c\u5b83\u5141\u8bb8\u5728\u4e24\u7aef\u8fdb\u884c\u5143\u7d20\u7684\u6dfb\u52a0\u548c\u5220\u9664\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u662f\u5426\u662f\u53cc\u5411\u94fe\u8868\u5b9e\u73b0\uff1f

    \u6d4f\u89c8\u5668\u7684\u524d\u8fdb\u540e\u9000\u529f\u80fd\u672c\u8d28\u4e0a\u662f\u201c\u6808\u201d\u7684\u4f53\u73b0\u3002\u5f53\u7528\u6237\u8bbf\u95ee\u4e00\u4e2a\u65b0\u9875\u9762\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u88ab\u6dfb\u52a0\u5230\u6808\u9876\uff1b\u5f53\u7528\u6237\u70b9\u51fb\u540e\u9000\u6309\u94ae\u65f6\uff0c\u8be5\u9875\u9762\u4f1a\u4ece\u6808\u9876\u5f39\u51fa\u3002\u4f7f\u7528\u53cc\u5411\u961f\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5b9e\u73b0\u4e00\u4e9b\u989d\u5916\u64cd\u4f5c\uff0c\u8fd9\u4e2a\u5728\u201c\u53cc\u5411\u961f\u5217\u201d\u7ae0\u8282\u6709\u63d0\u5230\u3002

    Q\uff1a\u5728\u51fa\u6808\u540e\uff0c\u662f\u5426\u9700\u8981\u91ca\u653e\u51fa\u6808\u8282\u70b9\u7684\u5185\u5b58\uff1f

    \u5982\u679c\u540e\u7eed\u4ecd\u9700\u8981\u4f7f\u7528\u5f39\u51fa\u8282\u70b9\uff0c\u5219\u4e0d\u9700\u8981\u91ca\u653e\u5185\u5b58\u3002\u82e5\u4e4b\u540e\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8bed\u8a00\u62e5\u6709\u81ea\u52a8\u5783\u573e\u56de\u6536\u673a\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52a8\u91ca\u653e\u5185\u5b58\u3002

    Q\uff1a\u53cc\u5411\u961f\u5217\u50cf\u662f\u4e24\u4e2a\u6808\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u4e48\uff1f

    \u53cc\u5411\u961f\u5217\u5c31\u50cf\u662f\u6808\u548c\u961f\u5217\u7684\u7ec4\u5408\u6216\u4e24\u4e2a\u6808\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73b0\u7684\u662f\u6808 + \u961f\u5217\u7684\u903b\u8f91\uff0c\u56e0\u6b64\u53ef\u4ee5\u5b9e\u73b0\u6808\u4e0e\u961f\u5217\u7684\u6240\u6709\u5e94\u7528\uff0c\u5e76\u4e14\u66f4\u52a0\u7075\u6d3b\u3002

    Q\uff1a\u64a4\u9500\uff08undo\uff09\u548c\u53cd\u64a4\u9500\uff08redo\uff09\u5177\u4f53\u662f\u5982\u4f55\u5b9e\u73b0\u7684\uff1f

    \u4f7f\u7528\u4e24\u4e2a\u6808\uff0c\u6808 A \u7528\u4e8e\u64a4\u9500\uff0c\u6808 B \u7528\u4e8e\u53cd\u64a4\u9500\u3002

    1. \u6bcf\u5f53\u7528\u6237\u6267\u884c\u4e00\u4e2a\u64cd\u4f5c\uff0c\u5c06\u8fd9\u4e2a\u64cd\u4f5c\u538b\u5165\u6808 A \uff0c\u5e76\u6e05\u7a7a\u6808 B \u3002
    2. \u5f53\u7528\u6237\u6267\u884c\u201c\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 A \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 B \u3002
    3. \u5f53\u7528\u6237\u6267\u884c\u201c\u53cd\u64a4\u9500\u201d\u65f6\uff0c\u4ece\u6808 B \u4e2d\u5f39\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u5e76\u5c06\u5176\u538b\u5165\u6808 A \u3002
    "},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6811","text":"

    Abstract

    \u53c2\u5929\u5927\u6811\u5145\u6ee1\u751f\u547d\u529b\uff0c\u6839\u6df1\u53f6\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

    \u5b83\u4e3a\u6211\u4eec\u5c55\u73b0\u4e86\u6570\u636e\u5206\u6cbb\u7684\u751f\u52a8\u5f62\u6001\u3002

    "},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5185\u5bb9","text":"
    • 7.1 \u00a0 \u4e8c\u53c9\u6811
    • 7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386
    • 7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a
    • 7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811
    • 7.5 \u00a0 AVL \u6811 *
    • 7.6 \u00a0 \u5c0f\u7ed3
    "},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u53c9\u6811\u6570\u7ec4\u8868\u793a","text":"

    \u5728\u94fe\u8868\u8868\u793a\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u5b58\u50a8\u5355\u5143\u4e3a\u8282\u70b9 TreeNode \uff0c\u8282\u70b9\u4e4b\u95f4\u901a\u8fc7\u6307\u9488\u76f8\u8fde\u63a5\u3002\u4e0a\u4e00\u8282\u4ecb\u7ecd\u4e86\u94fe\u8868\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7684\u5404\u9879\u57fa\u672c\u64cd\u4f5c\u3002

    \u90a3\u4e48\uff0c\u6211\u4eec\u80fd\u5426\u7528\u6570\u7ec4\u6765\u8868\u793a\u4e8c\u53c9\u6811\u5462\uff1f\u7b54\u6848\u662f\u80af\u5b9a\u7684\u3002

    "},{"location":"chapter_tree/array_representation_of_tree/#731","title":"7.3.1 \u00a0 \u8868\u793a\u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

    \u5148\u5206\u6790\u4e00\u4e2a\u7b80\u5355\u6848\u4f8b\u3002\u7ed9\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u6211\u4eec\u5c06\u6240\u6709\u8282\u70b9\u6309\u7167\u5c42\u5e8f\u904d\u5386\u7684\u987a\u5e8f\u5b58\u50a8\u5728\u4e00\u4e2a\u6570\u7ec4\u4e2d\uff0c\u5219\u6bcf\u4e2a\u8282\u70b9\u90fd\u5bf9\u5e94\u552f\u4e00\u7684\u6570\u7ec4\u7d22\u5f15\u3002

    \u6839\u636e\u5c42\u5e8f\u904d\u5386\u7684\u7279\u6027\uff0c\u6211\u4eec\u53ef\u4ee5\u63a8\u5bfc\u51fa\u7236\u8282\u70b9\u7d22\u5f15\u4e0e\u5b50\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u201c\u6620\u5c04\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u8282\u70b9\u7684\u7d22\u5f15\u4e3a \\(i\\) \uff0c\u5219\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 1\\) \uff0c\u53f3\u5b50\u8282\u70b9\u7d22\u5f15\u4e3a \\(2i + 2\\) \u3002\u56fe 7-12 \u5c55\u793a\u4e86\u5404\u4e2a\u8282\u70b9\u7d22\u5f15\u4e4b\u95f4\u7684\u6620\u5c04\u5173\u7cfb\u3002

    \u56fe 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

    \u6620\u5c04\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u5f53\u4e8e\u94fe\u8868\u4e2d\u7684\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002\u7ed9\u5b9a\u6570\u7ec4\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u8282\u70b9\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u901a\u8fc7\u6620\u5c04\u516c\u5f0f\u6765\u8bbf\u95ee\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3002

    "},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u53c9\u6811","text":"

    \u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u4e00\u4e2a\u7279\u4f8b\uff0c\u5728\u4e8c\u53c9\u6811\u7684\u4e2d\u95f4\u5c42\u901a\u5e38\u5b58\u5728\u8bb8\u591a None \u3002\u7531\u4e8e\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5e76\u4e0d\u5305\u542b\u8fd9\u4e9b None \uff0c\u56e0\u6b64\u6211\u4eec\u65e0\u6cd5\u4ec5\u51ed\u8be5\u5e8f\u5217\u6765\u63a8\u6d4b None \u7684\u6570\u91cf\u548c\u5206\u5e03\u4f4d\u7f6e\u3002\u8fd9\u610f\u5473\u7740\u5b58\u5728\u591a\u79cd\u4e8c\u53c9\u6811\u7ed3\u6784\u90fd\u7b26\u5408\u8be5\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002

    \u5982\u56fe 7-13 \u6240\u793a\uff0c\u7ed9\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff0c\u4e0a\u8ff0\u6570\u7ec4\u8868\u793a\u65b9\u6cd5\u5df2\u7ecf\u5931\u6548\u3002

    \u56fe 7-13 \u00a0 \u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5bf9\u5e94\u591a\u79cd\u4e8c\u53c9\u6811\u53ef\u80fd\u6027

    \u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u8003\u8651\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u4e2d\u663e\u5f0f\u5730\u5199\u51fa\u6240\u6709 None \u3002\u5982\u56fe 7-14 \u6240\u793a\uff0c\u8fd9\u6837\u5904\u7406\u540e\uff0c\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u53c9\u6811\u4e86\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\n# \u4f7f\u7528 None \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6807\u8bb0\u7a7a\u4f4d\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88c5\u7c7b Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 any \u7c7b\u578b\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u7c7b\u578b \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u6765\u6807\u8bb0\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 None \u6765\u6807\u8bb0\u7a7a\u4f4d\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6807\u8bb0\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u8282\u70b9\u503c\u4e0d\u80fd\u4e3a INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a */\n// \u4f7f\u7528 null \u6765\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
    ### \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a ###\n# \u4f7f\u7528 nil \u6765\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    \n

    \u56fe 7-14 \u00a0 \u4efb\u610f\u7c7b\u578b\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

    \u503c\u5f97\u8bf4\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\u975e\u5e38\u9002\u5408\u4f7f\u7528\u6570\u7ec4\u6765\u8868\u793a\u3002\u56de\u987e\u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u5b9a\u4e49\uff0cNone \u53ea\u51fa\u73b0\u5728\u6700\u5e95\u5c42\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73b0\u5728\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u672b\u5c3e\u3002

    \u8fd9\u610f\u5473\u7740\u4f7f\u7528\u6570\u7ec4\u8868\u793a\u5b8c\u5168\u4e8c\u53c9\u6811\u65f6\uff0c\u53ef\u4ee5\u7701\u7565\u5b58\u50a8\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u56fe 7-15 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u4f8b\u5b50\u3002

    \u56fe 7-15 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a

    \u4ee5\u4e0b\u4ee3\u7801\u5b9e\u73b0\u4e86\u4e00\u68f5\u57fa\u4e8e\u6570\u7ec4\u8868\u793a\u7684\u4e8c\u53c9\u6811\uff0c\u5305\u62ec\u4ee5\u4e0b\u51e0\u79cd\u64cd\u4f5c\u3002

    • \u7ed9\u5b9a\u67d0\u8282\u70b9\uff0c\u83b7\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u3001\u7236\u8282\u70b9\u3002
    • \u83b7\u53d6\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u3001\u540e\u5e8f\u904d\u5386\u3001\u5c42\u5e8f\u904d\u5386\u5e8f\u5217\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
    class ArrayBinaryTree:\n    \"\"\"\u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u6784\u9020\u65b9\u6cd5\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u5217\u8868\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u6df1\u5ea6\u4f18\u5148\u904d\u5386\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u904d\u5386\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u540e\u5e8f\u904d\u5386\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
    array_binary_tree.cpp
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  public:\n    /* \u6784\u9020\u65b9\u6cd5 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
    array_binary_tree.java
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.cs
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.go
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u904d\u5386\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u540e\u5e8f\u904d\u5386\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
    array_binary_tree.swift
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
    array_binary_tree.js
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i, order, res) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.ts
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u6784\u9020\u65b9\u6cd5 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u904d\u5386\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.dart
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u6784\u9020\u65b9\u6cd5 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u5217\u8868\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c42\u5e8f\u904d\u5386 */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u904d\u5386\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u540e\u5e8f\u904d\u5386\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u904d\u5386 */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u904d\u5386 */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u540e\u5e8f\u904d\u5386 */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
    array_binary_tree.rs
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u5217\u8868\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de None \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for i in 0..self.size() {\n            if let Some(val) = self.val(i) {\n                res.push(val)\n            }\n        }\n        res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fn dfs(&self, i: i32, order: &str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u524d\u5e8f\u904d\u5386\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u904d\u5386\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u540e\u5e8f\u904d\u5386\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
    array_binary_tree.c
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7ed3\u6784\u4f53 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u6784\u9020\u51fd\u6570 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u6790\u6784\u51fd\u6570 */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u5217\u8868\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de INT_MAX \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u904d\u5386\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u904d\u5386\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u540e\u5e8f\u904d\u5386\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u904d\u5386 */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
    array_binary_tree.kt
    /* \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u5217\u8868\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c42\u5e8f\u904d\u5386 */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u6df1\u5ea6\u4f18\u5148\u904d\u5386 */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u4e3a\u7a7a\u4f4d\uff0c\u5219\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u904d\u5386\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u904d\u5386\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u540e\u5e8f\u904d\u5386\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u904d\u5386 */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u904d\u5386 */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u540e\u5e8f\u904d\u5386 */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
    array_binary_tree.rb
    ### \u6570\u7ec4\u8868\u793a\u4e0b\u7684\u4e8c\u53c9\u6811\u7c7b ###\nclass ArrayBinaryTree\n  ### \u6784\u9020\u65b9\u6cd5 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  ### \u5217\u8868\u5bb9\u91cf ###\n  def size\n    @tree.length\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u503c ###\n  def val(i)\n    # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5219\u8fd4\u56de nil \uff0c\u4ee3\u8868\u7a7a\u4f4d\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def left(i)\n    2 * i + 1\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u53f3\u5b50\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def right(i)\n    2 * i + 2\n  end\n\n  ### \u83b7\u53d6\u7d22\u5f15\u4e3a i \u8282\u70b9\u7684\u7236\u8282\u70b9\u7684\u7d22\u5f15 ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  ### \u5c42\u5e8f\u904d\u5386 ###\n  def level_order\n    @res = []\n\n    # \u76f4\u63a5\u904d\u5386\u6570\u7ec4\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  ### \u6df1\u5ea6\u4f18\u5148\u904d\u5386 ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u524d\u5e8f\u904d\u5386\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u4e2d\u5e8f\u904d\u5386\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u540e\u5e8f\u904d\u5386\n    @res << val(i) if order == :post\n  end\n\n  ### \u524d\u5e8f\u904d\u5386 ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  ### \u4e2d\u5e8f\u904d\u5386 ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  ### \u540e\u5e8f\u904d\u5386 ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
    array_binary_tree.zig
    [class]{ArrayBinaryTree}-[func]{}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u4f18\u70b9\u4e0e\u5c40\u9650\u6027","text":"

    \u4e8c\u53c9\u6811\u7684\u6570\u7ec4\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u4f18\u70b9\u3002

    • \u6570\u7ec4\u5b58\u50a8\u5728\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u5bf9\u7f13\u5b58\u53cb\u597d\uff0c\u8bbf\u95ee\u4e0e\u904d\u5386\u901f\u5ea6\u8f83\u5feb\u3002
    • \u4e0d\u9700\u8981\u5b58\u50a8\u6307\u9488\uff0c\u6bd4\u8f83\u8282\u7701\u7a7a\u95f4\u3002
    • \u5141\u8bb8\u968f\u673a\u8bbf\u95ee\u8282\u70b9\u3002

    \u7136\u800c\uff0c\u6570\u7ec4\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u5c40\u9650\u6027\u3002

    • \u6570\u7ec4\u5b58\u50a8\u9700\u8981\u8fde\u7eed\u5185\u5b58\u7a7a\u95f4\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u5b58\u50a8\u6570\u636e\u91cf\u8fc7\u5927\u7684\u6811\u3002
    • \u589e\u5220\u8282\u70b9\u9700\u8981\u901a\u8fc7\u6570\u7ec4\u63d2\u5165\u4e0e\u5220\u9664\u64cd\u4f5c\u5b9e\u73b0\uff0c\u6548\u7387\u8f83\u4f4e\u3002
    • \u5f53\u4e8c\u53c9\u6811\u4e2d\u5b58\u5728\u5927\u91cf None \u65f6\uff0c\u6570\u7ec4\u4e2d\u5305\u542b\u7684\u8282\u70b9\u6570\u636e\u6bd4\u91cd\u8f83\u4f4e\uff0c\u7a7a\u95f4\u5229\u7528\u7387\u8f83\u4f4e\u3002
    "},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6811 *","text":"

    \u5728\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7ae0\u8282\u4e2d\u6211\u4eec\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u53ef\u80fd\u9000\u5316\u4e3a\u94fe\u8868\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5c06\u4ece \\(O(\\log n)\\) \u52a3\u5316\u4e3a \\(O(n)\\) \u3002

    \u5982\u56fe 7-24 \u6240\u793a\uff0c\u7ecf\u8fc7\u4e24\u6b21\u5220\u9664\u8282\u70b9\u64cd\u4f5c\uff0c\u8fd9\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\u4fbf\u4f1a\u9000\u5316\u4e3a\u94fe\u8868\u3002

    \u56fe 7-24 \u00a0 AVL \u6811\u5728\u5220\u9664\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

    \u518d\u4f8b\u5982\uff0c\u5728\u56fe 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e24\u4e2a\u8282\u70b9\u540e\uff0c\u6811\u5c06\u4e25\u91cd\u5411\u5de6\u503e\u659c\uff0c\u67e5\u627e\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u968f\u4e4b\u52a3\u5316\u3002

    \u56fe 7-25 \u00a0 AVL \u6811\u5728\u63d2\u5165\u8282\u70b9\u540e\u53d1\u751f\u9000\u5316

    1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8bba\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6811\u3002\u8bba\u6587\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u786e\u4fdd\u5728\u6301\u7eed\u6dfb\u52a0\u548c\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4e0d\u4f1a\u9000\u5316\uff0c\u4ece\u800c\u4f7f\u5f97\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7ea7\u522b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5728\u9700\u8981\u9891\u7e41\u8fdb\u884c\u589e\u5220\u67e5\u6539\u64cd\u4f5c\u7684\u573a\u666f\u4e2d\uff0cAVL \u6811\u80fd\u59cb\u7ec8\u4fdd\u6301\u9ad8\u6548\u7684\u6570\u636e\u64cd\u4f5c\u6027\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u5e94\u7528\u4ef7\u503c\u3002

    "},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6811\u5e38\u89c1\u672f\u8bed","text":"

    AVL \u6811\u65e2\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u53c9\u6811\uff0c\u540c\u65f6\u6ee1\u8db3\u8fd9\u4e24\u7c7b\u4e8c\u53c9\u6811\u7684\u6240\u6709\u6027\u8d28\uff0c\u56e0\u6b64\u662f\u4e00\u79cd\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff08balanced binary search tree\uff09\u3002

    "},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u8282\u70b9\u9ad8\u5ea6","text":"

    \u7531\u4e8e AVL \u6811\u7684\u76f8\u5173\u64cd\u4f5c\u9700\u8981\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e3a\u8282\u70b9\u7c7b\u6dfb\u52a0 height \u53d8\u91cf\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"AVL \u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u8282\u70b9\u503c\n        self.height: int = 0                # \u8282\u70b9\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nstruct TreeNode {\n    int val{};          // \u8282\u70b9\u503c\n    int height = 0;     // \u8282\u70b9\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u8282\u70b9\n    TreeNode *right{};  // \u53f3\u5b50\u8282\u70b9\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    public int val;        // \u8282\u70b9\u503c\n    public int height;     // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u8282\u70b9\n    public TreeNode right; // \u53f3\u5b50\u8282\u70b9\n    public TreeNode(int x) { val = x; }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public int height;      // \u8282\u70b9\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    /* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val    int       // \u8282\u70b9\u503c\n    Height int       // \u8282\u70b9\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var height: Int // \u8282\u70b9\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    height; //\u8282\u70b9\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;            // \u8282\u70b9\u503c\n    height: number;         // \u8282\u70b9\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right: TreeNode | null; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  int height;      // \u8282\u70b9\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    height: i32,                            // \u8282\u70b9\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
    /* AVL \u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
    /* AVL \u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val height: Int = 0          // \u8282\u70b9\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\n}\n
    ### AVL \u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :height # \u8282\u70b9\u9ad8\u5ea6\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\n
    \n

    \u201c\u8282\u70b9\u9ad8\u5ea6\u201d\u662f\u6307\u4ece\u8be5\u8282\u70b9\u5230\u5b83\u7684\u6700\u8fdc\u53f6\u8282\u70b9\u7684\u8ddd\u79bb\uff0c\u5373\u6240\u7ecf\u8fc7\u7684\u201c\u8fb9\u201d\u7684\u6570\u91cf\u3002\u9700\u8981\u7279\u522b\u6ce8\u610f\u7684\u662f\uff0c\u53f6\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(0\\) \uff0c\u800c\u7a7a\u8282\u70b9\u7684\u9ad8\u5ea6\u4e3a \\(-1\\) \u3002\u6211\u4eec\u5c06\u521b\u5efa\u4e24\u4e2a\u5de5\u5177\u51fd\u6570\uff0c\u5206\u522b\u7528\u4e8e\u83b7\u53d6\u548c\u66f4\u65b0\u8282\u70b9\u7684\u9ad8\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\"\"\"\n    # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
    avl_tree.cpp
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
    avl_tree.java
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.cs
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
    avl_tree.go
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
    avl_tree.swift
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
    avl_tree.js
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.ts
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.dart
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.rs
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
    avl_tree.c
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
    avl_tree.kt
    /* \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
    avl_tree.rb
    ### \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6 ###\ndef height(node)\n  # \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n### \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6 ###\ndef update_height(node)\n  # \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n
    avl_tree.zig
    // \u83b7\u53d6\u8282\u70b9\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u8282\u70b9\u9ad8\u5ea6\u4e3a -1 \uff0c\u53f6\u8282\u70b9\u9ad8\u5ea6\u4e3a 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u8282\u70b9\u9ad8\u5ea6\u7b49\u4e8e\u6700\u9ad8\u5b50\u6811\u9ad8\u5ea6 + 1\n    node.?.height = @max(self.height(node.?.left), self.height(node.?.right)) + 1;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2","title":"2. \u00a0 \u8282\u70b9\u5e73\u8861\u56e0\u5b50","text":"

    \u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u4e49\u4e3a\u8282\u70b9\u5de6\u5b50\u6811\u7684\u9ad8\u5ea6\u51cf\u53bb\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\uff0c\u540c\u65f6\u89c4\u5b9a\u7a7a\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4e3a \\(0\\) \u3002\u6211\u4eec\u540c\u6837\u5c06\u83b7\u53d6\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88c5\u6210\u51fd\u6570\uff0c\u65b9\u4fbf\u540e\u7eed\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u83b7\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node is None:\n        return 0\n    # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
    avl_tree.cpp
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == nullptr)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.java
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null)\n        return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
    avl_tree.cs
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
    avl_tree.go
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if node == nil {\n        return 0\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
    avl_tree.swift
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    guard let node = node else { return 0 }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
    avl_tree.js
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.ts
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node === null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.dart
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  if (node == null) return 0;\n  // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
    avl_tree.rs
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n        None => 0,\n        // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
    avl_tree.c
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.kt
    /* \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
    avl_tree.rb
    ### \u83b7\u53d6\u5e73\u8861\u56e0\u5b50 ###\ndef balance_factor(node)\n  # \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n  return 0 if node.nil?\n\n  # \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n  height(node.left) - height(node.right)\nend\n
    avl_tree.zig
    // \u83b7\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u8282\u70b9\u5e73\u8861\u56e0\u5b50\u4e3a 0\n    if (node == null) return 0;\n    // \u8282\u70b9\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6811\u9ad8\u5ea6 - \u53f3\u5b50\u6811\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

    Tip

    \u8bbe\u5e73\u8861\u56e0\u5b50\u4e3a \\(f\\) \uff0c\u5219\u4e00\u68f5 AVL \u6811\u7684\u4efb\u610f\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6ee1\u8db3 \\(-1 \\le f \\le 1\\) \u3002

    "},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6811\u65cb\u8f6c","text":"

    AVL \u6811\u7684\u7279\u70b9\u5728\u4e8e\u201c\u65cb\u8f6c\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u591f\u5728\u4e0d\u5f71\u54cd\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u65cb\u8f6c\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u53c9\u641c\u7d22\u6811\u201d\u7684\u6027\u8d28\uff0c\u4e5f\u80fd\u4f7f\u6811\u91cd\u65b0\u53d8\u4e3a\u201c\u5e73\u8861\u4e8c\u53c9\u6811\u201d\u3002

    \u6211\u4eec\u5c06\u5e73\u8861\u56e0\u5b50\u7edd\u5bf9\u503c \\(> 1\\) \u7684\u8282\u70b9\u79f0\u4e3a\u201c\u5931\u8861\u8282\u70b9\u201d\u3002\u6839\u636e\u8282\u70b9\u5931\u8861\u60c5\u51b5\u7684\u4e0d\u540c\uff0c\u65cb\u8f6c\u64cd\u4f5c\u5206\u4e3a\u56db\u79cd\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3002\u4e0b\u9762\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u65cb\u8f6c\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

    \u5982\u56fe 7-26 \u6240\u793a\uff0c\u8282\u70b9\u4e0b\u65b9\u4e3a\u5e73\u8861\u56e0\u5b50\u3002\u4ece\u5e95\u81f3\u9876\u770b\uff0c\u4e8c\u53c9\u6811\u4e2d\u9996\u4e2a\u5931\u8861\u8282\u70b9\u662f\u201c\u8282\u70b9 3\u201d\u3002\u6211\u4eec\u5173\u6ce8\u4ee5\u8be5\u5931\u8861\u8282\u70b9\u4e3a\u6839\u8282\u70b9\u7684\u5b50\u6811\uff0c\u5c06\u8be5\u8282\u70b9\u8bb0\u4e3a node \uff0c\u5176\u5de6\u5b50\u8282\u70b9\u8bb0\u4e3a child \uff0c\u6267\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u540e\uff0c\u5b50\u6811\u6062\u590d\u5e73\u8861\uff0c\u5e76\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u3002

    <1><2><3><4>

    \u56fe 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9aa4

    \u5982\u56fe 7-27 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u53f3\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u5de6\u5b50\u8282\u70b9\u3002

    \u56fe 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

    \u201c\u5411\u53f3\u65cb\u8f6c\u201d\u662f\u4e00\u79cd\u5f62\u8c61\u5316\u7684\u8bf4\u6cd5\uff0c\u5b9e\u9645\u4e0a\u9700\u8981\u901a\u8fc7\u4fee\u6539\u8282\u70b9\u6307\u9488\u6765\u5b9e\u73b0\uff0c\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u53f3\u65cb\u64cd\u4f5c\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
    avl_tree.cpp
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.java
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.cs
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.go
    /* \u53f3\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.swift
    /* \u53f3\u65cb\u64cd\u4f5c */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.js
    /* \u53f3\u65cb\u64cd\u4f5c */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.ts
    /* \u53f3\u65cb\u64cd\u4f5c */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.dart
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
    avl_tree.rs
    /* \u53f3\u65cb\u64cd\u4f5c */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u53f3\u65cb\u64cd\u4f5c */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.kt
    /* \u53f3\u65cb\u64cd\u4f5c */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.rb
    ### \u53f3\u65cb\u64cd\u4f5c ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n  child.right = node\n  node.left = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
    avl_tree.zig
    // \u53f3\u65cb\u64cd\u4f5c\nfn rightRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.left;\n    var grandChild = child.?.right;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u53f3\u65cb\u8f6c\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

    \u76f8\u5e94\u5730\uff0c\u5982\u679c\u8003\u8651\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u201c\u955c\u50cf\u201d\uff0c\u5219\u9700\u8981\u6267\u884c\u56fe 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

    \u56fe 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

    \u540c\u7406\uff0c\u5982\u56fe 7-29 \u6240\u793a\uff0c\u5f53\u8282\u70b9 child \u6709\u5de6\u5b50\u8282\u70b9\uff08\u8bb0\u4e3a grand_child \uff09\u65f6\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u6dfb\u52a0\u4e00\u6b65\uff1a\u5c06 grand_child \u4f5c\u4e3a node \u7684\u53f3\u5b50\u8282\u70b9\u3002

    \u56fe 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

    \u53ef\u4ee5\u89c2\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u903b\u8f91\u4e0a\u662f\u955c\u50cf\u5bf9\u79f0\u7684\uff0c\u5b83\u4eec\u5206\u522b\u89e3\u51b3\u7684\u4e24\u79cd\u5931\u8861\u60c5\u51b5\u4e5f\u662f\u5bf9\u79f0\u7684\u3002\u57fa\u4e8e\u5bf9\u79f0\u6027\uff0c\u6211\u4eec\u53ea\u9700\u5c06\u53f3\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u6362\u4e3a right \uff0c\u5c06\u6240\u6709\u7684 right \u66ff\u6362\u4e3a left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5b9e\u73b0\u4ee3\u7801\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u5de6\u65cb\u64cd\u4f5c\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n
    avl_tree.cpp
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.java
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.cs
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.go
    /* \u5de6\u65cb\u64cd\u4f5c */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.swift
    /* \u5de6\u65cb\u64cd\u4f5c */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.js
    /* \u5de6\u65cb\u64cd\u4f5c */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.ts
    /* \u5de6\u65cb\u64cd\u4f5c */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.dart
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return child;\n}\n
    avl_tree.rs
    /* \u5de6\u65cb\u64cd\u4f5c */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(child)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u5de6\u65cb\u64cd\u4f5c */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    avl_tree.kt
    /* \u5de6\u65cb\u64cd\u4f5c */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child\n}\n
    avl_tree.rb
    ### \u5de6\u65cb\u64cd\u4f5c ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n  child.left = node\n  node.right = grand_child\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  update_height(child)\n  # \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n  child\nend\n
    avl_tree.zig
    // \u5de6\u65cb\u64cd\u4f5c\nfn leftRotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    var child = node.?.right;\n    var grandChild = child.?.left;\n    // \u4ee5 child \u4e3a\u539f\u70b9\uff0c\u5c06 node \u5411\u5de6\u65cb\u8f6c\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f6c\u540e\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb","text":"

    \u5bf9\u4e8e\u56fe 7-30 \u4e2d\u7684\u5931\u8861\u8282\u70b9 3 \uff0c\u4ec5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u65e0\u6cd5\u4f7f\u5b50\u6811\u6062\u590d\u5e73\u8861\u3002\u6b64\u65f6\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u53f3\u65cb\u201d\u3002

    \u56fe 7-30 \u00a0 \u5148\u5de6\u65cb\u540e\u53f3\u65cb

    "},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb","text":"

    \u5982\u56fe 7-31 \u6240\u793a\uff0c\u5bf9\u4e8e\u4e0a\u8ff0\u5931\u8861\u4e8c\u53c9\u6811\u7684\u955c\u50cf\u60c5\u51b5\uff0c\u9700\u8981\u5148\u5bf9 child \u6267\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5bf9 node \u6267\u884c\u201c\u5de6\u65cb\u201d\u3002

    \u56fe 7-31 \u00a0 \u5148\u53f3\u65cb\u540e\u5de6\u65cb

    "},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f6c\u7684\u9009\u62e9","text":"

    \u56fe 7-32 \u5c55\u793a\u7684\u56db\u79cd\u5931\u8861\u60c5\u51b5\u4e0e\u4e0a\u8ff0\u6848\u4f8b\u9010\u4e2a\u5bf9\u5e94\uff0c\u5206\u522b\u9700\u8981\u91c7\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u540e\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u540e\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

    \u56fe 7-32 \u00a0 AVL \u6811\u7684\u56db\u79cd\u65cb\u8f6c\u60c5\u51b5

    \u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u4eec\u901a\u8fc7\u5224\u65ad\u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f83\u9ad8\u4e00\u4fa7\u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8d1f\u53f7\uff0c\u6765\u786e\u5b9a\u5931\u8861\u8282\u70b9\u5c5e\u4e8e\u56fe 7-32 \u4e2d\u7684\u54ea\u79cd\u60c5\u51b5\u3002

    \u8868 7-3 \u00a0 \u56db\u79cd\u65cb\u8f6c\u60c5\u51b5\u7684\u9009\u62e9\u6761\u4ef6

    \u5931\u8861\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u8282\u70b9\u7684\u5e73\u8861\u56e0\u5b50 \u5e94\u91c7\u7528\u7684\u65cb\u8f6c\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6811\uff09 \\(<0\\) \u5148\u5de6\u65cb\u540e\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6811\uff09 \\(>0\\) \u5148\u53f3\u65cb\u540e\u5de6\u65cb

    \u4e3a\u4e86\u4fbf\u4e8e\u4f7f\u7528\uff0c\u6211\u4eec\u5c06\u65cb\u8f6c\u64cd\u4f5c\u5c01\u88c5\u6210\u4e00\u4e2a\u51fd\u6570\u3002\u6709\u4e86\u8fd9\u4e2a\u51fd\u6570\uff0c\u6211\u4eec\u5c31\u80fd\u5bf9\u5404\u79cd\u5931\u8861\u60c5\u51b5\u8fdb\u884c\u65cb\u8f6c\uff0c\u4f7f\u5931\u8861\u8282\u70b9\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\"\"\"\n    # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6811\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u53f3\u65cb\n            return self.right_rotate(node)\n        else:\n            # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6811\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u5de6\u65cb\n            return self.left_rotate(node)\n        else:\n            # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
    avl_tree.cpp
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.java
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.cs
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.go
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u8350\u77ed\u53d8\u91cf\uff0c\u8fd9\u91cc bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u53f3\u65cb\n            return t.rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u5de6\u65cb\n            return t.leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.swift
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6811\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u53f3\u65cb\n            return rightRotate(node: node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u5de6\u65cb\n            return leftRotate(node: node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.js
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n#rotate(node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.#rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.#leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.ts
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return this.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return this.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.dart
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6811\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6811\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
    avl_tree.rs
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6811\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u53f3\u65cb\n            Self::right_rotate(Some(node))\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u53f3\u504f\u6811\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u5de6\u65cb\n            Self::left_rotate(Some(node))\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
    avl_tree.c
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.kt
    /* \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6811\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.rb
    ### \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 ###\ndef rotate(node)\n  # \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n  balance_factor = balance_factor(node)\n  # \u5de6\u904d\u6811\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u53f3\u65cb\n      return right_rotate(node)\n    else\n      # \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u53f3\u904d\u6811\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u5de6\u65cb\n      return left_rotate(node)\n    else\n      # \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n  node\nend\n
    avl_tree.zig
    // \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u83b7\u53d6\u8282\u70b9 node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6811\n    if (balance_factor > 1) {\n        if (self.balanceFactor(node.?.left) >= 0) {\n            // \u53f3\u65cb\n            return self.rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u540e\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6811\n    if (balance_factor < -1) {\n        if (self.balanceFactor(node.?.right) <= 0) {\n            // \u5de6\u65cb\n            return self.leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u540e\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6811\uff0c\u65e0\u987b\u65cb\u8f6c\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6811\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

    AVL \u6811\u7684\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u5728\u4e3b\u4f53\u4e0a\u7c7b\u4f3c\u3002\u552f\u4e00\u7684\u533a\u522b\u5728\u4e8e\uff0c\u5728 AVL \u6811\u4e2d\u63d2\u5165\u8282\u70b9\u540e\uff0c\u4ece\u8be5\u8282\u70b9\u5230\u6839\u8282\u70b9\u7684\u8def\u5f84\u4e0a\u53ef\u80fd\u4f1a\u51fa\u73b0\u4e00\u7cfb\u5217\u5931\u8861\u8282\u70b9\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4ece\u8fd9\u4e2a\u8282\u70b9\u5f00\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def insert(self, val):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.java
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.cs
    /* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.go
    /* \u63d2\u5165\u8282\u70b9 */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.swift
    /* \u63d2\u5165\u8282\u70b9 */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.js
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.ts
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.dart
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
    avl_tree.rs
    /* \u63d2\u5165\u8282\u70b9 */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
    avl_tree.c
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.kt
    /* \u63d2\u5165\u8282\u70b9 */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9 */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.rb
    ### \u63d2\u5165\u8282\u70b9 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n### \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
    avl_tree.zig
    // \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u9012\u5f52\u63d2\u5165\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn insertHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) !?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) {\n        var tmp_node = try self.mem_allocator.create(inc.TreeNode(T));\n        tmp_node.init(val);\n        return tmp_node;\n    }\n    // 1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\u5e76\u63d2\u5165\u8282\u70b9\n    if (val < node.?.val) {\n        node.?.left = try self.insertHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = try self.insertHelper(node.?.right, val);\n    } else {\n        return node;            // \u91cd\u590d\u8282\u70b9\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u5220\u9664\u8282\u70b9","text":"

    \u7c7b\u4f3c\u5730\uff0c\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5220\u9664\u8282\u70b9\u65b9\u6cd5\u7684\u57fa\u7840\u4e0a\uff0c\u9700\u8981\u4ece\u5e95\u81f3\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u8282\u70b9\u6062\u590d\u5e73\u8861\u3002\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def remove(self, val: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.java
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.cs
    /* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.go
    /* \u5220\u9664\u8282\u70b9 */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.swift
    /* \u5220\u9664\u8282\u70b9 */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.js
    /* \u5220\u9664\u8282\u70b9 */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.ts
    /* \u5220\u9664\u8282\u70b9 */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.dart
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n  return node;\n}\n
    avl_tree.rs
    /* \u5220\u9664\u8282\u70b9 */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n\n            /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n            Some(node)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u51fd\u6570\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    avl_tree.kt
    /* \u5220\u9664\u8282\u70b9 */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664 */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    /* 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node\n}\n
    avl_tree.rb
    ### \u5220\u9664\u8282\u70b9 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n### \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n      return if child.nil?\n      # \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n      node = child\n    else\n      # \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n  update_height(node)\n  # 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n  rotate(node)\nend\n
    avl_tree.zig
    // \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u9012\u5f52\u5220\u9664\u8282\u70b9\uff08\u8f85\u52a9\u65b9\u6cd5\uff09\nfn removeHelper(self: *Self, node_: ?*inc.TreeNode(T), val: T) ?*inc.TreeNode(T) {\n    var node = node_;\n    if (node == null) return null;\n    // 1. \u67e5\u627e\u8282\u70b9\u5e76\u5220\u9664\n    if (val < node.?.val) {\n        node.?.left = self.removeHelper(node.?.left, val);\n    } else if (val > node.?.val) {\n        node.?.right = self.removeHelper(node.?.right, val);\n    } else {\n        if (node.?.left == null or node.?.right == null) {\n            var child = if (node.?.left != null) node.?.left else node.?.right;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 0 \uff0c\u76f4\u63a5\u5220\u9664 node \u5e76\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u8282\u70b9\u6570\u91cf = 1 \uff0c\u76f4\u63a5\u5220\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u8282\u70b9\u6570\u91cf = 2 \uff0c\u5219\u5c06\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e2a\u8282\u70b9\u5220\u9664\uff0c\u5e76\u7528\u8be5\u8282\u70b9\u66ff\u6362\u5f53\u524d\u8282\u70b9\n            var temp = node.?.right;\n            while (temp.?.left != null) {\n                temp = temp.?.left;\n            }\n            node.?.right = self.removeHelper(node.?.right, temp.?.val);\n            node.?.val = temp.?.val;\n        }\n    }\n    self.updateHeight(node); // \u66f4\u65b0\u8282\u70b9\u9ad8\u5ea6\n    // 2. \u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u8be5\u5b50\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6811\u7684\u6839\u8282\u70b9\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

    AVL \u6811\u7684\u8282\u70b9\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u53c9\u641c\u7d22\u6811\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d58\u8ff0\u3002

    "},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6811\u5178\u578b\u5e94\u7528","text":"
    • \u7ec4\u7ec7\u548c\u5b58\u50a8\u5927\u578b\u6570\u636e\uff0c\u9002\u7528\u4e8e\u9ad8\u9891\u67e5\u627e\u3001\u4f4e\u9891\u589e\u5220\u7684\u573a\u666f\u3002
    • \u7528\u4e8e\u6784\u5efa\u6570\u636e\u5e93\u4e2d\u7684\u7d22\u5f15\u7cfb\u7edf\u3002
    • \u7ea2\u9ed1\u6811\u4e5f\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\u3002\u76f8\u8f83\u4e8e AVL \u6811\uff0c\u7ea2\u9ed1\u6811\u7684\u5e73\u8861\u6761\u4ef6\u66f4\u5bbd\u677e\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u6240\u9700\u7684\u65cb\u8f6c\u64cd\u4f5c\u66f4\u5c11\uff0c\u8282\u70b9\u589e\u5220\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    "},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811","text":"

    \u5982\u56fe 7-16 \u6240\u793a\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\uff08binary search tree\uff09\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u3002

    1. \u5bf9\u4e8e\u6839\u8282\u70b9\uff0c\u5de6\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c \\(<\\) \u6839\u8282\u70b9\u7684\u503c \\(<\\) \u53f3\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u7684\u503c\u3002
    2. \u4efb\u610f\u8282\u70b9\u7684\u5de6\u3001\u53f3\u5b50\u6811\u4e5f\u662f\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5373\u540c\u6837\u6ee1\u8db3\u6761\u4ef6 1. \u3002

    \u56fe 7-16 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811

    "},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u64cd\u4f5c","text":"

    \u6211\u4eec\u5c06\u4e8c\u53c9\u641c\u7d22\u6811\u5c01\u88c5\u4e3a\u4e00\u4e2a\u7c7b BinarySearchTree \uff0c\u5e76\u58f0\u660e\u4e00\u4e2a\u6210\u5458\u53d8\u91cf root \uff0c\u6307\u5411\u6811\u7684\u6839\u8282\u70b9\u3002

    "},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u627e\u8282\u70b9","text":"

    \u7ed9\u5b9a\u76ee\u6807\u8282\u70b9\u503c num \uff0c\u53ef\u4ee5\u6839\u636e\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6027\u8d28\u6765\u67e5\u627e\u3002\u5982\u56fe 7-17 \u6240\u793a\uff0c\u6211\u4eec\u58f0\u660e\u4e00\u4e2a\u8282\u70b9 cur \uff0c\u4ece\u4e8c\u53c9\u6811\u7684\u6839\u8282\u70b9 root \u51fa\u53d1\uff0c\u5faa\u73af\u6bd4\u8f83\u8282\u70b9\u503c cur.val \u548c num \u4e4b\u95f4\u7684\u5927\u5c0f\u5173\u7cfb\u3002

    • \u82e5 cur.val < num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.right \u3002
    • \u82e5 cur.val > num \uff0c\u8bf4\u660e\u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\uff0c\u56e0\u6b64\u6267\u884c cur = cur.left \u3002
    • \u82e5 cur.val = num \uff0c\u8bf4\u660e\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\u5e76\u8fd4\u56de\u8be5\u8282\u70b9\u3002
    <1><2><3><4>

    \u56fe 7-17 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u67e5\u627e\u8282\u70b9\u793a\u4f8b

    \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u67e5\u627e\u64cd\u4f5c\u4e0e\u4e8c\u5206\u67e5\u627e\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f6e\u6392\u9664\u4e00\u534a\u60c5\u51b5\u3002\u5faa\u73af\u6b21\u6570\u6700\u591a\u4e3a\u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff0c\u5f53\u4e8c\u53c9\u6811\u5e73\u8861\u65f6\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u627e\u8282\u70b9\"\"\"\n    cur = self._root\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else:\n            break\n    return cur\n
    binary_search_tree.cpp
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.java
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.cs
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.go
    /* \u67e5\u627e\u8282\u70b9 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return node\n}\n
    binary_search_tree.swift
    /* \u67e5\u627e\u8282\u70b9 */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
    binary_search_tree.js
    /* \u67e5\u627e\u8282\u70b9 */\nsearch(num) {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.ts
    /* \u67e5\u627e\u8282\u70b9 */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.dart
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n  return cur;\n}\n
    binary_search_tree.rs
    /* \u67e5\u627e\u8282\u70b9 */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    cur\n}\n
    binary_search_tree.c
    /* \u67e5\u627e\u8282\u70b9 */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    binary_search_tree.kt
    /* \u67e5\u627e\u8282\u70b9 */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur\n}\n
    binary_search_tree.rb
    ### \u67e5\u627e\u8282\u70b9 ###\ndef search(num)\n  cur = @root\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while !cur.nil?\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    elsif cur.val > num\n      cur = cur.left\n    # \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    else\n      break\n    end\n  end\n\n  cur\nend\n
    binary_search_tree.zig
    // \u67e5\u627e\u8282\u70b9\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6807\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6807\u8282\u70b9\n    return cur;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8282\u70b9","text":"

    \u7ed9\u5b9a\u4e00\u4e2a\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u4e3a\u4e86\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-18 \u6240\u793a\u3002

    1. \u67e5\u627e\u63d2\u5165\u4f4d\u7f6e\uff1a\u4e0e\u67e5\u627e\u64cd\u4f5c\u76f8\u4f3c\uff0c\u4ece\u6839\u8282\u70b9\u51fa\u53d1\uff0c\u6839\u636e\u5f53\u524d\u8282\u70b9\u503c\u548c num \u7684\u5927\u5c0f\u5173\u7cfb\u5faa\u73af\u5411\u4e0b\u641c\u7d22\uff0c\u76f4\u5230\u8d8a\u8fc7\u53f6\u8282\u70b9\uff08\u904d\u5386\u81f3 None \uff09\u65f6\u8df3\u51fa\u5faa\u73af\u3002
    2. \u5728\u8be5\u4f4d\u7f6e\u63d2\u5165\u8282\u70b9\uff1a\u521d\u59cb\u5316\u8282\u70b9 num \uff0c\u5c06\u8be5\u8282\u70b9\u7f6e\u4e8e None \u7684\u4f4d\u7f6e\u3002

    \u56fe 7-18 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u63d2\u5165\u8282\u70b9

    \u5728\u4ee3\u7801\u5b9e\u73b0\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9\u3002

    • \u4e8c\u53c9\u641c\u7d22\u6811\u4e0d\u5141\u8bb8\u5b58\u5728\u91cd\u590d\u8282\u70b9\uff0c\u5426\u5219\u5c06\u8fdd\u53cd\u5176\u5b9a\u4e49\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u8282\u70b9\u5728\u6811\u4e2d\u5df2\u5b58\u5728\uff0c\u5219\u4e0d\u6267\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
    • \u4e3a\u4e86\u5b9e\u73b0\u63d2\u5165\u8282\u70b9\uff0c\u6211\u4eec\u9700\u8981\u501f\u52a9\u8282\u70b9 pre \u4fdd\u5b58\u4e0a\u4e00\u8f6e\u5faa\u73af\u7684\u8282\u70b9\u3002\u8fd9\u6837\u5728\u904d\u5386\u81f3 None \u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u83b7\u53d6\u5230\u5176\u7236\u8282\u70b9\uff0c\u4ece\u800c\u5b8c\u6210\u8282\u70b9\u63d2\u5165\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur.val == num:\n            return\n        pre = cur\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u8282\u70b9\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
    binary_search_tree.cpp
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
    binary_search_tree.java
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
    binary_search_tree.cs
    /* \u63d2\u5165\u8282\u70b9 */\nvoid Insert(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
    binary_search_tree.go
    /* \u63d2\u5165\u8282\u70b9 */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
    binary_search_tree.swift
    /* \u63d2\u5165\u8282\u70b9 */\nfunc insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
    binary_search_tree.js
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
    binary_search_tree.ts
    /* \u63d2\u5165\u8282\u70b9 */\ninsert(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u8282\u70b9\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
    binary_search_tree.dart
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u8282\u70b9\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
    binary_search_tree.rs
    /* \u63d2\u5165\u8282\u70b9 */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
    binary_search_tree.c
    /* \u63d2\u5165\u8282\u70b9 */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
    binary_search_tree.kt
    /* \u63d2\u5165\u8282\u70b9 */\nfun insert(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u8282\u70b9\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n
    binary_search_tree.rb
    ### \u63d2\u5165\u8282\u70b9 ###\ndef insert(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n    return if cur.val == num\n\n    pre = cur\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u63d2\u5165\u8282\u70b9\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n
    binary_search_tree.zig
    // \u63d2\u5165\u8282\u70b9\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u5219\u521d\u59cb\u5316\u6839\u8282\u70b9\n    if (self.root == null) {\n        self.root = try self.mem_allocator.create(inc.TreeNode(T));\n        return;\n    }\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u590d\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u8282\u70b9\n    var node = try self.mem_allocator.create(inc.TreeNode(T));\n    node.init(num);\n    if (pre.?.val < num) {\n        pre.?.right = node;\n    } else {\n        pre.?.left = node;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    \u4e0e\u67e5\u627e\u8282\u70b9\u76f8\u540c\uff0c\u63d2\u5165\u8282\u70b9\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\u3002

    "},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u5220\u9664\u8282\u70b9","text":"

    \u5148\u5728\u4e8c\u53c9\u6811\u4e2d\u67e5\u627e\u5230\u76ee\u6807\u8282\u70b9\uff0c\u518d\u5c06\u5176\u5220\u9664\u3002\u4e0e\u63d2\u5165\u8282\u70b9\u7c7b\u4f3c\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u5728\u5220\u9664\u64cd\u4f5c\u5b8c\u6210\u540e\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u201c\u5de6\u5b50\u6811 < \u6839\u8282\u70b9 < \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\u4ecd\u7136\u6ee1\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u6839\u636e\u76ee\u6807\u8282\u70b9\u7684\u5b50\u8282\u70b9\u6570\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u79cd\u60c5\u51b5\uff0c\u6267\u884c\u5bf9\u5e94\u7684\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u3002

    \u5982\u56fe 7-19 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \u65f6\uff0c\u8868\u793a\u8be5\u8282\u70b9\u662f\u53f6\u8282\u70b9\uff0c\u53ef\u4ee5\u76f4\u63a5\u5220\u9664\u3002

    \u56fe 7-19 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 0 \uff09

    \u5982\u56fe 7-20 \u6240\u793a\uff0c\u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(1\\) \u65f6\uff0c\u5c06\u5f85\u5220\u9664\u8282\u70b9\u66ff\u6362\u4e3a\u5176\u5b50\u8282\u70b9\u5373\u53ef\u3002

    \u56fe 7-20 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 1 \uff09

    \u5f53\u5f85\u5220\u9664\u8282\u70b9\u7684\u5ea6\u4e3a \\(2\\) \u65f6\uff0c\u6211\u4eec\u65e0\u6cd5\u76f4\u63a5\u5220\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u4e2a\u8282\u70b9\u66ff\u6362\u8be5\u8282\u70b9\u3002\u7531\u4e8e\u8981\u4fdd\u6301\u4e8c\u53c9\u641c\u7d22\u6811\u201c\u5de6\u5b50\u6811 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u6811\u201d\u7684\u6027\u8d28\uff0c\u56e0\u6b64\u8fd9\u4e2a\u8282\u70b9\u53ef\u4ee5\u662f\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\u6216\u5de6\u5b50\u6811\u7684\u6700\u5927\u8282\u70b9\u3002

    \u5047\u8bbe\u6211\u4eec\u9009\u62e9\u53f3\u5b50\u6811\u7684\u6700\u5c0f\u8282\u70b9\uff08\u4e2d\u5e8f\u904d\u5386\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff09\uff0c\u5219\u5220\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u56fe 7-21 \u6240\u793a\u3002

    1. \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\u5728\u201c\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\uff0c\u8bb0\u4e3a tmp \u3002
    2. \u7528 tmp \u7684\u503c\u8986\u76d6\u5f85\u5220\u9664\u8282\u70b9\u7684\u503c\uff0c\u5e76\u5728\u6811\u4e2d\u9012\u5f52\u5220\u9664\u8282\u70b9 tmp \u3002
    <1><2><3><4>

    \u56fe 7-21 \u00a0 \u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u5220\u9664\u8282\u70b9\uff08\u5ea6\u4e3a 2 \uff09

    \u5220\u9664\u8282\u70b9\u64cd\u4f5c\u540c\u6837\u4f7f\u7528 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d\u67e5\u627e\u5f85\u5220\u9664\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\uff0c\u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u540e\u7ee7\u8282\u70b9\u9700\u8981 \\(O(\\log n)\\) \u65f6\u95f4\u3002\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def remove(self, num: int):\n    \"\"\"\u5220\u9664\u8282\u70b9\"\"\"\n    # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        child = cur.left or cur.right\n        # \u5220\u9664\u8282\u70b9 cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            self._root = child\n    # \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else:\n        # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val\n
    binary_search_tree.cpp
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        delete cur;\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.java
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.cs
    /* \u5220\u9664\u8282\u70b9 */\nvoid Remove(int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        TreeNode? child = cur.left ?? cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.go
    /* \u5220\u9664\u8282\u70b9 */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u5220\u9664\u8282\u70b9\u4e4b\u524d\u7684\u8282\u70b9\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u53f3\u5b50\u6811\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728\u5de6\u5b50\u6811\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u4e3a 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u5220\u9664\u8282\u70b9\u7684\u5b50\u8282\u70b9\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            bst.root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u4e3a 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d\u5f85\u5220\u9664\u8282\u70b9 cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.Val = tmp.Val\n    }\n}\n
    binary_search_tree.swift
    /* \u5220\u9664\u8282\u70b9 */\nfunc remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        let child = cur?.left ?? cur?.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur?.val = tmp!.val\n    }\n}\n
    binary_search_tree.js
    /* \u5220\u9664\u8282\u70b9 */\nremove(num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.ts
    /* \u5220\u9664\u8282\u70b9 */\nremove(num: number): void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            this.root = child;\n        }\n    }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.val = tmp!.val;\n    }\n}\n
    binary_search_tree.dart
    /* \u5220\u9664\u8282\u70b9 */\nvoid remove(int _num) {\n  // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    TreeNode? child = cur.left ?? cur.right;\n    // \u5220\u9664\u8282\u70b9 cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      _root = child;\n    }\n  } else {\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val;\n  }\n}\n
    binary_search_tree.rs
    /* \u5220\u9664\u8282\u70b9 */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n            Ordering::Equal => break,\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u5220\u9664\u8282\u70b9 cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n                self.root = child;\n            }\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmpval = tmp.unwrap().borrow().val;\n            // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u76d6 cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
    binary_search_tree.c
    /* \u5220\u9664\u8282\u70b9 */\n// \u7531\u4e8e\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u5904\u65e0\u6cd5\u4f7f\u7528 remove \u5173\u952e\u8bcd\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u53f3\u5b50\u6811\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u5220\u9664\u8282\u70b9\u5728 root \u7684\u5de6\u5b50\u6811\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65ad\u5f85\u5220\u9664\u8282\u70b9\u662f\u5426\u5b58\u5728\u5b50\u8282\u70b9\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1 */\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = nullptr / \u8be5\u5b50\u8282\u70b9\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91ca\u653e\u5185\u5b58\n        free(cur);\n    } else {\n        /* \u5b50\u8282\u70b9\u6570\u91cf = 2 */\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.kt
    /* \u5220\u9664\u8282\u70b9 */\nfun remove(num: Int) {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u5220\u9664\u8282\u70b9 cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n            root = child\n        }\n        // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u76d6 cur\n        cur._val = tmp._val\n    }\n}\n
    binary_search_tree.rb
    ### \u5220\u9664\u8282\u70b9 ###\ndef remove(num)\n  # \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  return if @root.nil?\n\n  # \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n    break if cur.val == num\n\n    pre = cur\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n    if cur.val < num\n      cur = cur.right\n    # \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n    else\n      cur = cur.left\n    end\n  end\n  # \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n  return if cur.nil?\n\n  # \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n  if cur.left.nil? || cur.right.nil?\n    # \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n    child = cur.left || cur.right\n    # \u5220\u9664\u8282\u70b9 cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u82e5\u5220\u9664\u8282\u70b9\u4e3a\u6839\u8282\u70b9\uff0c\u5219\u91cd\u65b0\u6307\u5b9a\u6839\u8282\u70b9\n      @root = child\n    end\n  # \u5b50\u8282\u70b9\u6570\u91cf = 2\n  else\n    # \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n    remove(tmp.val)\n    # \u7528 tmp \u8986\u76d6 cur\n    cur.val = tmp.val\n  end\nend\n
    binary_search_tree.zig
    // \u5220\u9664\u8282\u70b9\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6811\u4e3a\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (self.root == null) return;\n    var cur = self.root;\n    var pre: ?*inc.TreeNode(T) = null;\n    // \u5faa\u73af\u67e5\u627e\uff0c\u8d8a\u8fc7\u53f6\u8282\u70b9\u540e\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u5220\u9664\u8282\u70b9\uff0c\u8df3\u51fa\u5faa\u73af\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u53f3\u5b50\u6811\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u5220\u9664\u8282\u70b9\u5728 cur \u7684\u5de6\u5b50\u6811\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u65e0\u5f85\u5220\u9664\u8282\u70b9\uff0c\u5219\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u8282\u70b9\u6570\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u5f53\u5b50\u8282\u70b9\u6570\u91cf = 0 / 1 \u65f6\uff0c child = null / \u8be5\u5b50\u8282\u70b9\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u5220\u9664\u8282\u70b9 cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u8282\u70b9\u6570\u91cf = 2\n    } else {\n        // \u83b7\u53d6\u4e2d\u5e8f\u904d\u5386\u4e2d cur \u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u9012\u5f52\u5220\u9664\u8282\u70b9 tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u76d6 cur\n        cur.?.val = tmp_val;\n    }\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u904d\u5386\u6709\u5e8f","text":"

    \u5982\u56fe 7-22 \u6240\u793a\uff0c\u4e8c\u53c9\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u904d\u5386\u987a\u5e8f\uff0c\u800c\u4e8c\u53c9\u641c\u7d22\u6811\u6ee1\u8db3\u201c\u5de6\u5b50\u8282\u70b9 \\(<\\) \u6839\u8282\u70b9 \\(<\\) \u53f3\u5b50\u8282\u70b9\u201d\u7684\u5927\u5c0f\u5173\u7cfb\u3002

    \u8fd9\u610f\u5473\u7740\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u8fdb\u884c\u4e2d\u5e8f\u904d\u5386\u65f6\uff0c\u603b\u662f\u4f1a\u4f18\u5148\u904d\u5386\u4e0b\u4e00\u4e2a\u6700\u5c0f\u8282\u70b9\uff0c\u4ece\u800c\u5f97\u51fa\u4e00\u4e2a\u91cd\u8981\u6027\u8d28\uff1a\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

    \u5229\u7528\u4e2d\u5e8f\u904d\u5386\u5347\u5e8f\u7684\u6027\u8d28\uff0c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u83b7\u53d6\u6709\u5e8f\u6570\u636e\u4ec5\u9700 \\(O(n)\\) \u65f6\u95f4\uff0c\u65e0\u987b\u8fdb\u884c\u989d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

    \u56fe 7-22 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u4e2d\u5e8f\u904d\u5386\u5e8f\u5217

    "},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387","text":"

    \u7ed9\u5b9a\u4e00\u7ec4\u6570\u636e\uff0c\u6211\u4eec\u8003\u8651\u4f7f\u7528\u6570\u7ec4\u6216\u4e8c\u53c9\u641c\u7d22\u6811\u5b58\u50a8\u3002\u89c2\u5bdf\u8868 7-2 \uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u5404\u9879\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u90fd\u662f\u5bf9\u6570\u9636\uff0c\u5177\u6709\u7a33\u5b9a\u4e14\u9ad8\u6548\u7684\u6027\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u9891\u6dfb\u52a0\u3001\u4f4e\u9891\u67e5\u627e\u5220\u9664\u6570\u636e\u7684\u573a\u666f\u4e0b\uff0c\u6570\u7ec4\u6bd4\u4e8c\u53c9\u641c\u7d22\u6811\u7684\u6548\u7387\u66f4\u9ad8\u3002

    \u8868 7-2 \u00a0 \u6570\u7ec4\u4e0e\u641c\u7d22\u6811\u7684\u6548\u7387\u5bf9\u6bd4

    \u65e0\u5e8f\u6570\u7ec4 \u4e8c\u53c9\u641c\u7d22\u6811 \u67e5\u627e\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u5220\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

    \u5728\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u4e8c\u53c9\u641c\u7d22\u6811\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f6e\u5faa\u73af\u5185\u67e5\u627e\u4efb\u610f\u8282\u70b9\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u4eec\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\u4e0d\u65ad\u5730\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\uff0c\u53ef\u80fd\u5bfc\u81f4\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u56fe 7-23 \u6240\u793a\u7684\u94fe\u8868\uff0c\u8fd9\u65f6\u5404\u79cd\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e5f\u4f1a\u9000\u5316\u4e3a \\(O(n)\\) \u3002

    \u56fe 7-23 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316

    "},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u5e38\u89c1\u5e94\u7528","text":"
    • \u7528\u4f5c\u7cfb\u7edf\u4e2d\u7684\u591a\u7ea7\u7d22\u5f15\uff0c\u5b9e\u73b0\u9ad8\u6548\u7684\u67e5\u627e\u3001\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u3002
    • \u4f5c\u4e3a\u67d0\u4e9b\u641c\u7d22\u7b97\u6cd5\u7684\u5e95\u5c42\u6570\u636e\u7ed3\u6784\u3002
    • \u7528\u4e8e\u5b58\u50a8\u6570\u636e\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72b6\u6001\u3002
    "},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u53c9\u6811","text":"

    \u4e8c\u53c9\u6811\uff08binary tree\uff09\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u4e0e\u201c\u540e\u4ee3\u201d\u4e4b\u95f4\u7684\u6d3e\u751f\u5173\u7cfb\uff0c\u4f53\u73b0\u4e86\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u4e8c\u53c9\u6811\u7684\u57fa\u672c\u5355\u5143\u662f\u8282\u70b9\uff0c\u6bcf\u4e2a\u8282\u70b9\u5305\u542b\u503c\u3001\u5de6\u5b50\u8282\u70b9\u5f15\u7528\u548c\u53f3\u5b50\u8282\u70b9\u5f15\u7528\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"\u4e8c\u53c9\u6811\u8282\u70b9\u7c7b\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u8282\u70b9\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    int val;          // \u8282\u70b9\u503c\n    TreeNode *left;   // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode *right;  // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    int val;         // \u8282\u70b9\u503c\n    TreeNode left;   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u8282\u70b9\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u6784\u9020\u65b9\u6cd5 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n        Right: nil, // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n        Val:   v,   // \u8282\u70b9\u503c\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    var val: Int // \u8282\u70b9\u503c\n    var left: TreeNode? // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val; // \u8282\u70b9\u503c\n    left; // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // \u8282\u70b9\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode {\n  int val;         // \u8282\u70b9\u503c\n  TreeNode? left;  // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\nstruct TreeNode {\n    val: i32,                               // \u8282\u70b9\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u6784\u9020\u65b9\u6cd5 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7ed3\u6784\u4f53 */\ntypedef struct TreeNode {\n    int val;                // \u8282\u70b9\u503c\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u8282\u70b9\u6307\u9488\n    struct TreeNode *right; // \u53f3\u5b50\u8282\u70b9\u6307\u9488\n} TreeNode;\n\n/* \u6784\u9020\u51fd\u6570 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
    /* \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b */\nclass TreeNode(val _val: Int) {  // \u8282\u70b9\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n}\n
    ### \u4e8c\u53c9\u6811\u8282\u70b9\u7c7b ###\nclass TreeNode\n  attr_accessor :val    # \u8282\u70b9\u503c\n  attr_accessor :left   # \u5de6\u5b50\u8282\u70b9\u5f15\u7528\n  attr_accessor :right  # \u53f3\u5b50\u8282\u70b9\u5f15\u7528\n\n  def initialize(val)\n    @val = val\n  end\nend\n
    \n

    \u6bcf\u4e2a\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5f15\u7528\uff08\u6307\u9488\uff09\uff0c\u5206\u522b\u6307\u5411\u5de6\u5b50\u8282\u70b9\uff08left-child node\uff09\u548c\u53f3\u5b50\u8282\u70b9\uff08right-child node\uff09\uff0c\u8be5\u8282\u70b9\u88ab\u79f0\u4e3a\u8fd9\u4e24\u4e2a\u5b50\u8282\u70b9\u7684\u7236\u8282\u70b9\uff08parent node\uff09\u3002\u5f53\u7ed9\u5b9a\u4e00\u4e2a\u4e8c\u53c9\u6811\u7684\u8282\u70b9\u65f6\uff0c\u6211\u4eec\u5c06\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\u5b50\u6811\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6811\uff08right subtree\uff09\u3002

    \u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u9664\u53f6\u8282\u70b9\u5916\uff0c\u5176\u4ed6\u6240\u6709\u8282\u70b9\u90fd\u5305\u542b\u5b50\u8282\u70b9\u548c\u975e\u7a7a\u5b50\u6811\u3002\u5982\u56fe 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c06\u201c\u8282\u70b9 2\u201d\u89c6\u4e3a\u7236\u8282\u70b9\uff0c\u5219\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u5206\u522b\u662f\u201c\u8282\u70b9 4\u201d\u548c\u201c\u8282\u70b9 5\u201d\uff0c\u5de6\u5b50\u6811\u662f\u201c\u8282\u70b9 4 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\uff0c\u53f3\u5b50\u6811\u662f\u201c\u8282\u70b9 5 \u53ca\u5176\u4ee5\u4e0b\u8282\u70b9\u5f62\u6210\u7684\u6811\u201d\u3002

    \u56fe 7-1 \u00a0 \u7236\u8282\u70b9\u3001\u5b50\u8282\u70b9\u3001\u5b50\u6811

    "},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u53c9\u6811\u5e38\u89c1\u672f\u8bed","text":"

    \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed\u5982\u56fe 7-2 \u6240\u793a\u3002

    • \u6839\u8282\u70b9\uff08root node\uff09\uff1a\u4f4d\u4e8e\u4e8c\u53c9\u6811\u9876\u5c42\u7684\u8282\u70b9\uff0c\u6ca1\u6709\u7236\u8282\u70b9\u3002
    • \u53f6\u8282\u70b9\uff08leaf node\uff09\uff1a\u6ca1\u6709\u5b50\u8282\u70b9\u7684\u8282\u70b9\uff0c\u5176\u4e24\u4e2a\u6307\u9488\u5747\u6307\u5411 None \u3002
    • \u8fb9\uff08edge\uff09\uff1a\u8fde\u63a5\u4e24\u4e2a\u8282\u70b9\u7684\u7ebf\u6bb5\uff0c\u5373\u8282\u70b9\u5f15\u7528\uff08\u6307\u9488\uff09\u3002
    • \u8282\u70b9\u6240\u5728\u7684\u5c42\uff08level\uff09\uff1a\u4ece\u9876\u81f3\u5e95\u9012\u589e\uff0c\u6839\u8282\u70b9\u6240\u5728\u5c42\u4e3a 1 \u3002
    • \u8282\u70b9\u7684\u5ea6\uff08degree\uff09\uff1a\u8282\u70b9\u7684\u5b50\u8282\u70b9\u7684\u6570\u91cf\u3002\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u8303\u56f4\u662f 0\u30011\u30012 \u3002
    • \u4e8c\u53c9\u6811\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u6700\u8fdc\u53f6\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
    • \u8282\u70b9\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u4ece\u6839\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002
    • \u8282\u70b9\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u4ece\u8ddd\u79bb\u8be5\u8282\u70b9\u6700\u8fdc\u7684\u53f6\u8282\u70b9\u5230\u8be5\u8282\u70b9\u6240\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u3002

    \u56fe 7-2 \u00a0 \u4e8c\u53c9\u6811\u7684\u5e38\u7528\u672f\u8bed

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u901a\u5e38\u5c06\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u9898\u76ee\u6216\u6559\u6750\u53ef\u80fd\u4f1a\u5c06\u5176\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8282\u70b9\u7684\u6570\u91cf\u201d\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u9ad8\u5ea6\u548c\u6df1\u5ea6\u90fd\u9700\u8981\u52a0 1 \u3002

    "},{"location":"chapter_tree/binary_tree/#712","title":"7.1.2 \u00a0 \u4e8c\u53c9\u6811\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u53c9\u6811","text":"

    \u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u8282\u70b9\uff0c\u7136\u540e\u6784\u5efa\u5f15\u7528\uff08\u6307\u9488\uff09\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.cpp
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.java
    // \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.cs
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.go
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
    binary_tree.swift
    // \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.js
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.ts
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.dart
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.rs
    // \u521d\u59cb\u5316\u8282\u70b9\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
    binary_tree.c
    /* \u521d\u59cb\u5316\u4e8c\u53c9\u6811 */\n// \u521d\u59cb\u5316\u8282\u70b9\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.kt
    // \u521d\u59cb\u5316\u8282\u70b9\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.rb
    # \u521d\u59cb\u5316\u4e8c\u53c9\u6811\n# \u521d\u59cb\u5316\u8282\u70b9\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.new(5)\n# \u6784\u5efa\u8282\u70b9\u4e4b\u95f4\u7684\u5f15\u7528\uff08\u6307\u9488\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9","text":"

    \u4e0e\u94fe\u8868\u7c7b\u4f3c\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539\u6307\u9488\u6765\u5b9e\u73b0\u3002\u56fe 7-3 \u7ed9\u51fa\u4e86\u4e00\u4e2a\u793a\u4f8b\u3002

    \u56fe 7-3 \u00a0 \u5728\u4e8c\u53c9\u6811\u4e2d\u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = p\np.left = n2\n# \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
    binary_tree.cpp
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
    binary_tree.java
    TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.cs
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.go
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.Left = n2\n
    binary_tree.swift
    let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
    binary_tree.js
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.ts
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.dart
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P;\nP.left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2;\n
    binary_tree.rs
    let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u5220\u9664\u8282\u70b9 p\nn1.borrow_mut().left = Some(n2);\n
    binary_tree.c
    /* \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9 */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1->left = P;\nP->left = n2;\n// \u5220\u9664\u8282\u70b9 P\nn1->left = n2;\n
    binary_tree.kt
    val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 P\nn1.left = P\nP.left = n2\n// \u5220\u9664\u8282\u70b9 P\nn1.left = n2\n
    binary_tree.rb
    # \u63d2\u5165\u4e0e\u5220\u9664\u8282\u70b9\n_p = TreeNode.new(0)\n# \u5728 n1 -> n2 \u4e2d\u95f4\u63d2\u5165\u8282\u70b9 _p\nn1.left = _p\n_p.left = n2\n# \u5220\u9664\u8282\u70b9\nn1.left = n2\n
    binary_tree.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Tip

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u8282\u70b9\u53ef\u80fd\u4f1a\u6539\u53d8\u4e8c\u53c9\u6811\u7684\u539f\u6709\u903b\u8f91\u7ed3\u6784\uff0c\u800c\u5220\u9664\u8282\u70b9\u901a\u5e38\u610f\u5473\u7740\u5220\u9664\u8be5\u8282\u70b9\u53ca\u5176\u6240\u6709\u5b50\u6811\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u53c9\u6811\u4e2d\uff0c\u63d2\u5165\u4e0e\u5220\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5b9e\u73b0\u6709\u5b9e\u9645\u610f\u4e49\u7684\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u89c1\u4e8c\u53c9\u6811\u7c7b\u578b","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\uff08perfect binary tree\uff09\u6240\u6709\u5c42\u7684\u8282\u70b9\u90fd\u88ab\u5b8c\u5168\u586b\u6ee1\u3002\u5728\u5b8c\u7f8e\u4e8c\u53c9\u6811\u4e2d\uff0c\u53f6\u8282\u70b9\u7684\u5ea6\u4e3a \\(0\\) \uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u7684\u5ea6\u90fd\u4e3a \\(2\\) \uff1b\u82e5\u6811\u7684\u9ad8\u5ea6\u4e3a \\(h\\) \uff0c\u5219\u8282\u70b9\u603b\u6570\u4e3a \\(2^{h+1} - 1\\) \uff0c\u5448\u73b0\u6807\u51c6\u7684\u6307\u6570\u7ea7\u5173\u7cfb\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u89c1\u7684\u7ec6\u80de\u5206\u88c2\u73b0\u8c61\u3002

    Tip

    \u8bf7\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u533a\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u5e38\u88ab\u79f0\u4e3a\u6ee1\u4e8c\u53c9\u6811\u3002

    \u56fe 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u53c9\u6811\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c42\u7684\u8282\u70b9\u672a\u88ab\u586b\u6ee1\uff0c\u4e14\u6700\u5e95\u5c42\u8282\u70b9\u5c3d\u91cf\u9760\u5de6\u586b\u5145\u3002

    \u56fe 7-5 \u00a0 \u5b8c\u5168\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-6 \u6240\u793a\uff0c\u5b8c\u6ee1\u4e8c\u53c9\u6811\uff08full binary tree\uff09\u9664\u4e86\u53f6\u8282\u70b9\u4e4b\u5916\uff0c\u5176\u4f59\u6240\u6709\u8282\u70b9\u90fd\u6709\u4e24\u4e2a\u5b50\u8282\u70b9\u3002

    \u56fe 7-6 \u00a0 \u5b8c\u6ee1\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811","text":"

    \u5982\u56fe 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u53c9\u6811\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u8282\u70b9\u7684\u5de6\u5b50\u6811\u548c\u53f3\u5b50\u6811\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7edd\u5bf9\u503c\u4e0d\u8d85\u8fc7 1 \u3002

    \u56fe 7-7 \u00a0 \u5e73\u8861\u4e8c\u53c9\u6811

    "},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u53c9\u6811\u7684\u9000\u5316","text":"

    \u56fe 7-8 \u5c55\u793a\u4e86\u4e8c\u53c9\u6811\u7684\u7406\u60f3\u7ed3\u6784\u4e0e\u9000\u5316\u7ed3\u6784\u3002\u5f53\u4e8c\u53c9\u6811\u7684\u6bcf\u5c42\u8282\u70b9\u90fd\u88ab\u586b\u6ee1\u65f6\uff0c\u8fbe\u5230\u201c\u5b8c\u7f8e\u4e8c\u53c9\u6811\u201d\uff1b\u800c\u5f53\u6240\u6709\u8282\u70b9\u90fd\u504f\u5411\u4e00\u4fa7\u65f6\uff0c\u4e8c\u53c9\u6811\u9000\u5316\u4e3a\u201c\u94fe\u8868\u201d\u3002

    • \u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u7406\u60f3\u60c5\u51b5\uff0c\u53ef\u4ee5\u5145\u5206\u53d1\u6325\u4e8c\u53c9\u6811\u201c\u5206\u6cbb\u201d\u7684\u4f18\u52bf\u3002
    • \u94fe\u8868\u5219\u662f\u53e6\u4e00\u4e2a\u6781\u7aef\uff0c\u5404\u9879\u64cd\u4f5c\u90fd\u53d8\u4e3a\u7ebf\u6027\u64cd\u4f5c\uff0c\u65f6\u95f4\u590d\u6742\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u56fe 7-8 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

    \u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7ed3\u6784\u548c\u6700\u5dee\u7ed3\u6784\u4e0b\uff0c\u4e8c\u53c9\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf\u3001\u8282\u70b9\u603b\u6570\u3001\u9ad8\u5ea6\u7b49\u8fbe\u5230\u6781\u5927\u503c\u6216\u6781\u5c0f\u503c\u3002

    \u8868 7-1 \u00a0 \u4e8c\u53c9\u6811\u7684\u6700\u4f73\u7ed3\u6784\u4e0e\u6700\u5dee\u7ed3\u6784

    \u5b8c\u7f8e\u4e8c\u53c9\u6811 \u94fe\u8868 \u7b2c \\(i\\) \u5c42\u7684\u8282\u70b9\u6570\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u53f6\u8282\u70b9\u6570\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u4e3a \\(h\\) \u7684\u6811\u7684\u8282\u70b9\u603b\u6570 \\(2^{h+1} - 1\\) \\(h + 1\\) \u8282\u70b9\u603b\u6570\u4e3a \\(n\\) \u7684\u6811\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u53c9\u6811\u904d\u5386","text":"

    \u4ece\u7269\u7406\u7ed3\u6784\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u6811\u662f\u4e00\u79cd\u57fa\u4e8e\u94fe\u8868\u7684\u6570\u636e\u7ed3\u6784\uff0c\u56e0\u6b64\u5176\u904d\u5386\u65b9\u5f0f\u662f\u901a\u8fc7\u6307\u9488\u9010\u4e2a\u8bbf\u95ee\u8282\u70b9\u3002\u7136\u800c\uff0c\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u8fd9\u4f7f\u5f97\u904d\u5386\u6811\u6bd4\u904d\u5386\u94fe\u8868\u66f4\u52a0\u590d\u6742\uff0c\u9700\u8981\u501f\u52a9\u641c\u7d22\u7b97\u6cd5\u6765\u5b9e\u73b0\u3002

    \u4e8c\u53c9\u6811\u5e38\u89c1\u7684\u904d\u5386\u65b9\u5f0f\u5305\u62ec\u5c42\u5e8f\u904d\u5386\u3001\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u7b49\u3002

    "},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c42\u5e8f\u904d\u5386","text":"

    \u5982\u56fe 7-9 \u6240\u793a\uff0c\u5c42\u5e8f\u904d\u5386\uff08level-order traversal\uff09\u4ece\u9876\u90e8\u5230\u5e95\u90e8\u9010\u5c42\u904d\u5386\u4e8c\u53c9\u6811\uff0c\u5e76\u5728\u6bcf\u4e00\u5c42\u6309\u7167\u4ece\u5de6\u5230\u53f3\u7684\u987a\u5e8f\u8bbf\u95ee\u8282\u70b9\u3002

    \u5c42\u5e8f\u904d\u5386\u672c\u8d28\u4e0a\u5c5e\u4e8e\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\uff08breadth-first traversal\uff09\uff0c\u4e5f\u79f0\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\u3002

    \u56fe 7-9 \u00a0 \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386

    "},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u901a\u5e38\u501f\u52a9\u201c\u961f\u5217\u201d\u6765\u5b9e\u73b0\u3002\u961f\u5217\u9075\u5faa\u201c\u5148\u8fdb\u5148\u51fa\u201d\u7684\u89c4\u5219\uff0c\u800c\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5219\u9075\u5faa\u201c\u9010\u5c42\u63a8\u8fdb\u201d\u7684\u89c4\u5219\uff0c\u4e24\u8005\u80cc\u540e\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
    def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c42\u5e8f\u904d\u5386\"\"\"\n    # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u961f\u5217\u51fa\u961f\n        res.append(node.val)  # \u4fdd\u5b58\u8282\u70b9\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    return res\n
    binary_tree_bfs.cpp
    /* \u5c42\u5e8f\u904d\u5386 */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u961f\u5217\u51fa\u961f\n        vec.push_back(node->val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return vec;\n}\n
    binary_tree_bfs.java
    /* \u5c42\u5e8f\u904d\u5386 */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u961f\u5217\u51fa\u961f\n        list.add(node.val);           // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
    binary_tree_bfs.cs
    /* \u5c42\u5e8f\u904d\u5386 */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u961f\u5217\u51fa\u961f\n        list.Add(node.val!.Value);       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
    binary_tree_bfs.go
    /* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5207\u7247\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u961f\u5217\u51fa\u961f\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
    binary_tree_bfs.swift
    /* \u5c42\u5e8f\u904d\u5386 */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u961f\u5217\u51fa\u961f\n        list.append(node.val) // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list\n}\n
    binary_tree_bfs.js
    /* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list;\n}\n
    binary_tree_bfs.ts
    /* \u5c42\u5e8f\u904d\u5386 */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u961f\u5217\u51fa\u961f\n        list.push(node.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }\n    }\n    return list;\n}\n
    binary_tree_bfs.dart
    /* \u5c42\u5e8f\u904d\u5386 */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u961f\u5217\u51fa\u961f\n    res.add(node!.val); // \u4fdd\u5b58\u8282\u70b9\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  }\n  return res;\n}\n
    binary_tree_bfs.rs
    /* \u5c42\u5e8f\u904d\u5386 */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u961f\u5217\u51fa\u961f\n        vec.push(node.borrow().val); // \u4fdd\u5b58\u8282\u70b9\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        };\n    }\n    vec\n}\n
    binary_tree_bfs.c
    /* \u5c42\u5e8f\u904d\u5386 */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f85\u52a9\u961f\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f85\u52a9\u961f\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u961f\u5217\u6307\u9488\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u8282\u70b9\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    /* \u8f85\u52a9\u6570\u7ec4 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u6570\u7ec4\u6307\u9488\n    index = 0;\n    while (front < rear) {\n        // \u961f\u5217\u51fa\u961f\n        node = queue[front++];\n        // \u4fdd\u5b58\u8282\u70b9\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u6570\u7ec4\u957f\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91ca\u653e\u8f85\u52a9\u6570\u7ec4\u7a7a\u95f4\n    free(queue);\n    return arr;\n}\n
    binary_tree_bfs.kt
    /* \u5c42\u5e8f\u904d\u5386 */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u961f\u5217\u51fa\u961f\n        list.add(node?._val!!)       // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n    }\n    return list\n}\n
    binary_tree_bfs.rb
    ### \u5c42\u5e8f\u904d\u5386 ###\ndef level_order(root)\n  # \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n  queue = [root]\n  # \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u961f\u5217\u51fa\u961f\n    res << node.val # \u4fdd\u5b58\u8282\u70b9\u503c\n    queue << node.left unless node.left.nil? # \u5de6\u5b50\u8282\u70b9\u5165\u961f\n    queue << node.right unless node.right.nil? # \u53f3\u5b50\u8282\u70b9\u5165\u961f\n  end\n  res\nend\n
    binary_tree_bfs.zig
    // \u5c42\u5e8f\u904d\u5386\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u961f\u5217\uff0c\u52a0\u5165\u6839\u8282\u70b9\n    const L = std.TailQueue(*inc.TreeNode(T));\n    var queue = L{};\n    var root_node = try mem_allocator.create(L.Node);\n    root_node.data = root;\n    queue.append(root_node); \n    // \u521d\u59cb\u5316\u4e00\u4e2a\u5217\u8868\uff0c\u7528\u4e8e\u4fdd\u5b58\u904d\u5386\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u961f\u5217\u51fa\u961f\n        var node = queue_node.data;\n        try list.append(node.val);              // \u4fdd\u5b58\u8282\u70b9\u503c\n        if (node.left != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.left.?;\n            queue.append(tmp_node);             // \u5de6\u5b50\u8282\u70b9\u5165\u961f\n        }\n        if (node.right != null) {\n            var tmp_node = try mem_allocator.create(L.Node);\n            tmp_node.data = node.right.?;\n            queue.append(tmp_node);             // \u53f3\u5b50\u8282\u70b9\u5165\u961f\n        }        \n    }\n    return list;\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    "},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\uff0c\u5176\u4e2d \\(n\\) \u4e3a\u8282\u70b9\u6570\u91cf\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6ee1\u4e8c\u53c9\u6811\u65f6\uff0c\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u6700\u591a\u540c\u65f6\u5b58\u5728 \\((n + 1) / 2\\) \u4e2a\u8282\u70b9\uff0c\u5360\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002
    "},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386","text":"

    \u76f8\u5e94\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u540e\u5e8f\u904d\u5386\u90fd\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u904d\u5386\uff08depth-first traversal\uff09\uff0c\u4e5f\u79f0\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff08depth-first search, DFS\uff09\uff0c\u5b83\u4f53\u73b0\u4e86\u4e00\u79cd\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\u3002

    \u56fe 7-10 \u5c55\u793a\u4e86\u5bf9\u4e8c\u53c9\u6811\u8fdb\u884c\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u4f18\u5148\u904d\u5386\u5c31\u50cf\u662f\u7ed5\u7740\u6574\u68f5\u4e8c\u53c9\u6811\u7684\u5916\u56f4\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u4e2a\u8282\u70b9\u90fd\u4f1a\u9047\u5230\u4e09\u4e2a\u4f4d\u7f6e\uff0c\u5206\u522b\u5bf9\u5e94\u524d\u5e8f\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\u3002

    \u56fe 7-10 \u00a0 \u4e8c\u53c9\u641c\u7d22\u6811\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386

    "},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u4ee3\u7801\u5b9e\u73b0","text":"

    \u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u901a\u5e38\u57fa\u4e8e\u9012\u5f52\u5b9e\u73b0\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
    def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u4e2d\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u540e\u5e8f\u904d\u5386\"\"\"\n    if root is None:\n        return\n    # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
    binary_tree_dfs.cpp
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
    binary_tree_dfs.java
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
    binary_tree_dfs.cs
    /* \u524d\u5e8f\u904d\u5386 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
    binary_tree_dfs.go
    /* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
    binary_tree_dfs.swift
    /* \u524d\u5e8f\u904d\u5386 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
    binary_tree_dfs.js
    /* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.ts
    /* \u524d\u5e8f\u904d\u5386 */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.dart
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
    binary_tree_dfs.rs
    /* \u524d\u5e8f\u904d\u5386 */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n        result.push(node.borrow().val);\n        result.extend(pre_order(node.borrow().left.as_ref()));\n        result.extend(pre_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n        result.extend(in_order(node.borrow().left.as_ref()));\n        result.push(node.borrow().val);\n        result.extend(in_order(node.borrow().right.as_ref()));\n    }\n    result\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n        result.extend(post_order(node.borrow().left.as_ref()));\n        result.extend(post_order(node.borrow().right.as_ref()));\n        result.push(node.borrow().val);\n    }\n    result\n}\n
    binary_tree_dfs.c
    /* \u524d\u5e8f\u904d\u5386 */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
    binary_tree_dfs.kt
    /* \u524d\u5e8f\u904d\u5386 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u904d\u5386 */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u540e\u5e8f\u904d\u5386 */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
    binary_tree_dfs.rb
    ### \u524d\u5e8f\u904d\u5386 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n### \u4e2d\u5e8f\u904d\u5386 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n### \u540e\u5e8f\u904d\u5386 ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
    binary_tree_dfs.zig
    // \u524d\u5e8f\u904d\u5386\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u6839\u8282\u70b9 -> \u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u904d\u5386\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u6839\u8282\u70b9 -> \u53f3\u5b50\u6811\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u540e\u5e8f\u904d\u5386\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8bbf\u95ee\u4f18\u5148\u7ea7\uff1a\u5de6\u5b50\u6811 -> \u53f3\u5b50\u6811 -> \u6839\u8282\u70b9\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Tip

    \u6df1\u5ea6\u4f18\u5148\u641c\u7d22\u4e5f\u53ef\u4ee5\u57fa\u4e8e\u8fed\u4ee3\u5b9e\u73b0\uff0c\u6709\u5174\u8da3\u7684\u8bfb\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

    \u56fe 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u904d\u5386\u4e8c\u53c9\u6811\u7684\u9012\u5f52\u8fc7\u7a0b\uff0c\u5176\u53ef\u5206\u4e3a\u201c\u9012\u201d\u548c\u201c\u5f52\u201d\u4e24\u4e2a\u9006\u5411\u7684\u90e8\u5206\u3002

    1. \u201c\u9012\u201d\u8868\u793a\u5f00\u542f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5e8f\u5728\u6b64\u8fc7\u7a0b\u4e2d\u8bbf\u95ee\u4e0b\u4e00\u4e2a\u8282\u70b9\u3002
    2. \u201c\u5f52\u201d\u8868\u793a\u51fd\u6570\u8fd4\u56de\uff0c\u4ee3\u8868\u5f53\u524d\u8282\u70b9\u5df2\u7ecf\u8bbf\u95ee\u5b8c\u6bd5\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u56fe 7-11 \u00a0 \u524d\u5e8f\u904d\u5386\u7684\u9012\u5f52\u8fc7\u7a0b

    "},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u590d\u6742\u5ea6\u5206\u6790","text":"
    • \u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u6240\u6709\u8282\u70b9\u88ab\u8bbf\u95ee\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u65f6\u95f4\u3002
    • \u7a7a\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u51b5\u4e0b\uff0c\u5373\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u9012\u5f52\u6df1\u5ea6\u8fbe\u5230 \\(n\\) \uff0c\u7cfb\u7edf\u5360\u7528 \\(O(n)\\) \u6808\u5e27\u7a7a\u95f4\u3002
    "},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7ed3","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u70b9\u56de\u987e","text":"
    • \u4e8c\u53c9\u6811\u662f\u4e00\u79cd\u975e\u7ebf\u6027\u6570\u636e\u7ed3\u6784\uff0c\u4f53\u73b0\u201c\u4e00\u5206\u4e3a\u4e8c\u201d\u7684\u5206\u6cbb\u903b\u8f91\u3002\u6bcf\u4e2a\u4e8c\u53c9\u6811\u8282\u70b9\u5305\u542b\u4e00\u4e2a\u503c\u4ee5\u53ca\u4e24\u4e2a\u6307\u9488\uff0c\u5206\u522b\u6307\u5411\u5176\u5de6\u5b50\u8282\u70b9\u548c\u53f3\u5b50\u8282\u70b9\u3002
    • \u5bf9\u4e8e\u4e8c\u53c9\u6811\u4e2d\u7684\u67d0\u4e2a\u8282\u70b9\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u8282\u70b9\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6811\u88ab\u79f0\u4e3a\u8be5\u8282\u70b9\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6811\u3002
    • \u4e8c\u53c9\u6811\u7684\u76f8\u5173\u672f\u8bed\u5305\u62ec\u6839\u8282\u70b9\u3001\u53f6\u8282\u70b9\u3001\u5c42\u3001\u5ea6\u3001\u8fb9\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
    • \u4e8c\u53c9\u6811\u7684\u521d\u59cb\u5316\u3001\u8282\u70b9\u63d2\u5165\u548c\u8282\u70b9\u5220\u9664\u64cd\u4f5c\u4e0e\u94fe\u8868\u64cd\u4f5c\u65b9\u6cd5\u7c7b\u4f3c\u3002
    • \u5e38\u89c1\u7684\u4e8c\u53c9\u6811\u7c7b\u578b\u6709\u5b8c\u7f8e\u4e8c\u53c9\u6811\u3001\u5b8c\u5168\u4e8c\u53c9\u6811\u3001\u5b8c\u6ee1\u4e8c\u53c9\u6811\u548c\u5e73\u8861\u4e8c\u53c9\u6811\u3002\u5b8c\u7f8e\u4e8c\u53c9\u6811\u662f\u6700\u7406\u60f3\u7684\u72b6\u6001\uff0c\u800c\u94fe\u8868\u662f\u9000\u5316\u540e\u7684\u6700\u5dee\u72b6\u6001\u3002
    • \u4e8c\u53c9\u6811\u53ef\u4ee5\u7528\u6570\u7ec4\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c06\u8282\u70b9\u503c\u548c\u7a7a\u4f4d\u6309\u5c42\u5e8f\u904d\u5386\u987a\u5e8f\u6392\u5217\uff0c\u5e76\u6839\u636e\u7236\u8282\u70b9\u4e0e\u5b50\u8282\u70b9\u4e4b\u95f4\u7684\u7d22\u5f15\u6620\u5c04\u5173\u7cfb\u6765\u5b9e\u73b0\u6307\u9488\u3002
    • \u4e8c\u53c9\u6811\u7684\u5c42\u5e8f\u904d\u5386\u662f\u4e00\u79cd\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\u65b9\u6cd5\uff0c\u5b83\u4f53\u73b0\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u6269\u5c55\u201d\u7684\u9010\u5c42\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u901a\u8fc7\u961f\u5217\u6765\u5b9e\u73b0\u3002
    • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u7686\u5c5e\u4e8e\u6df1\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u5b83\u4eec\u4f53\u73b0\u4e86\u201c\u5148\u8d70\u5230\u5c3d\u5934\uff0c\u518d\u56de\u6eaf\u7ee7\u7eed\u201d\u7684\u904d\u5386\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u9012\u5f52\u6765\u5b9e\u73b0\u3002
    • \u4e8c\u53c9\u641c\u7d22\u6811\u662f\u4e00\u79cd\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u627e\u6570\u636e\u7ed3\u6784\uff0c\u5176\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u5747\u4e3a \\(O(\\log n)\\) \u3002\u5f53\u4e8c\u53c9\u641c\u7d22\u6811\u9000\u5316\u4e3a\u94fe\u8868\u65f6\uff0c\u5404\u9879\u65f6\u95f4\u590d\u6742\u5ea6\u4f1a\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • AVL \u6811\uff0c\u4e5f\u79f0\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff0c\u5b83\u901a\u8fc7\u65cb\u8f6c\u64cd\u4f5c\u786e\u4fdd\u5728\u4e0d\u65ad\u63d2\u5165\u548c\u5220\u9664\u8282\u70b9\u540e\u6811\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
    • AVL \u6811\u7684\u65cb\u8f6c\u64cd\u4f5c\u5305\u62ec\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u518d\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u518d\u53f3\u65cb\u3002\u5728\u63d2\u5165\u6216\u5220\u9664\u8282\u70b9\u540e\uff0cAVL \u6811\u4f1a\u4ece\u5e95\u5411\u9876\u6267\u884c\u65cb\u8f6c\u64cd\u4f5c\uff0c\u4f7f\u6811\u91cd\u65b0\u6062\u590d\u5e73\u8861\u3002
    "},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u5bf9\u4e8e\u53ea\u6709\u4e00\u4e2a\u8282\u70b9\u7684\u4e8c\u53c9\u6811\uff0c\u6811\u7684\u9ad8\u5ea6\u548c\u6839\u8282\u70b9\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u5417\uff1f

    \u662f\u7684\uff0c\u56e0\u4e3a\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u4e49\u4e3a\u201c\u7ecf\u8fc7\u7684\u8fb9\u7684\u6570\u91cf\u201d\u3002

    Q\uff1a\u4e8c\u53c9\u6811\u4e2d\u7684\u63d2\u5165\u4e0e\u5220\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u8fd9\u91cc\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u4e48\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u4e3a\u8d44\u6e90\u7684\u5b50\u8282\u70b9\u7684\u8d44\u6e90\u91ca\u653e\u5417\uff1f

    \u62ff\u4e8c\u53c9\u641c\u7d22\u6811\u6765\u4e3e\u4f8b\uff0c\u5220\u9664\u8282\u70b9\u64cd\u4f5c\u8981\u5206\u4e09\u79cd\u60c5\u51b5\u5904\u7406\uff0c\u5176\u4e2d\u6bcf\u79cd\u60c5\u51b5\u90fd\u9700\u8981\u8fdb\u884c\u591a\u4e2a\u6b65\u9aa4\u7684\u8282\u70b9\u64cd\u4f5c\u3002

    Q\uff1a\u4e3a\u4ec0\u4e48 DFS \u904d\u5386\u4e8c\u53c9\u6811\u6709\u524d\u3001\u4e2d\u3001\u540e\u4e09\u79cd\u987a\u5e8f\uff0c\u5206\u522b\u6709\u4ec0\u4e48\u7528\u5462\uff1f

    \u4e0e\u987a\u5e8f\u548c\u9006\u5e8f\u904d\u5386\u6570\u7ec4\u7c7b\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u540e\u5e8f\u904d\u5386\u662f\u4e09\u79cd\u4e8c\u53c9\u6811\u904d\u5386\u65b9\u6cd5\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5b83\u4eec\u5f97\u5230\u4e00\u4e2a\u7279\u5b9a\u987a\u5e8f\u7684\u904d\u5386\u7ed3\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4e2d\uff0c\u7531\u4e8e\u8282\u70b9\u5927\u5c0f\u6ee1\u8db3 \u5de6\u5b50\u8282\u70b9\u503c < \u6839\u8282\u70b9\u503c < \u53f3\u5b50\u8282\u70b9\u503c \uff0c\u56e0\u6b64\u6211\u4eec\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u4f18\u5148\u7ea7\u904d\u5386\u6811\uff0c\u5c31\u53ef\u4ee5\u83b7\u5f97\u6709\u5e8f\u7684\u8282\u70b9\u5e8f\u5217\u3002

    Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u5904\u7406\u5931\u8861\u8282\u70b9 node\u3001child\u3001grand_child \u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u90a3 node \u7684\u7236\u8282\u70b9\u548c node \u539f\u6765\u7684\u8fde\u63a5\u4e0d\u9700\u8981\u7ef4\u62a4\u5417\uff1f\u53f3\u65cb\u64cd\u4f5c\u540e\u5c82\u4e0d\u662f\u65ad\u6389\u4e86\uff1f

    \u6211\u4eec\u9700\u8981\u4ece\u9012\u5f52\u7684\u89c6\u89d2\u6765\u770b\u8fd9\u4e2a\u95ee\u9898\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u4f20\u5165\u7684\u662f\u5b50\u6811\u7684\u6839\u8282\u70b9\uff0c\u6700\u7ec8 return child \u8fd4\u56de\u65cb\u8f6c\u4e4b\u540e\u7684\u5b50\u6811\u7684\u6839\u8282\u70b9\u3002\u5b50\u6811\u7684\u6839\u8282\u70b9\u548c\u5176\u7236\u8282\u70b9\u7684\u8fde\u63a5\u662f\u5728\u8be5\u51fd\u6570\u8fd4\u56de\u540e\u5b8c\u6210\u7684\uff0c\u4e0d\u5c5e\u4e8e\u53f3\u65cb\u64cd\u4f5c\u7684\u7ef4\u62a4\u8303\u56f4\u3002

    Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u6570\u88ab\u5212\u5206\u5230 private \u548c public \u4e2d\uff0c\u8fd9\u65b9\u9762\u6709\u4ec0\u4e48\u8003\u91cf\u5417\uff1f\u4e3a\u4ec0\u4e48\u8981\u5c06 height() \u51fd\u6570\u548c updateHeight() \u51fd\u6570\u5206\u522b\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

    \u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u8303\u56f4\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u7c7b\u5185\u90e8\u4f7f\u7528\uff0c\u90a3\u4e48\u5c31\u8bbe\u8ba1\u4e3a private \u3002\u4f8b\u5982\uff0c\u7528\u6237\u5355\u72ec\u8c03\u7528 updateHeight() \u662f\u6ca1\u6709\u610f\u4e49\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u5220\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8bbf\u95ee\u8282\u70b9\u9ad8\u5ea6\uff0c\u7c7b\u4f3c\u4e8e vector.size() \uff0c\u56e0\u6b64\u8bbe\u7f6e\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

    Q\uff1a\u5982\u4f55\u4ece\u4e00\u7ec4\u8f93\u5165\u6570\u636e\u6784\u5efa\u4e00\u68f5\u4e8c\u53c9\u641c\u7d22\u6811\uff1f\u6839\u8282\u70b9\u7684\u9009\u62e9\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

    \u662f\u7684\uff0c\u6784\u5efa\u6811\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u53c9\u641c\u7d22\u6811\u4ee3\u7801\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7ed9\u51fa\u3002\u81f3\u4e8e\u6839\u8282\u70b9\u7684\u9009\u62e9\uff0c\u6211\u4eec\u901a\u5e38\u4f1a\u5c06\u8f93\u5165\u6570\u636e\u6392\u5e8f\uff0c\u7136\u540e\u5c06\u4e2d\u70b9\u5143\u7d20\u4f5c\u4e3a\u6839\u8282\u70b9\uff0c\u518d\u9012\u5f52\u5730\u6784\u5efa\u5de6\u53f3\u5b50\u6811\u3002\u8fd9\u6837\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8bc1\u6811\u7684\u5e73\u8861\u6027\u3002

    Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u7b26\u4e32\u5bf9\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

    \u5728 Java \u4e2d\uff0c\u5bf9\u4e8e\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff0c== \u7528\u4e8e\u5bf9\u6bd4\u4e24\u4e2a\u53d8\u91cf\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5bf9\u4e8e\u5f15\u7528\u7c7b\u578b\uff0c\u4e24\u79cd\u7b26\u53f7\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

    • == \uff1a\u7528\u6765\u6bd4\u8f83\u4e24\u4e2a\u53d8\u91cf\u662f\u5426\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5373\u5b83\u4eec\u5728\u5185\u5b58\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
    • equals()\uff1a\u7528\u6765\u5bf9\u6bd4\u4e24\u4e2a\u5bf9\u8c61\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

    \u56e0\u6b64\uff0c\u5982\u679c\u8981\u5bf9\u6bd4\u503c\uff0c\u6211\u4eec\u5e94\u8be5\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u901a\u8fc7 String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u7b26\u4e32\u90fd\u5b58\u50a8\u5728\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u4e2d\uff0c\u5b83\u4eec\u6307\u5411\u540c\u4e00\u4e2a\u5bf9\u8c61\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u6765\u6bd4\u8f83\u4e24\u4e2a\u5b57\u7b26\u4e32\u7684\u5185\u5bb9\u3002

    Q\uff1a\u5e7f\u5ea6\u4f18\u5148\u904d\u5386\u5230\u6700\u5e95\u5c42\u4e4b\u524d\uff0c\u961f\u5217\u4e2d\u7684\u8282\u70b9\u6570\u91cf\u662f \\(2^h\\) \u5417\uff1f

    \u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6ee1\u4e8c\u53c9\u6811\uff0c\u5176\u8282\u70b9\u603b\u6570 \\(n = 7\\) \uff0c\u5219\u5e95\u5c42\u8282\u70b9\u6570\u91cf \\(4 = 2^h = (n + 1) / 2\\) \u3002

    "}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index aa78a2c07493f991b3076aeb0ec127ff9fa62ac3..6d79a06cd33490557e5caea97d3936ea4dfa4c5b 100644 GIT binary patch delta 15 Wcmey&{+XRkzMF%Can44zx6A-3@dWt* delta 15 Wcmey&{+XRkzMF$%UFb%(x6A-6oCRM1 diff --git a/zh-hant/index.html b/zh-hant/index.html index dbb68d46a..ac1b4a1c3 100644 --- a/zh-hant/index.html +++ b/zh-hant/index.html @@ -513,6 +513,19 @@
    + +